2026年十一月10日 · 数据

你的回测需要的是数据变更日志,而不只是数据快照

你的回测需要的是数据变更日志,而不只是数据快照

仅有一份冻结的市场数据快照,还不足以让回测值得信赖。它可以重复得出同一个答案,却可能掩盖数据供应商改动了产生该结果的输入数据。

保留快照。同时保留一份变更日志,记录哪些数据变了、何时变化,以及策略是否受到影响。当研究使用修正后的成交记录、修订后的基本面数据、重建后的资金费率,或供应商悄悄刷新的历史数据时,这一点尤其重要。

为什么可复现的回测仍可能误导你?

假设你周一下载了5年的小时K线,并运行一个策略。到了周五,供应商修复了一笔错误成交、调整了一次公司行动,或补上了一个数据缺口。你保存的文件仍能精确复现周一的结果。这是可复现的。但如果你用供应商当前的历史数据重新运行,结果可能不同,而且你没有记录可以解释原因。

问题不只在于重大修正。一个高点被改动,就可能触发止损;收盘价修订后,指标可能越过阈值。在覆盖范围广的资产池中,一个标的的历史数据变化可能改变它的排名,进而把另一个资产挤出投资组合。即使策略代码和配置完全相同,最终 Sharpe 也可能发生偏移。

文件哈希能告诉你两个文件不同,却无法说明是拆股调整改动了40年的价格、供应商修正了3笔成交,还是解析器把空字段转成了零。

市场数据变更日志应该记录什么?

在最小且有用的粒度上记录变更,并保留足够的上下文,以便重放受影响的研究。对于K线数据流,通常需要记录交易品种、周期、事件时间、变更前后的值、来源,以及你发现这次更新的时间。供应商提供原始数据时,也要保留原始载荷。

记录内容保留原因示例
来源版本或获取时间明确使用了供应商的哪个数据状态快照获取时间:2026-11-02 08:15 UTC
变更字段及旧值/新值展示具体改动内容ETHUSDT 1h high:3,412.10 → 3,418.60
变更分类区分数据修复和数据转换延迟成交修正、拆股调整、历史数据补录
处理流水线和模式版本区分来源数据编辑和你自己的处理标准化器 v7,调整后K线模式 v3

对于大型数据集,保存不可变快照,并为每个快照建立精简清单,记录校验和、来源版本和获取时间。对发生变更的数据分区添加逐行差异记录。这样既能实际重放,也不必把每一条未变更的记录都写入第二张审计表。

如何衡量一次修正是否重要?

不要只统计变更的行数。用新旧数据分别重跑受影响的策略,并保持代码、参数、费用和执行假设相同。比较交易决策以及最终结果的演变过程。

  1. 根据差异确定受影响的交易品种和事件时间。
  2. 找出使用这些记录的特征、信号、订单或投资组合权重。
  3. 重放满足验证要求的最小时间窗口,并纳入回看期和持仓状态。
  4. 比较订单、成交、敞口、换手率、回撤和最终表现。

例如,供应商修正后,某个1分钟高点只变动了$0.02,虽然可能涉及100万行数据,却对日线动量策略毫无影响。反过来,止损价位上的一根K线即使只被修正一次,也可能影响策略。要衡量决策受到的影响;变更记录数量并不能很好地代表影响大小。

要把两个问题分开:“我能否根据保存的数据复现结果?”以及“这个数据版本在当时是否已经可供策略使用?”变更日志有助于回答这两个问题,但回答第二个问题还需要记录数据在各个时点的可用情况。

这需要多少成本,什么时候值得做?

跟踪变更会增加存储和数据接入工作,也需要做出运维决策。供应商可能不提供稳定的版本,有些历史数据流会定期重建,却没有清楚的修正通知。你无法记录自己从未发现的变更。

从可能改变研究结论的数据入手:止损逻辑使用的K线、经过公司行动调整的股票数据、时点基本面数据,以及会被重建的资金费率或未平仓量序列。对于覆盖面广且稳定的数据集,每日清单加分区校验和可能就够了。如果数据经常更新,或交易决策对单条记录很敏感,再添加字段级差异记录。

批评者指出,完整且永久地归档供应商的每次响应,成本可能很高,却仍无法还原数据源在当时掌握的信息,这一点是对的。应把审计范围限定在重要的数据和决策上,并记录其中的缺口。快照让你能够重跑实验;变更日志则能解释实验结果为何发生变化。

数据工程回测可复现性量化研究
← 全部文章