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

joinquant 规避未来函数:avoid_future_data 模式开启与检测

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

问题描述

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

Title: joinquant 规避未来函数:avoid_future_data 模式开启与检测

Question: 聚宽的 avoid_future_data 选项怎么开启?它能检测出哪些未来数据?

解决方案

在量化交易回测中,**未来函数(未来数据)**是导致回测收益虚高、实盘表现惨淡的“最大杀手”。聚宽(JoinQuant)平台提供了 avoid_future_data 选项,帮助开发者在回测阶段及时发现并剔除未来数据。以下是关于该选项的开启方法及检测机制的详细介绍。

一、如何开启 avoid_future_data 模式?

要开启避免未来数据模式,您需要在策略的初始化函数 initialize(context) 中调用 set_option 函数。该选项默认是关闭的(False)。

开启代码示例:

def initialize(context):
    # 开启避免未来数据模式
    set_option("avoid_future_data", True)
    
    # 建议同时开启真实价格(动态复权)模式,以获得最真实的回测环境
    set_option('use_real_price', True)

二、avoid_future_data 能检测和处理哪些未来数据?

开启该功能后,系统主要针对以下两类未来数据进行检测和处理:

1. 可以通过时间参数避免的未来数据

这类数据是指在回测中,用户通过包含时间参数的 API 尝试获取当前逻辑时间(context.current_dt)之后的数据。

  • 典型场景:例如在 09:30 的时候,使用 get_barsget_price 尝试获取当天 15:00 的分钟数据或收盘价。
  • 处理方法:设置 avoid_future_data=True 后,如果策略代码尝试获取未来时间段的数据,系统会直接抛出 FutureDataError 异常并中断回测,提醒您修改代码。

2. 没法通过时间参数主动避免的未来数据

这类数据是指由于 API 自身的机制,用户无法通过调整参数来主动规避的未来信息。

  • 典型场景:例如使用 get_call_auction 获取集合竞价数据。
  • 处理方法:设置 avoid_future_data=True 后,系统不会抛出异常,而是自动将返回结果中的未来数据剔除掉,确保您的策略在当前时间点只能拿到已经发生的历史数据。

三、使用 avoid_future_data 的注意事项

虽然 avoid_future_data 是一个非常实用的辅助工具,但它不是万能的,您在编写策略时仍需注意以下几点:

  1. 无法检测外部引入的未来数据:如果您在策略中引入了外部数据(如通过网络请求获取的自定义数据、本地上传的 CSV 文件等),avoid_future_data 无法对其进行检测。您需要自行确保这些外部数据在回测时间点是可得的。
  2. 策略逻辑上的未来函数:如果您在策略中硬编码了某些历史大涨股票的买卖点(例如:在历史最低点买入,最高点卖出),这种逻辑上的未来函数系统也是无法检测的。
  3. 财务数据的盘后获取限制:为了规避未来数据,get_fundamentals(查询财务数据)在盘后(15:00)才能获取当天交易日的数据,在当天收盘前只能获取以前的数据。