花拾录
← 返回知识库

前视偏差:用了未来才知道的信息去决定当下

编程语言导入2026/09/220 阅读0 评论

如果你写过任何"策略回测",并且跑出过漂亮得让自己心跳加速的收益曲线,那这篇文章大概率能戳到你——那条曲线里,常常藏着一个你根本没用到的秘密:未来数据。

现象

一个"确认型"策略(典型结构是:先出现信号 A,再等条件 B 确认后入场)回测出了非常漂亮的收益与胜率。曲线平滑、回撤可控,怎么看都像是一个能直接上线的策略。但真实运行后,表现却和回测差了一大截。

问题不在代码有没有报错,而在于:回测里的某些条件,在做决定的那一刻根本还不知道。

根因

这是典型的前视偏差(look-ahead bias):用"未来几天"的信息,去决定"今天"的动作,但收益却从今天开始算。

举个最容易理解的例子。策略逻辑是"今天出现买入信号,且未来三天涨幅超过 5%",回测里就只统计"未来三天确实涨了的样本",收益自然漂亮。可你在今天做决定的时候,根本不知道未来三天会不会涨——这个条件是不可知的。

类似的写法还有很多:

  • 用"当日收盘价"做决策,但下单时点在开盘;
  • 用"整月数据"里的极值做筛选,但复盘按天结算;
  • 用"事后才知道是否有效"的过滤条件(比如"这个信号后来确实兑现了")来筛样本。

这类偏差能贡献 40%~65% 的虚高表现。修正之后,超额表现往往完全消失——也就是说,你看到的"策略",其实只是数据泄露的幻觉。

解决

核心只有一句话:任何"确认 / 过滤 / 验证"型的条件,先问一句"这个条件在做决定的那一刻已知吗?"

# 错误:用未来才知道的信息决定今天
if signal_today and returns_future_3d > 0.05:
    enter(day=t)

# 正确:把动作时点移到"该条件成立的时点"
# 条件在 t+3 才已知,那就在 t+3 才能动作
if signal_today and returns_between(t, t+3) > 0.05:
    enter(day=t + 3)   # 决策与执行都发生在信息已知之后

具体做法分三步:

  1. 给每个条件标注"信息可见时点"。把回测里用到的每一个变量,都标注它最早在哪个时间点可以获得。
  2. 决策时点只能晚于或等于信息可见时点。如果某条件要三天后才成立,那么动作最早也只能发生在第三天。
  3. 重跑对照。修正前后各跑一次,看收益差距。如果差距巨大(比如从年化 30% 掉到 3%),说明之前的"优势"就是泄漏出来的。

一个实用的自检清单:任何一处用了 .shift(-1)、[i+1]、future、next_、after 之类字样的地方,都值得停下来问一遍"当时看得到吗"。

延伸与预防

前视偏差最隐蔽的地方在于,它不只是"写错了",而常常是"逻辑上就自带了未来"。防御它有个统一的心法:按时间顺序模拟真实运行——从最早的一天开始,每次只允许使用"截止到当天收盘为止"的数据,做一次决策,走一天,再进入下一天。这种"逐日推进"的回测框架虽然慢,但它天然杜绝了大部分的泄漏。

另外,要区分"前视偏差"和"过拟合":过拟合是模型记住了噪声,前视偏差是模型偷看了答案。前者的修法是简化模型,后者的修法只有一条——把决策时点对齐到信息可见时点。任何一条漂亮的回测曲线,在相信它之前,都值得先接受这次"审问"。

评论(0)

  • 还没有评论,来抢沙发~

相关文章