3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,使用 get_history 获取前一分钟价格时出现“偶发性无数据(返回为空)”的情况,通常由以下几个原因导致:
根据 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 传递给其他函数使用,避免在多个地方同时发起历史数据请求。如果某只股票在特定的一分钟内没有任何交易(流动性差),或者处于停牌状态,交易所不会生成该分钟的标准 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')
虽然 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 异常处理来增强策略的健壮性。