2026年十月13日 · 研究

回测发现了 20% 的优势,其中有多少来自一个错误的时间戳?

回测发现了 20% 的优势,其中有多少来自一个错误的时间戳?

一次回测实现了 20% 的年化收益率。它使用了 8 年数据、1,640 笔交易,并进行了干净的滚动前向切分。随后,我们把供应商当前的历史数据换成当时记录的数值,优势就降到了 3%。

令人意外的并非最初的收益率,而是其中有 17 个百分点依赖修订后的数据。这种事后信息可能藏在经济数据发布、公司基本面、指数成分股,甚至看似简单的市场字段中。历史数据告诉你数据源现在给出的是什么;时点数据集告诉你策略当时能知道什么。

为什么事件发生后历史数据还会变化?

有些数值最初是估算值,之后才会更正。周五发布的经济统计数据,可能在下个月修订。公司可能重述某项盈利数据。数据供应商可能修复错误成交记录、补上缺失区间,或用最终值替换初步值。只存储最新值的数据库,会让所有这些变化看起来仿佛从一开始就如此。

如果策略按报告收入给公司排名,或在定时数据发布后交易市场,这就很重要。如果它提前几个月就看到了更正后的数字,回测便给了它决策时市场上尚不存在的信息。信号计算可能毫无瑕疵,但输入仍来自错误版本的历史。

这里有个很容易踩的坑:名为 date 的字段通常描述数值所涵盖的期间,而非该数值何时可用。标注为 3 月 31 日的季度收入记录,可能要到 5 月才发布。这个标签说的是业务所属期间,不是策略的信息集。

回测应该使用哪个时间戳?

分别跟踪数值的生效期间和可用时间。如果可以,也要记录发布时间和摄取时间。只有在数值发布且系统收到之后,策略才能使用它;如果这两个时间不同,保守重放时应采用较晚的那个时间。

时间戳描述内容用途
生效时间数值所对应的期间或事件按被测量对象对观测值分组
发布时间数据源发布此版本的时间防止数据发布前就出现在回测中
摄取时间系统收到此版本的时间记录交付延迟和延后回填

例如,假设某公司的季度销售额涵盖 1 月至 3 月,于美东时间 5 月 8 日 16:15 报告,并在 16:17 到达你的研究数据存储。若策略在 5 月 8 日收盘时做决策,且收盘决策时间是 16:00,就不能使用这份报告;若策略在次日早晨决策,则可以。仅凭季度末日期无法回答这两个问题。

如何检验结果是否受数据修订驱动?

用同一个策略运行两次:一次使用每个历史决策时点可用的数据版本,另一次使用最新修订后的历史数据。固定执行假设、交易范围和代码。两者的差异就是修订敏感性结果,而非新的策略比较。

然后查看差距来自哪里。表现是否在数据发布日发生变化?最大的差异是否集中于少数被重述的公司或更正后的观测值?策略是否在相关发布时间之前就交易了?一次小规模的事件级审计,往往比再看一张累计收益图更能解释问题。

20%使用最新历史数据的收益率
3%使用时点数据的收益率
17 个百分点对修订敏感的差距

这些数字仅用于说明,并非普遍适用的惩罚幅度。真正有用的是针对你自己的策略进行成对比较,并尽可能保持交易和成本一致。如果修订版结果高出很多,在相信回测的醒目数字之前,先查明哪些字段和日期造成了差异。

时点数据审计应该记录什么?

从策略实际使用的字段着手。逐一确认每个字段的数据源、时间戳含义、修订规则,以及能否取回旧版本。询问供应商如何记录更正:覆盖旧行、增加版本行,还是单独保存审计日志?产品页面上写着“历史数据”并不能说明这些问题。

同时让审计范围保持实用。如果策略只使用交易所成交和 K 线,经济数据修订可能无关紧要。但 K 线更正和供应商回填仍可能造成影响,尤其是信号依赖流动性较差的市场或精确的事件窗口时。

无法获取时点历史数据时

别悄悄把今天的数值当成昨天就有的。将该字段标记为局限,不要用它支持依赖历史可用性的结论,或者采用保守延迟运行并展示结果变化幅度。延迟代理数据可以用于研究,但必须明确标注延迟,并在结果中一并说明局限。

回测的任务,是用当时已有的信息集重建决策。如果你的数据只能显示最新版本,就必须明确结果的边界:它可以检验策略对照今天重建的历史数据时的表现,却无法确证历史上的交易者当时究竟能看到什么。

回测数据工程公司行动时点数据
← 全部文章