You need to enable JavaScript to run this app. 如何用Python调用Bloomberg API带overrides获取历史数据为DataFrame
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:12:01