问题描述
/
解决方案
在 ptrade 量化交易平台中,使用 get_history 或 get_price 接口获取多只股票的历史行情数据时,如果返回空的 DataFrame,通常是由以下几个常见原因导致的。请对照检查您的策略代码:
1. 多线程同时调用导致冲突(最常见原因)
根据 ptrade API 文档的特别提示:get_history 接口与 get_price 接口不支持多线程同时调用。如果您在 run_daily 或 run_interval 等定时任务函数中,与 handle_data 等框架模块在同一时刻调用了 get_history 或 get_price 接口,会偶现获取数据为空的现象。
解决方案:
避免在同一时间点并发请求历史数据。可以通过调整 run_daily 的触发时间,或者在逻辑中加入状态锁,确保同一时刻只有一个函数在请求历史数据。
2. security_list 参数格式错误
在获取多只股票数据时,参数的类型非常重要:
- 获取单只股票:必须传入字符串类型,例如
security_list='600570.SS'。 - 获取多只股票:必须传入列表(list)类型,例如
security_list=['600570.SS', '000001.SZ']。即使列表中只有一只股票(如['600570.SS']),系统也会按照多股票的逻辑返回数据结构。
解决方案:
检查您传入的股票代码变量是否为正确的 list 类型。
3. 股票代码后缀不规范
ptrade 要求的股票代码必须带有正确的市场尾缀:
- 上海市场:
.SS或.XSHG(如600570.SS) - 深圳市场:
.SZ或.XSHE(如000001.SZ)
解决方案:
确保传入的股票代码列表中的所有代码都带有正确的后缀。
4. 查询的时间范围内无数据
- 停牌或未上市:如果查询的时间段内股票处于停牌状态,或者尚未上市,可能会导致数据缺失。
- 时间参数错误:在使用
get_price时,start_date和end_date的格式必须正确(如YYYYmmdd),且在回测中不能大于当前回测日期。
正确获取多只股票数据的代码示例
def initialize(context):
# 正确定义多只股票的列表
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 获取股票池中全部股票过去5天的每日收盘价
# 注意:security_list 传入的是 list 类型
his = get_history(5, '1d', 'close', security_list=g.security)
if his is not None and not his.empty:
log.info('成功获取多只股票历史数据:')
log.info(his)
# 提取特定股票的数据 (Python 3.11 环境下)
his_ss = his.query('code in ["600570.SS"]')['close']
log.info('恒生电子的收盘价:')
log.info(his_ss)
else:
log.error('获取历史数据失败或返回为空!')
总结:遇到返回空 DataFrame 时,首先排查是否在 handle_data 和 run_daily 中同时请求了数据,其次检查传入的股票列表格式和代码后缀是否符合 ptrade 的规范。