问题描述
请问大佬们回测中为什么使用默认日期的get_fundamentals和使用date=context.previous_date的get_fundamentals反馈结果不一致是什么原因?看定义默认日期就是前一天能看到的财务数据。
解决方案
在 JoinQuant (聚宽) 平台的回测中,使用 get_fundamentals 查询财务数据时,不传 date 参数(使用默认日期)和传入 date=context.previous_date 导致结果不一致,根本原因在于**“自然日的前一天”与“前一个交易日”的区别**。
1. 默认日期的定义:自然日的前一天
根据 JoinQuant API 文档,当 get_fundamentals 的 date 参数为 None(默认值)时,在回测模块中,默认值等于 context.current_dt 的前一天(自然日)。
- 逻辑:实际生活中,我们在今天开盘前,能看到的是截止到昨天(自然日)晚上发布的所有财报和市值数据。
2. context.previous_date 的定义:前一个交易日
context.previous_date 在 API 中的定义是前一个交易日。
3. 产生差异的场景:周末与节假日
在连续的交易日(如周二到周五),“自然日的前一天”和“前一个交易日”是同一天,此时两者的查询结果是一致的。但是,在周一或者长假之后的第一个交易日,两者就会产生分歧。
举个例子(假设当前回测时间 context.current_dt 是周一):
- 使用默认日期:系统查询的
date是周日。如果某家上市公司在周六或周日发布了最新的财务报表,使用默认日期就能获取到这份最新的财报数据。 - 使用
context.previous_date:系统查询的date是上周五。此时,查询到的财务数据截止到上周五,无法包含该上市公司在周末发布的最新财报。
4. 市值表 (valuation) 的特殊性
除了财报发布时间的差异外,市值表数据每天都在更新。虽然周末没有交易,市值理论上与周五收盘一致,但系统底层在处理非交易日的市值查询时,按周日查询和按周五查询在某些极端情况下(如遇到除权除息、数据对齐等)也可能表现出细微差异。
总结与建议
- 不一致的原因:默认日期是昨天(自然日),而
context.previous_date是上一个交易日。在周末或节假日后,这两天不是同一天,从而导致获取到的财报数据版本不同。 - 最佳实践:在编写策略时,为了最大程度模拟真实的交易场景(即利用开盘前能获取到的所有最新公开信息),建议直接使用默认日期(不传
date参数)。这样可以确保你的策略能够及时捕捉到周末或节假日期间发布的财务报告,避免引入未来函数或遗漏最新信息。