如何用Python调用Bloomberg API带overrides获取历史数据为DataFrame
彭博BDH函数迁移Python实现方案
你之前调用的blp()方法默认构造的是快照类请求(对应Excel BDP函数,仅返回最新时点数据),要获取全周期历史序列,需要构造对应BDH功能的历史数据请求,以下是两种可直接落地的实现方案:
方案1:使用pdblp库(推荐,最简实现)
pdblp是基于彭博官方blpapi封装的第三方工具库,原生支持直接返回pandas DataFrame格式结果,无需手动解析响应。
- 前置依赖:已安装彭博官方blpapi,本地已登录彭博终端
- 安装命令:
pip install pdblp - 实现代码:
import pdblp # 建立彭博API连接 con = pdblp.BCon(port=8194, timeout=5000) con.start() # 构造BDH请求,参数与Excel函数一一对应 df = con.bdh( securities="AS51 Index", fields="BEST_EPS", start_date="20200720", end_date="20210720", periodicitySelection="WEEKLY", # 对应原参数Days=W(周频) nonTradingDayFillMethod="PREVIOUS_VALUE", # 对应原参数Fill=P(前值填充) overrides={"BEST_FPERIOD_OVERRIDE": "BF"} # 对应覆盖项参数 ) con.stop() print(df)
注意:输入日期需转换为YYYYMMDD格式,如你自定义过彭博API端口,需将port参数改为对应值
方案2:基于原生blpapi手动实现(无第三方依赖)
如果你无法引入pdblp库,可以直接调用彭博官方blpapi构造历史数据请求,手动解析后转DataFrame:
import blpapi import pandas as pd # 初始化API会话 session_opt = blpapi.SessionOptions() session_opt.setServerHost("localhost") session_opt.setServerPort(8194) session = blpapi.Session(session_opt) session.start() session.openService("//blp/refdata") ref_svc = session.getService("//blp/refdata") # 构造历史数据请求 req = ref_svc.createRequest("HistoricalDataRequest") req.append("securities", "AS51 Index") req.append("fields", "BEST_EPS") req.set("startDate", "20200720") req.set("endDate", "20210720") req.set("periodicitySelection", "WEEKLY") req.set("nonTradingDayFillMethod", "PREVIOUS_VALUE") # 添加覆盖参数 overrides = req.getElement("overrides") ovrd = overrides.appendElement() ovrd.setElement("fieldId", "BEST_FPERIOD_OVERRIDE") ovrd.setElement("value", "BF") # 发送请求并解析响应 session.sendRequest(req) data_list = [] while True: event = session.nextEvent(5000) if event.eventType() in (blpapi.Event.RESPONSE, blpapi.Event.PARTIAL_RESPONSE): for msg in event: field_data = msg.getElement("securityData").getElement("fieldData") for idx in range(field_data.numValues()): row = field_data.getValueAsElement(idx) data_list.append({ "date": row.getElementAsDatetime("date"), "BEST_EPS": row.getElementAsFloat("BEST_EPS") }) if event.eventType() == blpapi.Event.RESPONSE: break # 转换为DataFrame df = pd.DataFrame(data_list).set_index("date") session.stop() print(df)
内容的提问来源于stack exchange,提问作者Mudit Mittal
相关产品推荐
相关产品推荐

