数据边界 / LOOKAHEAD BIAS

回测里的未来函数:为什么逐根回放更重要

如果信号计算偷偷使用了未来数据,回测结果会看起来更清楚,却无法回答当时是否真的能做出这个判断。

未来函数不是某一种特定代码,而是一个时间顺序问题:策略在时点 t 做判断,却读取了时点 t 之后才会出现的信息。

用时间关系定义它

在最简单的收盘后研究里,信号应该只由当前及之前已经收盘的数据计算:

signal_t = f(X_0, X_1, ..., X_t);action_{t+1} = execute(signal_t)

如果信号使用了 X_{t+1},或者在当前 K 线尚未收盘时使用了最终收盘价,那么它就不再是当时可获得的信息。

三个常见检查点

1. 信号时间和执行时间

记录信号生成时间、K 线收盘时间和实际模拟成交时间。一个信号在收盘后生成,最早也应在下一根可交易时点执行,不能用同一根 K 线的最终价格假设即时成交。

2. 指标窗口是否越过当前时点

移动均线、波动率和标准化因子都要确认窗口只包含过去数据。滚动计算的窗口末端应等于当前时点,而不是默认对整段数据先计算后再切片。

3. 报告是否提前展示结果

训练界面应该先展示当前 K 线和当时可见的上下文,用户提交判断后再推进。净值、未来高低点和最终交易结果应留在后续报告中。

为什么逐根回放有帮助

逐根回放把历史数据切成一系列明确的判断节点。每个节点都能回答三个问题:当时看到了什么、根据哪条规则做了什么、下一步结果是什么。它不能自动证明策略有效,但可以把时间边界暴露出来,方便发现数据泄露和事后解释。

可复现检查

保存数据版本、当前回放位置、规则版本和判断记录。任何人拿到相同输入,都应能复核同一个节点,而不是只能相信一张事后曲线。

边界说明

避免未来函数只是回测可信度的一个条件。还需要继续验证样本外表现、交易成本、滑点、参数敏感性和风险限制。历史结果只用于研究和训练,不代表未来收益,也不构成投资建议。