问题描述
解决方案
您好!理解财务数据的时间逻辑确实是量化回测中非常关键的一步,这直接关系到策略是否包含了**“未来函数”**。
您的理解有一点偏差。在 JoinQuant 平台中,财务数据(如财报、市值等)的获取并不是精确到当天的 9:30 或 15:00,而是基于**“按天(收盘后)”**的逻辑来严格对齐的。
为了让您彻底明白,我们可以用一句话来总结核心原则:“在今天的任何交易时刻(无论是9:30还是14:50),你只能看到昨天及以前已经公开的财务数据。”
详细原理解析
1. get_fundamentals 函数的默认逻辑
当您在回测中调用 get_fundamentals 查询财务数据,且不传入 date 参数时:
- 回测模块的默认行为:系统会自动将查询日期设定为
context.current_dt的前一天。 - 为什么这样做? 因为在实际交易中,今天(T日)盘中交易时,您只能确切知道昨天(T-1日)收盘后已经发布的财报和市值数据。今天盘中或盘后才发布的数据,在今天交易时是未知的。
2. 举个具体的例子(以6月23日和6月24日为例)
假设某上市公司在 6月23日晚上(盘后) 发布了最新的季度财报。
-
场景 A:回测运行到 6月23日 09:30
- 此时
context.current_dt是 6月23日。 - 系统默认查询的是 6月22日 能看到的最新财报。
- 结果:您获取不到6月23日晚上才发布的最新财报,获取到的依然是上一季度的旧财报。这是完全符合现实的。
- 此时
-
场景 B:回测运行到 6月24日 09:30
- 此时
context.current_dt是 6月24日。 - 系统默认查询的是 6月23日 能看到的最新财报。
- 结果:因为财报在6月23日已经发布,所以您在6月24日的回测中可以获取到这份最新的财报数据。
- 此时
3. 因子库中的财务因子逻辑
如果您使用的是聚宽因子库(如在自定义因子中设置 dependencies = ['operating_revenue']):
- 文档中明确指出:
operating_revenue表示每天可以看到的最新单季度数据。 - 如果财报在非交易日(如周六 10月21日)发布,那么在下周一(10月23日)的逻辑时间里,您就能获取到这份最新的财报数据。在10月20日(周五)及之前,获取到的都是旧数据。
总结
您不需要去纠结是 9:30 还是 15:00。您只需要记住:系统为了保护您的策略不使用未来数据,永远只给您提供“昨天及以前”已经确定的财务报表和市值信息。 这样回测出来的结果才是真实可信的。