问题描述
/
解决方案
在 ptrade 量化平台中,get_all_trades_days() 接口默认会返回自交易所成立(通常为1990年)以来的所有交易日数据。如果在策略中(尤其是高频执行的 handle_data 或 tick_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秒执行)中调用。
优化方法: 在 initialize 或 before_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中,避免在盘中高频查询。