🚀 AI 一键生成 ptrade 策略代码

ptrade调用get_history/get_price获取多只股票数据为空怎么办?

ptrade | 发布时间: 2026/5/28
以下内容由 EasyQuant 生成。

问题描述

tushare取多个股票的数据时返回空的dataframe。

/

解决方案

在 ptrade 量化交易平台中,使用 get_historyget_price 接口获取多只股票的历史行情数据时,如果返回空的 DataFrame,通常是由以下几个常见原因导致的。请对照检查您的策略代码:

1. 多线程同时调用导致冲突(最常见原因)

根据 ptrade API 文档的特别提示:get_history 接口与 get_price 接口不支持多线程同时调用。如果您在 run_dailyrun_interval 等定时任务函数中,与 handle_data 等框架模块在同一时刻调用了 get_historyget_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_dateend_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_datarun_daily 中同时请求了数据,其次检查传入的股票列表格式和代码后缀是否符合 ptrade 的规范。