🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 历史 K 线获取性能对比:get_history 与 get_price 速度测试与选择指南

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 数据获取性能对比:get_history 与 get_price 速度测试

Question: ptrade 获取历史 K 线时,get_history 和 get_price 哪个性能更好?

解决方案

在 ptrade 量化交易平台中,get_historyget_price 都是用于获取历史 K 线数据的核心 API。整体而言,两者的底层数据数据取数性能相当,但在调用便捷性、参数灵活性以及数据格式设置(如 is_dict=True 上存在显著差异。

一、 核心功能与参数对比

特性 / 接口 get_history get_price
核心定位 获取最近 N 条历史行情 K 线数据 获取指定时间段前 N 条历史行情 K 线数据
时间范围设置 仅支持通过 count 参数指定获取最近 N 条 支持 start_date + end_dateend_date + count 的灵活组合
默认股票池 security_list=None 时默认取 set_universe 设置的股票池 必须显式指定 security 参数
返回数据包含当天 可通过 include=True/False 控制是否包含当前周期 不包含当天数据(仅返回历史数据)
多线程限制 不支持与 get_price 多线程/跨线程同时调用 不支持与 get_history 多线程/跨线程同时调用

二、 性能对比与优化关键点

1. 基础性能差距

在相同查询条件下(如均获取单只或少量股票的 100 根日线数据),get_historyget_price 的耗时基本一致。

2. 影响性能的关键参数:is_dict=True

无论是使用 get_history 还是 get_price,决定取数速度的最大因素是返回的数据结构格式

  • 默认返回 (is_dict=False):返回 pandas.DataFramepandas.Panel 对象。构建 DataFrame/Panel 需要额外的类型转换开销,在多标的、高频调用的场景下性能消耗较大。
  • 字典模式 (is_dict=True):直接返回 OrderedDict 结构(格式为 {stock_code: array()})。开启 is_dict=True 可以大幅提升数据解析与提取速度,建议对速度敏感的 tick 级或分钟级实盘策略开启此选项。

三、 使用场景推荐

  1. 推荐使用 get_history 的场景:

    • 需要获取当前时间点之前固定 N 根 K 线(如计算 MA5、MA10 均线)。
    • 策略已通过 set_universe 设定了全局股票池,希望直接批量获取股票池数据。
    • 盘中需要获取包含当前最新周期的 K 线数据(设置 include=True)。
  2. 推荐使用 get_price 的场景:

    • 需要获取具体历史时间段(如 '20230101''20231231')的数据进行区间分析。
    • 策略中需要精准控制历史数据的起止日期。

四、 性能优化代码示例

以下示例展示了如何在 ptrade 策略中使用 is_dict=True 高效获取历史 K 线:

def initialize(context):
    g.security = ['600570.SS', '000001.SZ']
    set_universe(g.security)

def handle_data(context, data):
    # 使用 is_dict=True 获取获取高效的 OrderedDict 数据结构
    history_dict = get_history(100, frequency='1d', field=['close'], security_list=g.security, is_dict=True)
    
    if history_dict and '600570.SS' in history_dict:
        # 获取 600570.SS 的收盘价数组
        close_prices = history_dict['600570.SS']['close']
        ma5 = close_prices[-5:].mean()
        log.info('600570.SS 5日均价为: %s' % ma5)

五、 总结与注意事项

  • 性能结论:两者基础速度相近。若追求极限速度,关键在于将 is_dict 设置为 True
  • 避坑提示:切勿在 run_dailyrun_interval 等定时线程中与 handle_data 主线程同时调用 get_historyget_price,否则会导致数据获取偶发为空。