3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易回测中,“未来函数”(或未来数据)是策略开发者最大的敌人之一。它指的是在历史回测时,使用了当时时间点无法获取到的未来信息(例如在今天开盘时获取了今天的收盘价),从而导致回测收益虚高,实盘却表现惨淡。
在 JoinQuant(聚宽)平台上,识别和避免代码中的未来函数主要有以下几种方法:
JoinQuant 提供了一个实验性的设置项,可以帮助开发者在代码运行层面自动检测和处理部分未来数据。你只需要在策略的 initialize 函数中加入以下代码:
def initialize(context):
# 开启避免未来数据模式
set_option("avoid_future_data", True)
开启后的处理机制:
get_bars 去取 current_dt 之后的数据),系统会直接抛出 FutureDataError 异常,强制中断回测,提醒你修改代码。get_call_auction),系统会将返回结果中的未来数据自动剔除掉,而不会抛出异常。虽然 avoid_future_data 能拦截很多问题,但它不是万能的。你需要人工审查代码中是否出现了以下常见错误:
before_trading_start (开盘前 9:00) 或 market_open (开盘 9:30) 中,调用 get_price 获取了当天的 close (收盘价)、high (最高价) 或 low (最低价)。get_fundamentals 并传入 date 参数(系统会自动取该日期前已发布的最新财报),而不是直接传入 statDate(除非你明确知道发布日期)。initialize 中开启真实价格模式:set_option('use_real_price', True)。要彻底识别和消除未来函数,最佳实践是:
initialize 中设置 set_option("avoid_future_data", True) 和 set_option('use_real_price', True)。context.current_dt),确保任何数据获取 API 的 end_date 都不超过当前逻辑时间。