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

ptrade策略中get_all_trades_days返回数据量过大导致运行缓慢怎么办?

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

问题描述

调用get_all_trades_days()获取所有历史交易日时返回数据量过大导致策略运行缓慢,应该如何处理?

/

解决方案

在 ptrade 量化平台中,get_all_trades_days() 接口默认会返回自交易所成立(通常为1990年)以来的所有交易日数据。如果在策略中(尤其是高频执行的 handle_datatick_data 中)频繁调用该接口,会产生较大的性能开销,导致策略运行缓慢。

为了解决这个问题,建议采取以下优化方案:

1. 使用 get_trade_days() 替代

如果您的策略只需要获取最近一段时间的交易日,或者特定日期范围内的交易日,强烈建议使用 get_trade_days(start_date=None, end_date=None, count=None) 接口。该接口允许您按需获取指定范围的交易日,大大减少了返回的数据量。

示例:获取最近10个交易日

def handle_data(context, data):
    # 获取回测日期往前10天的所有交易日,包含历史回测日期
    trading_days = get_trade_days(count=10)
    log.info(trading_days)

示例:获取指定日期范围的交易日

def initialize(context):
    # 获取指定范围内交易日
    trade_days = get_trade_days('2023-01-01', '2023-02-01')
    log.info(trade_days)

2. 避免在高频事件中重复调用

交易日历数据在一天内是固定的。如果您确实需要获取大量的交易日数据,请避免在 handle_data(每分钟/每天执行)或 tick_data(每3秒执行)中调用。

优化方法:initializebefore_trading_start 中调用一次,并将其存储在全局变量 g 中,后续直接读取全局变量即可。

示例:在盘前缓存交易日数据

def before_trading_start(context, data):
    # 每天盘前获取一次,存入全局变量
    g.recent_trade_days = get_trade_days(count=30)

def handle_data(context, data):
    # 盘中直接使用缓存的数据,避免重复查询
    recent_days = g.recent_trade_days
    # 执行策略逻辑...

总结

  • 按需获取:优先使用 get_trade_days(count=N) 获取所需数量的交易日。
  • 缓存数据:将低频变化的数据(如交易日历)在 before_trading_start 中缓存到全局变量 g 中,避免在盘中高频查询。