仅有一份冻结的市场数据快照,还不足以让回测值得信赖。它可以重复得出同一个答案,却可能掩盖数据供应商改动了产生该结果的输入数据。
保留快照。同时保留一份变更日志,记录哪些数据变了、何时变化,以及策略是否受到影响。当研究使用修正后的成交记录、修订后的基本面数据、重建后的资金费率,或供应商悄悄刷新的历史数据时,这一点尤其重要。
为什么可复现的回测仍可能误导你?
假设你周一下载了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分钟高点只变动了$0.02,虽然可能涉及100万行数据,却对日线动量策略毫无影响。反过来,止损价位上的一根K线即使只被修正一次,也可能影响策略。要衡量决策受到的影响;变更记录数量并不能很好地代表影响大小。
要把两个问题分开:“我能否根据保存的数据复现结果?”以及“这个数据版本在当时是否已经可供策略使用?”变更日志有助于回答这两个问题,但回答第二个问题还需要记录数据在各个时点的可用情况。
这需要多少成本,什么时候值得做?
跟踪变更会增加存储和数据接入工作,也需要做出运维决策。供应商可能不提供稳定的版本,有些历史数据流会定期重建,却没有清楚的修正通知。你无法记录自己从未发现的变更。
从可能改变研究结论的数据入手:止损逻辑使用的K线、经过公司行动调整的股票数据、时点基本面数据,以及会被重建的资金费率或未平仓量序列。对于覆盖面广且稳定的数据集,每日清单加分区校验和可能就够了。如果数据经常更新,或交易决策对单条记录很敏感,再添加字段级差异记录。
批评者指出,完整且永久地归档供应商的每次响应,成本可能很高,却仍无法还原数据源在当时掌握的信息,这一点是对的。应把审计范围限定在重要的数据和决策上,并记录其中的缺口。快照让你能够重跑实验;变更日志则能解释实验结果为何发生变化。
← 全部文章


