3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
date 不会引入未来数据在 JoinQuant 回测中,调用 get_fundamentals(q)(即不传 date 参数)不会引入未来数据。您观察到的回测收益差异,是由于 “前一个自然日” 与 “前一个交易日” 的区别造成的。
核心原因在于 context.current_dt 的前一天(默认行为)和 context.previous_date 的定义不同:
默认行为(不传 date):
API 文档指出,默认的 date 是 context.current_dt 的前一天(自然日)。例如,如果今天是周一,context.current_dt 的前一天是周日。
传入 context.previous_date:
context.previous_date 的定义是前一个交易日。如果今天是周一,context.previous_date 是上周五。
date,系统在周一回测时,查询的 date 是周日。此时,您可以获取到周末刚刚发布的最新财报数据。这完全符合现实逻辑(周一开盘前,您确实能看到周末发布的财报),没有未来函数。context.previous_date,系统在周一回测时,查询的 date 是上周五。此时,系统只会返回上周五收盘后能看到的数据,完美错过了周末发布的最新财报。由于财务数据(如 EPS)的更新被延迟获取,您的选股逻辑在周一做出了基于旧数据的决策,从而导致了选股结果的不同和收益的大幅下降。
文档中提到:
“回测模块: 默认值会随着回测日期变化而变化, 等于 context.current_dt 的前一天(实际生活中我们只能看到前一天的财报和市值数据, 所以要用前一天)”
这里的“前一天”指的是 context.current_dt - datetime.timedelta(days=1),即自然日的前一天,而不是交易日的前一天。聚宽的底层逻辑已经为您处理好了时间对齐,确保您在任何时刻调用 get_fundamentals 默认获取到的都是该时刻在现实世界中能看到的最新数据。
get_fundamentals(q),不要手动传入 date 参数。聚宽的默认机制是最贴近真实交易场景的,能确保您及时获取节假日发布的财报,且绝对不会引入未来数据。context.previous_date:除非您的策略有极其特殊的逻辑(例如明确要求只使用上一个交易日的数据,刻意忽略周末信息),否则不要将 date 设置为 context.previous_date。initialize 中开启防未来函数模式:set_option("avoid_future_data", True)。开启后,如果您的代码逻辑真的触碰了未来数据,系统会直接报错拦截。