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

PTrade 策略运行太慢?教你用 is_dict=True 突破行情读取性能瓶颈

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

问题描述

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

Title: PTrade 策略性能优化:利用 get_history 的 is_dict 参数提升数据读取速度

Question: PTrade 策略运行太慢,如何通过 get_history 的 is_dict=True 进行提速?

解决方案

PTrade 策略性能优化:利用 get_history 的 is_dict 参数提升数据读取速度

在 PTrade 中进行多标的或高频策略开发时,反复调用 get_historyget_price 获取历史 K 线数据常会成为策略运行的性能瓶颈。默认情况下,系统会构造复杂的 pandas.DataFramePanel 对象,这在频繁调用时会产生较大的内存与 CPU 开销。

通过将 get_historyis_dict 参数设置为 True,可以跳过 Pandas 对象的构建,直接返回底层的 C/C++ 结构化字典数组(Dict),从而大幅提升行情数据的读取与解析速度


1. 为什么 is_dict=True 能够提升读取速度?

  • 内存开销小:默认返回 DataFrame 时,系统需要为行列索引、数据类型转换分配额外内存;而返回 dict 直接使用 OrderedDict 加 NumPy array,数据更加紧凑。
  • 数据解析更快:避免了 Pandas 内部复杂的数据重组与索引构建,大幅减少 CPU 耗时。
  • 适用多标的大数据量场景:特别是当股票池标的超过 200 只时,使用字典模式能显著降低读取延迟。

2. API 参数与数据结构说明

函数定义

get_history(count, frequency='1d', field='close', security_list=None, fq=None, include=False, fill='nan', is_dict=False)

返回数据对比

  • 默认 (is_dict=False):返回 pandas.DataFramepandas.Panel 对象。
  • 优化后 (is_dict=True):返回 OrderedDict 数据结构:
    OrderedDict([
        ('600570.SS', array([(202309220931, 11.03, 11.08, 11.03, 11.07, 2289400.0, 25302018.0, 11.07)],
                            dtype=[('datetime', '<i8'), ('open', '<f8'), ('high', '<f8'), ('low', '<f8'), ('close', '<f8'), ('volume', '<f8'), ('money', '<f8'), ('price', '<f8')]))
    ])
    

3. 代码示例:如何高效解析 is_dict 返回的数据

下面展示如何在策略中将 is_dict 设为 True 并提取收盘价计算均线:

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

def handle_data(context, data):
    # 使用 is_dict=True 高速获取过去 5 天的历史行情
    history_dict = get_history(5, frequency='1d', field=['close'], security_list=g.security, is_dict=True)
    
    if history_dict is None:
        return
        
    for stock in g.security:
        if stock in history_dict:
            # 提取 NumPy 结构化数组中的 close 字段
            close_prices = history_dict[stock]['close']
            # 计算 5 日均价
            ma5 = close_prices.mean()
            log.info("%s 5日均价: %s" % (stock, ma5))

4. PTrade 提速最佳实践策略

  1. 行情获取优先选择 is_dict=True:在 handle_datarun_interval 等高频调用的事件中,统一开启 is_dict=True
  2. 配合 NumPy 进行批量计算:避免将获取到的 array 再转回 DataFrame,尽量使用 numpy 函数直接进行指标计算。
  3. 逐笔数据同样推荐开启:在使用 get_individual_entrustget_individual_transaction 获取逐笔 L2 数据时,将 is_dict 设为 True 也能获得明显的性能提升。