使用BLPInterface调取彭博历史日内tick数据的参数设置问题
解决方案
方案1:修改BLPInterface源码支持日内tick请求
你遇到的问题有两个核心原因:
- Excel BDH的参数
IntrRw是彭博桌面端的别名,底层blpapi的请求字段不直接叫这个名字,且逐笔tick数据对应的请求类型本身就不是HistoricalDataRequest,而是IntradayTickRequest - BLPInterface的
historicalRequest方法仅硬编码处理了日终数据所需的几个核心参数,额外传入的kwargs没有被正确映射到彭博请求对象中
修改步骤:
- 找到BLPInterface中
historicalRequest的实现代码,参照彭博官方API文档,新增intradayTickRequest方法:- 实例化请求时改用
"IntradayTickRequest"类型 - 支持传入
eventTypes参数(指定要拉取bid、ask、trade等事件)、includeConditionCodes等tick专属参数 - 直接处理带时分秒的起止时间即可,不需要额外传类似
IntrRw的参数,IntradayTickRequest默认返回对应时间区间内的所有逐笔数据
- 实例化请求时改用
- 如果你不想新增方法,也可以修改原
historicalRequest的参数处理逻辑,新增分支判断:如果传入的起止时间包含时分秒,自动切换请求类型,同时把你需要的额外参数遍历塞进request对象中,避免出现Sub-element不存在的报错。
方案2:直接调用原生blpapi接口拉取数据
如果你不想修改停更的BLPInterface代码,可以直接用彭博官方的blpapi库实现需求,示例代码如下:
import blpapi import datetime as dt # 初始化会话 sessionOptions = blpapi.SessionOptions() sessionOptions.setServerHost('localhost') sessionOptions.setServerPort(8194) session = blpapi.Session(sessionOptions) session.start() session.openService('//blp/refdata') refDataService = session.getService('//blp/refdata') # 构造日内逐笔tick请求 request = refDataService.createRequest('IntradayTickRequest') request.set('security', 'SPX Index') request.append('eventTypes', 'BID') request.append('eventTypes', 'ASK') request.set('startDateTime', dt.datetime(2021, 9, 17, 16, 29, 0)) request.set('endDateTime', dt.datetime(2021, 9, 17, 16, 31, 0)) # 可选配置:是否包含条件码、是否返回成交量等 request.set('includeConditionCodes', False) request.set('includeSize', True) # 发送请求并处理返回 session.sendRequest(request) data = [] while True: event = session.nextEvent(500) for msg in event: if msg.hasElement('tickData'): tickData = msg.getElement('tickData') tickArray = tickData.getElement('tickData') for i in range(tickArray.numValues()): tick = tickArray.getValueAsElement(i) data.append({ 'time': tick.getElementAsDatetime('time'), 'type': tick.getElementAsString('type'), 'value': tick.getElementAsFloat('value'), 'size': tick.getElementAsInteger('size') }) if event.eventType() == blpapi.Event.RESPONSE: break session.stop() print(data)
原生接口完全支持所有彭博数据请求参数,不需要依赖第三方封装,适配性更强。
内容的提问来源于stack exchange,提问作者user3556757
相关产品推荐
相关产品推荐

