问题描述
/
解决方案
在 ptrade 量化交易平台中,使用 get_history 获取前一分钟价格时出现“偶发性无数据(返回为空)”的情况,通常由以下几个原因导致:
1. 多线程并发调用冲突(最常见原因)
根据 ptrade API 文档的特别提示:get_history 接口与 get_price 接口不支持多线程同时调用。
如果你在策略中使用了 run_daily 或 run_interval 等定时任务函数,并且这些函数与框架的主循环函数(如 handle_data 或 tick_data)在同一时刻都调用了 get_history 或 get_price 接口,就会产生底层数据请求冲突,从而偶现获取数据为空的现象。
解决办法:
- 错开调用时间:检查策略逻辑,确保
run_interval或run_daily的触发时间不要与handle_data(每分钟/每天触发)完全重合。 - 集中获取数据:尽量在
handle_data中统一获取所需数据,然后通过全局变量g传递给其他函数使用,避免在多个地方同时发起历史数据请求。
2. 标的在当前分钟无成交或停牌
如果某只股票在特定的一分钟内没有任何交易(流动性差),或者处于停牌状态,交易所不会生成该分钟的标准 K 线数据。
解决办法:
- 利用
get_history的fill参数。默认情况下fill='nan',获取不到数据时会用 NaN 填充。你可以将其设置为fill='pre',这样当某一时刻获取不到分钟数据时,系统会自动用上一分钟的数据进行填充。# 使用 fill='pre' 填充缺失的分钟数据 df = get_history(count=2, frequency='1m', field='close', security_list='600570.SS', fill='pre')
3. 接口调用频率限制或网络延迟
虽然 get_history 获取的是本地/缓存数据,但在某些极端情况下(如瞬间请求大量股票的超长历史数据),可能会因为系统处理不过来而返回空值。
解决办法:
- 增加异常保护机制:在策略中获取数据后,务必先判断返回值是否为
None或空 DataFrame,再进行后续计算。history_data = get_history(5, '1m', 'close', '600570.SS') if history_data is not None and not history_data.empty: # 执行策略逻辑 pass else: log.warning("获取历史数据失败,跳过本轮计算")
总结
遇到 get_history 偶发无数据,首先排查是否在 run_interval 和 handle_data 中同时调用了该接口。其次,检查是否是冷门股无成交导致,并合理使用 fill='pre' 参数和 try-except 异常处理来增强策略的健壮性。