什么是回测中的前视偏差(Look-Ahead Bias)?
前视偏差(look-ahead bias)是指回测中的策略使用了做出交易决策时本不可能获得的信息,例如以生成信号的同一个收盘价成交。防止方法是在下一根K线开盘时执行、使用时点数据,并且只用复权价格计算收益。
前视偏差(look-ahead bias)是回测中最隐蔽的错误之一,因为它往往看不见。你的策略使用了交易发生时本不可能获得的信息,从而以在实盘中无法复现的方式夸大结果。对于任何严肃的量化分析,理解并消除前视偏差都是必不可少的。
定义
当回测系统使用了在做出交易决策时不可能知道的数据时,就会产生前视偏差。这相当于读明天的报纸来做今天的交易。任何包含未来信息的回测都会产生不切实际的好结果——而且在实盘交易中完全无法复现。
这种偏差可能在多个层面引入:数据本身(追溯调整的价格)、信号逻辑(用同一根K线的收盘价执行)、标的池选择(根据未来结果挑选股票),或基本面数据(在盈利数字公开发布之前就使用它们)。
示例:同一根K线执行
这是最常见的形式。你的策略用当前K线的收盘价计算指标,然后以同一个收盘价执行交易。问题在于:在实时环境中,K线收盘之前你无法知道收盘价。到那时,你只能在下一根K线的开盘执行,而不是在当前K线的收盘执行。
影响看起来很小——只延迟一根K线——但可能非常巨大。如果一只股票隔夜跳空 2%,而你的策略指望以昨天的收盘价入场,那么你每笔交易的实际收益就比回测显示的差 2%。经过数百笔交易,这个差距会累积成完全不同的策略表现。许多在同一根K线执行时看似盈利的策略,改为下一根K线执行后就变得亏损。
示例:未来的财报数据
假设你的策略在市盈率跌破 10 时买入股票。市盈率需要盈利数据——但这些盈利实际上是什么时候公布的?如果你在 1 月 10 日的交易决策中使用了 3 月 15 日才发布的年度盈利,你就使用了来自未来的数据。
这在基本面因子回测中出奇地常见。大多数数据库把最终公布的盈利数字关联到它所覆盖的财务期间,而不是发布日期。第四季度财报覆盖 10 月至 12 月,但可能要到 2 月才发布。任何在 12 月的交易决策中使用第四季度盈利数据的回测都存在前视偏差。
解决办法是使用时点数据(point-in-time data)——记录每个特定日期当时已知信息的数据库,而不是我们现在回头看所知道的信息。Compustat 的 point-in-time 数据集及类似产品正是为解决这一问题而存在的。
示例:追溯调整的价格
当一家公司进行 2:1 拆股时,数据提供商会追溯性地把所有历史价格减半,使图表看起来连续。当一家公司派发 1 美元股息时,复权收盘价序列会把之前所有价格减去 1 美元。这对计算收益很有用,但它改写了历史。
设想一个在 50 日 SMA 上穿某个特定价格水平时买入的策略。如果发生拆股,所有历史 SMA 都会用新的复权价格重新计算,可能产生当时并不存在的交叉信号。2019 年的交易者看到的是不复权价格;2024 年的回测看到的是拆股复权后的价格。它们是不同的序列,可能产生不同的信号。
最佳实践:复权价格只用于收益计算和组合价值跟踪。信号生成和指标计算使用不复权价格(或经过谨慎时点调整的价格)。
如何发现前视偏差
发现前视偏差需要对回测流程进行系统性审计:
- 执行时机检查:为每笔交易打印信号生成时间戳和执行时间戳。如果它们在同一根K线上,就存在前视偏差。
- 数据可得性审计:对信号生成中使用的每个数据点,确认它在当时已公开可得。这对基本面数据(盈利、营收、业绩指引)尤为重要。
- 敏感性测试:给所有信号执行增加 1 根K线的延迟。如果策略的夏普比率下降超过 30%,很可能是同一根K线执行在夸大结果。
- 模拟交易对比:在实时数据上向前运行策略几周。相对于回测的系统性表现不佳,是流程中某处存在前视偏差的强烈信号。
如何防止前视偏差
预防需要在回测流程的每个阶段保持纪律:
- 始终在下一根K线执行。如果信号在第 N 根K线收盘时生成,就在第 N+1 根K线开盘时执行。这一条规则就能消除前视偏差最常见的来源。
- 使用时点数据。对于基本面因子,确保你使用的是每个历史日期当时可得的数据,而不是追溯重述后的数字。
- 谨慎处理复权。拆股复权和分红复权数据只用于收益计算,不要用于依赖绝对价格水平的信号生成。
- 冻结你的标的池。不要用未来的知识来选择纳入回测的资产。如果你在 S&P 500 成分股上测试策略,就使用每个历史日期当时的 S&P 500 成分股名单,而不是把今天的名单追溯套用。
- 加入执行延迟。加入符合实际的订单成交延迟——即使你的券商能在毫秒内成交,也要加入 1 根K线的延迟作为安全余量,以捕捉任何意外的同一根K线逻辑。
时点数据(Point-in-Time Data)
时点(PIT)数据库按每个历史日期当时已知的样子存储数据。与用重述数字覆盖旧值的标准数据库不同,PIT 数据库保留完整的修订历史。如果一家公司在 10 月 28 日最初公布第三季度盈利为 1.20 美元,后来在 12 月 5 日重述为 1.15 美元,PIT 数据库会记录这两个值及各自的时间戳。
对于主要资产上基于价格的策略,数据修订带来的前视偏差问题较小——价格在收盘时就已确定。但对于任何使用基本面数据的策略(价值投资、质量因子、基于盈利的信号),PIT 数据都是必不可少的。使用 PIT 数据与非 PIT 数据的差别,可能就是一个看起来夏普比率为 1.5 的策略与一个实际夏普比率只有 0.7 的策略之间的差别。
亲自试试
QuantPrompt 默认就被设计为防止最常见的前视偏差形式。在第 N 根K线上由指标交叉或价格条件生成的信号,会自动以下一个可用价格执行,而不是以同一根K线的收盘价执行。这样无需任何特殊配置就能消除同一根K线执行偏差。
想亲眼看看影响,可以描述一个策略,并比较同一根K线执行与下一根K线执行的结果。两者的差异会准确地告诉你,前视偏差把典型的回测收益夸大了多少——以及为什么对于任何你打算投入真金白银交易的策略,消除它都没有商量的余地。
常见问题
参考资料
- Banz, R. W. & Breen, W. J. (1986). Sample-Dependent Results Using Accounting and Market Data: Some Evidence. The Journal of Finance.
- TradingView. Pine Script v6 User Manual: Repainting (future leak with request.security()).
- TradingView. Pine Script v6 User Manual: Other timeframes and data (lookahead parameter).