如何将Excel BDH公式转换为Python API代码并获取周度数据
将Excel BDH公式转换为Python彭博API代码(获取周度数据)
你需要把Excel中的BDH公式转换为Python彭博API代码,目标是查询特定指数的周度数据,但当前代码仅返回日度数据,希望能像Excel里那样设置查询条件。
Excel中的BDH公式
=@BDH(AAIIBEAR Index,PX_LAST,Start Date,End DAte,"Dir=V","fill=#N/A","Per=W","Days=A","Dts=H","cols=1;rows=1783")
当前Python代码(仅返回日度数据)
import os from blp import blp import pdblp import blpapi import datetime import xlwings import pandas as pd with open(os.path.join(os.getenv("TEMP"), "Bloomberg", "log", "bbcomm.log"),"r") as f: try: port = f.read().split("BLOOMBERG COMMUNICATION SERVER READY on Port: ")[-1].split("\n")[0] except: port = 8194 con = pdblp.BCon(debug = False, port = 8194, timeout = 100000) con.start() today = datetime.datetime.today() #assign tickers bbg = con.bdh(['AAIIBEAR Index','PX_LAST', start_date="20240210",end_date= "20240220") bbg = bbg.resample('D').ffill() print (bbg) #print data to excel with pd.ExcelWriter(r'X:\Public\Employee folders\fvan\Market.xlsx') as writer: bbg.to_excel(writer, sheet_name='data', startcol=1)
解决方案:直接在API查询中设置周度参数
pdblp的bdh方法支持传入BDH公式中的所有参数选项,完全可以像Excel那样直接指定周度规则,无需事后resample。具体修正如下:
- 修复原代码的语法错误:
bdh方法第一个参数是标的列表,第二个是字段列表,原代码把两者混写且括号未闭合 - 添加对应Excel BDH的参数选项,直接指定周度周期
修正后的完整代码
import os import pdblp import datetime import pandas as pd # 获取彭博通信端口 with open(os.path.join(os.getenv("TEMP"), "Bloomberg", "log", "bbcomm.log"),"r") as f: try: port = f.read().split("BLOOMBERG COMMUNICATION SERVER READY on Port: ")[-1].split("\n")[0] port = int(port) except: port = 8194 # 初始化彭博连接 con = pdblp.BCon(debug=False, port=port, timeout=100000) con.start() # 查询周度数据,完全对应Excel BDH的参数设置 bbg = con.bdh( tickers=['AAIIBEAR Index'], fields=['PX_LAST'], start_date="20240210", end_date="20240220", direction="V", # 对应Excel中的Dir=V fill="NA", # 对应Excel中的fill=#N/A periodicity_selection="WEEKLY", # 对应Excel中的Per=W(周度周期) days="ALL_CALENDAR_DAYS", # 对应Excel中的Days=A date_type="HISTORICAL_DATE" # 对应Excel中的Dts=H ) # 输出结果并写入Excel print(bbg) with pd.ExcelWriter(r'X:\Public\Employee folders\fvan\Market.xlsx') as writer: bbg.to_excel(writer, sheet_name='data', startcol=1) # 关闭连接 con.stop()
关键说明
- 直接通过API参数指定周度周期,比事后用
resample处理更准确,因为返回的是彭博官方计算的周度数据 - 原代码中的
resample('D').ffill()是日度填充逻辑,现在可以直接移除 - 确保pdblp版本为最新,部分参数需要新版本支持
内容的提问来源于stack exchange,提问作者fiona van der steur
相关产品推荐
相关产品推荐

