🚀 AI 一键生成 ptrade 策略代码

为什么 ptrade 的 get_history 和 get_price 接口返回数据格式发生了变化?

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

问题描述

为什么主干版本和2022补丁版本的get_history、get_price接口返回数据接口发生了变化?

/

解决方案

ptrade 接口返回数据格式变化的核心原因

在 ptrade 量化平台中,get_historyget_price 接口在不同版本(如主干版本与2022补丁版本)之间返回数据格式发生变化,根本原因是底层 Python 环境及 Pandas 库版本的升级

具体来说,旧版本环境基于 Python 3.5,而新版本环境升级到了 Python 3.11。在较早的 Pandas 版本中,多维数据通常使用 pandas.Panel 对象来存储;但在较新的 Pandas 版本中,Panel 对象已经被官方彻底废弃。因此,ptrade 平台为了适配新版 Pandas,对多股票、多字段查询时的返回数据结构进行了重构,统一改用 pandas.DataFrame


具体的数据格式差异对比

根据 ptrade API 文档,差异主要体现在查询多只股票的场景下:

1. 旧版本环境(仅 Python 3.5 支持)

  • 多股票 + 单字段:返回 pandas.DataFrame,行索引是时间(datetime),列索引是股票代码
  • 多股票 + 多字段:返回 pandas.Panel 对象。items 轴是行情字段(如 'open', 'close'),里面包含多个 DataFrame,每个 DataFrame 的列索引是股票代码。

2. 新版本环境(仅 Python 3.11 支持)

  • 多股票(无论单字段还是多字段):统一返回 pandas.DataFrame。行索引是时间(datetime),列索引是行情字段,并且新增了一列 code 用于标识股票代码

(注:对于单只股票的查询,两个版本均返回 DataFrame,行索引为时间,列索引为行情字段,变化不大。)


策略代码适配建议

如果您的策略从旧版本迁移到新版本,或者需要编写兼容性更好的代码,建议采取以下适配方案:

方案一:使用 query 方法筛选数据(针对 Python 3.11)

在新版本中,由于返回的是带有 code 列的长表 DataFrame,您需要使用 Pandas 的 query 方法来提取特定股票的数据。

# 获取多只股票数据
dataframe_info = get_history(2, frequency='1d', field=['open','close'], security_list=['600570.SS', '600571.SS'])

# 提取特定股票 (600570.SS) 的数据
df_600570 = dataframe_info.query('code in ["600570.SS"]')

方案二:使用字典格式返回(强烈推荐)

为了避免 Pandas 版本差异带来的兼容性问题,并且提升数据获取速度,强烈建议在调用 get_historyget_price 时,传入 is_dict=True 参数

# 使用 is_dict=True 返回字典格式
his_dict = get_history(5, '1d', 'close', security_list=['600570.SS', '600571.SS'], is_dict=True)

# 返回格式为 OrderedDict,结构清晰且不受 Pandas 版本影响
# OrderedDict([('600570.SS', array([...])), ('600571.SS', array([...]))])

使用字典格式不仅能完美避开 PanelDataFrame 的结构差异,还能在底层获得更快的取数性能,是编写稳健 ptrade 策略的最佳实践。