3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化回测中,**未来函数(Future Data)**是导致回测实盘收益差异巨大的“罪魁祸首”。未来函数指在历史回测时使用了当时时间点无法获取的未来信息(例如:在盘中获取当天的收盘价或尚未披露的财务数据)。
为了帮助开发者发现并剔除未来函数,JoinQuant(聚宽)平台提供了 avoid_future_data 机制。
avoid_future_data 模式?在 JoinQuant 策略代码的 initialize(context) 函数中调用 set_option API,即可开启避免未来数据模式:
def initialize(context):
# 开启避免未来数据模式
set_option('avoid_future_data', True)
# 开启动态复权模式(建议同时开启以防复权未来函数)
set_option('use_real_price', True)
get_bars)请求 current_dt 之后的数据时,系统会直接抛出 FutureDataError 异常提示报错位置。get_call_auction(集合竞价数据),开启模式后,系统会自动过滤并剔除其中的未来数据,而不抛出异常。get_price 获取当天的 close 价格。history 或 attribute_history(默认不包含当天数据)。get_current_data() API 或通过 get_bars 取截至当前的 Bar。# 正确获取盘中实时数据
current_data = get_current_data()
price = current_data['000001.XSHE'].last_price
get_fundamentals 传入 statDate(如 '2023q1')去取财报。因为财报发布有滞后性,在季度结束时(如 3月31日)财报往往尚未披露。date 参数(回测中默认取 context.current_dt 的前一天),系统会自动查找该日期前已发布的最新财报数据,避免未来函数:# 正确查询财务数据
q = query(valuation.code, valuation.pe_ratio)
df = get_fundamentals(q, date=context.previous_date)
initialize 中开启动态复权(真实价格)模式:set_option('use_real_price', True)
avoid_future_data 可以拦截平台标准 API 引入的未来数据,但无法拦截用户自己从外部网络/本地读取的自定义数据,也无法拦截通过硬编码特定股票未来大涨日期等逻辑性未来信息。g 中跨交易日缓存数据获取 API 的结果(如价格或复权因子),因为不同交易日看历史的前复权价格可能会有变动。