前视偏差
前视偏差是指某项计算使用了在当时尚不可得的信息。常见来源是在更高时间周期的 K线收盘之前就请求了其数值。它会产生无法在实盘中复现的信号和回测结果。在 Pine Script 中,带 lookahead_on 的 request.security 会泄露未来数据;lookahead_off 只返回最后一根已完成的更高时间周期 K线。

含义
前视偏差是回测者的“原罪”:让过去看到了未来。在图表分析中,它主要通过更高时间周期的数据请求出现。如果 15 分钟图表请求日线收盘价,而在当天仍在交易时就拿到了当天的日线收盘价,那么每一根 15 分钟 K线都“知道”当天会在哪里收盘。基于此构建的信号在历史上看似料事如神,在实时行情中却会失效。
在 Pine Script 中,这一开关是明确的:`request.security(..., lookahead=barmerge.lookahead_on)` 会泄露未来数据;`lookahead_off` 只返回最后一根已完成的更高时间周期 K线。其他来源还包括:以 K线的最高价或最低价作为入场价(在 K线收盘前您不可能知道最高价),以及把枢轴点画在枢轴 K线上而非确认时的位置。
前视是相当大一部分重绘现象背后的机制,也是那些收益高得离谱的回测背后的原因。在相信任何策略结果的数字之前,都应先检查它是否存在前视偏差。
如何在图表上识别
- 在代码中,搜索 `lookahead_on`,以及在信号 K线的 `high`/`low` 处成交的逻辑。
- 在回测中,留意那些远超市场实际所能提供的胜率或夏普比率。
- 在 K线回放中,检查图表上的更高时间周期数值是否会在该周期收盘时发生变化。
实战示例
某策略在 4 小时 K线为阳线时于 5 分钟收盘价买入,但读取 4 小时数据时开启了前视。在历史数据中,它会在每根 4 小时阳线的开端买入;而在实盘中,它要等到 K线收盘才能知道这是阳线。这样的回测毫无价值。
在图表上查看,深入阅读
常见问题
前视和重绘是一回事吗?
前视是重绘的原因之一;重绘是可见的结果。即使没有前视,使用未收盘的 K线同样会导致重绘。
前视是否有合理的用途?
仅在为显示而对齐历史数据、并明确修正偏移量时才可使用;绝不能用于信号或入场。
Quantum Algo 的脚本如何避免前视偏差?
每个更高时间周期请求都关闭前视,并读取上一根已完成的 K线。
如何检查回测是否存在前视偏差?
逐根 K线回放;如果历史信号在当时不可能被知道,那么该测试就存在前视偏差。