LEARN · ZH · easyquanttrading.com
回测未来函数与前视偏差:如何逐步检查?
前视偏差是历史决策使用了当时尚未获得的信息。先检查信息在什么时间可用,再分别排查特征泄漏、执行假设和选参造成的留出集污染;收益曲线漂亮或难看,都不能单独确认这些问题。
- 保存策略版本、数据快照、时区、样本边界与执行设置。
- 用截至历史决策时点的数据重新计算特征,寻找第一处差异。
- 时间戳没有重叠,只排除一种数据复用,不能代替完整审查。
一、明确收盘、信号与成交的时序
写明信号何时计算、订单何时可能进入市场。如果信号需要完整收盘价,而回测假设随后仍能按这个收盘价成交,就需要证明该执行模型有依据。下一事件成交是一种明确模型,不是所有策略的唯一规则。
收盘竞价前提交的订单、盘中触发规则和收盘后的市价单,信息与执行时序不同。单根K线的最高价和最低价,也没有告诉你止盈与止损谁先触发。检查实际实现是否遵循声明的模型。
二、检查会读到未来行的特征
重点查看负向shift、居中窗口、显式行索引,以及用于历史特征的全序列统计。例如,用整份数据的最高价归一化每个过去价格,会把后来的信息带回过去。尾部滚动窗口可以避免这一个操作,但仍需确认原始数据当时已经可用。
未来收益可以用于训练标签,但要与决策特征隔离。把标签送回入场判断,就泄漏了答案。单独增加一个shift,并不会自动修复其他读取全样本的步骤。
三、预处理先划分再拟合
先划分数据,再仅用训练部分拟合标准化、缺失值填充或特征选择,然后应用到验证和留出集。流水线有助于保持这个顺序,但修复不了输入特征已经带着未来信息的问题。
对于时间序列,还要记录每个标签覆盖的时间段。两组行时间戳不同,标签窗口仍可能重叠。是否需要间隔或剔除边界样本,应依据标签定义判断。
四、用历史前缀重新计算
选一个过去的决策时点,只使用当时已获得的数据重新计算特征,与完整回测中同一时点的特征值比较。抽查多个时点,包括样本边界和缺失数据附近。
发现差异后,继续区分未来依赖、数据修订、预热长度和初始化差异。少数抽查点一致只是有限证据。保存两边的输入与输出,让差异可以复现。
五、核对修订数据与历史标的范围
经济发布与基本面数据可能后续修订。使用当时实际发布的版本和发布时间;把修订后的数字贴回原始日期,会让过去的策略知道后来才公布的信息。
只保留今天仍然存续的标的,会遗漏历史上出现过的失败者,这是幸存者偏差。只审查指标代码不足以解决它,还需要当时的标的成员记录。
六、留出集复用单独检查
特征没有未来信息,也可能因使用同一段历史反复选参而污染最终测试。查看最终留出集前,冻结规则、参数和验收条件,记录尝试次数以及哪些决策受留出集结果影响。
本站公开审查发现一次1,001根K线的后续测试复用了620根发现阶段数据,约61.94%。它说明那次测试不独立,不等于已经定位特征未来函数,也不证明未来收益。
下方免费工具计算训练、验证和留出集时间戳交集。重叠为零,仍不能排除修订数据、特征泄漏、标签窗口重叠和针对留出集反复调参。
七、保存能复查的审查材料
通过检查不保证策略盈利。官方参考说明具体机制与诊断边界,不是收益认证。
- 策略和数据版本、时区、发布时间与分割边界。
- 第一处特征、信号或成交差异,以及对应的输入记录。
- 时序规则、预处理拟合范围和选参历史。
- 本次改动、复查结果与仍未解决的不确定性。
官方参考与更新
更新:2026-10-04 · EasyQuant Research Team
Read this guide in EnglishFAQ
- 同根K线收盘价成交一定是未来函数吗?
- 先看信息和订单时序。需要完整收盘价才能算出信号,却默认随后按同一价格成交,需要论证执行假设。提前提交订单并遵循明确成交模型,是另一种情况。
- 时间戳重叠为零,就没有数据泄漏吗?
- 它只检查一种数据复用。特征、数据修订、标签窗口、预处理和选参历史仍需独立核查。
- 过拟合与前视偏差是一回事吗?
- 不是。没有读取未来信息,也可能因拟合噪声或大量尝试后挑选赢家而过拟合。前视偏差针对的是在过去决策中使用后来才获得的信息。