与大多数事情一样,有一个简短的答案和一个长的答案。
这简答是xbbg.bdib()函数目前不处理债券(使用 Corp 或 Govt黄键).它只识别Equity、Comdty、Curncy和Index。 OP 在设置 assets.yml 和 exch.yml 方面做得很好,但是 xbbg 包中的 const.py 中的代码有一个硬编码的黄色键列表和每个的代码/交换逻辑.
因此,解决方法是执行您自己的 Ticker -> Exchange 映射,并将 ref= 参数用于 bdib(),如 OP 所述。 bdib() 函数每次调用只需要一个代码(因此只有一个交换),因此您可以在那里插入自己的逻辑(例如,将 ISIN 的 IT 部分用于 ref='MIL',或使用描述性名称和代码BTPS)。
这长答案//blp/refdata 服务(Bloomberg reference,第 82 页开始)的底层 DAPI IntradayBarRequest 对交换一无所知。它的参数是开始和结束日期时间范围(UTC 时间)。这个范围可以跨越多天(不像 bdib() 只适用于一天)。
xbbg 正试图帮助将本地交易时段转换为这些 UTC 时间,这不是一项微不足道的任务。对于股票、指数、商品和外汇代码来说,这要容易一些,因为它们具有相对可靠的代码结构。考虑到可以识别债券的方式范围(例如 ISIN、Cusip、SEDOL、Bbg ID、Wertpapier Id、{Ticker Coupon Maturity} 等),债券要困难得多,所以 xbbg 回避这个问题也就不足为奇了。
此外,债券不交易所交易因此,债券交易是双边协议(尽管通常两者之间有一个更明确的协议)。比如伦敦的交易商愿意在凌晨2点对BTPS进行报价,那么我们在米兰就可以不管什么时间进行交易。更重要的是,交易商间经纪商 (IDB) 平台(例如意大利纸币的 MTS)仅在特定时间开放,供交易商进行对冲,而在这些时间段之外流动性很差(你有没有试过在 4 天后询问金边债券的价格:伦敦时间下午 15 点?)。
如果你够冒险(并且有一个可靠的算法从证券代码/代码到交易所名称)你可以进入xbbg代码本身并编辑const.py:
具体来说,您需要在ASSET_INFO 字典中添加另一行:
ASSET_INFO = {
'Index': ['tickers'],
'Comdty': ['tickers', 'key_month'],
'Curncy': ['tickers'],
'Equity': ['exch_codes'],
'Govt': ['tickers'],
}
并修改market_info()函数定义。
if (not exch_only) and (t_info[-1] not in ['Equity', 'Comdty', 'Curncy', 'Index','Govt']):
return pd.Series(dtype=object)
这样Govt 代码就不会被丢弃。
然后你可以在assets.yml中输入一个条目,例如:
Govt:
- tickers: [IT0005425233]
exch: MIL
对于每个债券,或设置 tickers:[IT] 并将逻辑放入 market_info 函数中以检测 Govt 代码并搜索 ISIN 的前两个字符。或者使用 BTPS 并仅提供 id 的 ticker-coupon-maturity。
注意事项.这种方法的问题在于,如果您升级xbbg 包,那么您的更改将会丢失!
最后,您仍然可以利用 xbbg 对“为您解决所有令人讨厌的连接问题并以 pandas dfs 的形式检索数据“通过编写您自己的 bdib() 函数版本,并传递您自己的显式开始和结束 UTC 时间......