pdblp调用彭博接口遇无效ticker报错 如何跳过错误返回含空值DataFrame
pdblp连接彭博获取参考数据时跳过无效标的配置方法
问题场景
使用pdblp库连接彭博获取参考数据时,传入全有效ticker的代码可正常运行,返回结构化DataFrame结果:
import pdblp # 建立彭博连接 con = pdblp.BCon() con.start() ticker = ['gbpeur curncy', 'usdeur curncy'] # ticker = ['gbpeur curncy', 'usdeur curncy', 'somejunk curncy'] <-- 加入无效标的测试 field = ['Ticker', 'px_last'] df = con.ref(ticker, field) print(df)
全有效ticker场景下返回结果如下:
ticker field value 0 gbpeur curncy Ticker GBPEUR 1 gbpeur curncy px_last 1.1698 2 usdeur curncy Ticker USDEUR 3 usdeur curncy px_last 0.9507
当ticker列表中加入不存在的无效标的(如上注释行的somejunk curncy),接口会直接抛出ValueError: Unknow security 'somejunk curncy',导致整个请求中断,无法返回已查询到的有效标的数据。
需求为:跳过无效标的报错不中断请求,最终返回结果保留有效标的的正常数据,无效标的对应字段值填充为None,期望结构如下:
ticker field value 0 gbpeur curncy Ticker GBPEUR 1 gbpeur curncy px_last 1.1698 2 usdeur curncy Ticker USDEUR 3 usdeur curncy px_last 0.9507 4 somejunk curncy Ticker None 5 somejunk curncy px_last None
实现方法
pdblp原生ref方法没有直接的跳过错误+自动填充空值的参数,可通过以下两种方案实现需求:
- 方案1:修改连接初始化参数,关闭证券错误抛出
初始化BCon对象时传入raise_security_errors=False,即可让接口遇到无效标的时不直接中断请求:
注意:该配置下无效标的不会自动填充为None,返回结果中会带有标识为con = pdblp.BCon(raise_security_errors=False) con.start()securityError的异常行,需要自行做数据清洗,将无效标的对应字段的value替换为None,调整为目标长表结构即可。 - 方案2:单标的遍历+异常捕获兜底
不修改全局连接配置,遍历ticker列表逐个发起请求,通过try-except捕获单个标的的报错,对报错标的手动构造值为None的行追加到结果集,逻辑可控性更高:
该方案除了能处理无效标的报错,对单标的字段权限不足、临时请求超时等零散报错也能统一兜底,最终返回结构完全匹配预期。import pandas as pd result_frames = [] for single_ticker in ticker: try: single_res = con.ref(single_ticker, field) result_frames.append(single_res) except ValueError: # 捕获无效标的报错,手动构造空值行 for single_field in field: error_row = pd.DataFrame({ 'ticker': [single_ticker], 'field': [single_field], 'value': [None] }) result_frames.append(error_row) final_df = pd.concat(result_frames, ignore_index=True)
内容的提问来源于stack exchange,提问作者darren
相关产品推荐
相关产品推荐

