问题描述
设置count=10获取10条K线数据,但实际返回的数据少于10条是什么原因?
解决方案
在 ptrade 量化平台中使用 get_history 函数时,如果设置了 count=10 但实际返回的数据少于 10 条,通常是由以下几个原因导致的:
1. 标的上市时间不足
如果查询的股票(或可转债、基金等)上市时间较短,距离当前查询时间不足 10 个交易日(或对应的 K 线周期),系统只能返回自上市以来的所有数据。例如,某只新股刚上市 5 天,设置 count=10 也只能获取到 5 条日线数据。
2. 多线程并发调用导致数据异常
根据 ptrade API 文档的特别提示:get_history 接口与 get_price 接口不支持多线程同时调用。如果在 run_daily 或 run_interval 等定时任务函数中,与 handle_data 等框架模块在同一时刻并发调用了 get_history 或 get_price 接口,会偶现获取数据为空或数据量不全的现象。建议错开调用时间或增加保护机制。
3. 停牌数据的二次过滤
ptrade 官方对于停牌的处理逻辑是:不跳过停牌日期,时间轴保持连续,停牌日使用前一交易日的数据填充,且成交量(volume)为 0。如果 get_history 本身返回了 10 条数据,但您的策略代码中包含了类似 df[df['volume'] > 0] 的过滤逻辑来剔除停牌日,那么最终您看到的数据就会少于 10 条。
4. 历史数据范围限制
ptrade 的 get_history 接口只能获取 2005 年之后的数据。如果您在回测较早期的行情,且设定的 count 往前推算跨越了 2005 年 1 月 1 日,那么 2005 年之前的数据将无法获取,导致返回条数不足。
排查建议:
- 检查标的上市日期:使用
get_stock_info(security)查看listed_date,确认其上市时间是否足够长。 - 检查并发逻辑:排查策略中是否有多个定时任务在同一时刻请求历史数据。
- 打印原始数据:在不过滤任何条件的情况下,直接
log.info(len(df))查看原始返回的长度,确认是否包含volume=0的停牌数据。