Skip to content

4.2 回测框架与方法论

核心概念

回测(Backtesting) 是量化策略开发的核心环节——用历史数据模拟策略表现。但统计学家会告诉你:"过去的表现不代表未来结果。"

回测方法论三支柱

支柱内容常见错误
数据清洗复权处理、幸存者偏差剔除(仅保留还存活的标的,高估历史收益)、分红拆股调整使用未复权数据
逻辑验证确保信号只使用当时已知信息前瞻偏差(信号中用到了当时还看不到的未来数据)
稳健性检验Walk-Forward、蒙特卡洛、多市场验证数据窥探偏差(反复测试同一数据集,偶然发现的虚假规律被误认为有效)

Walk-Forward 分析

将历史数据分为训练集(In-Sample)测试集(Out-of-Sample),在训练集优化参数后在测试集验证。循环前进:

[训练期1 → 验证期1] → [训练期2 → 验证期2] → [训练期3 → 验证期3]

手工计算:Sharpe Ratio 的前瞻偏差修正

问题:一个策略在回测中报告年化 Sharpe Ratio = 2.5,但发现信号中使用了"未来数据"(如当日收盘价计算开盘信号)。调整后 Sharpe 会变成多少?

原始计算(含前瞻偏差)

假设:策略在2019-2023年(5年)月收益率数据如下:

月份原始策略收益率(错误地使用未来信息)
1月+5.2%使用了月末数据产生月初信号
2月+4.8%同上
3月+3.1%
4月-1.2%
5月+6.5%
6月+2.0%
7月-0.5%
8月+4.2%
9月+3.8%
10月+1.5%
11月-0.8%
12月+5.0%

计算

月均收益率:

μm=5.2+4.8+3.11.2+6.5+2.00.5+4.2+3.8+1.50.8+5.012=33.6%12=2.80% \mu_m = \frac{5.2 + 4.8 + 3.1 - 1.2 + 6.5 + 2.0 - 0.5 + 4.2 + 3.8 + 1.5 - 0.8 + 5.0}{12} = \frac{33.6\%}{12} = 2.80\%

月收益率标准差:

σm2.45% \sigma_m \approx 2.45\%

月 Sharpe Ratio:

Sharpem=2.80%0%(假设无风险为0)2.45%=1.143 \text{Sharpe}_m = \frac{2.80\% - 0\% (\text{假设无风险为0})}{2.45\%} = 1.143

年化 Sharpe Ratio(乘 12\sqrt{12}):

Sharpea=1.143×12=1.143×3.464=3.96 \text{Sharpe}_a = 1.143 \times \sqrt{12} = 1.143 \times 3.464 = 3.96

调整后计算(消除前瞻偏差)

修正后,信号使用 t-1 收盘价计算 t 日开盘信号,收益率显著下降:

月份修正后收益率原因
1月+2.1%信号延迟一天,错过跳空
2月+3.0%
3月+1.5%
4月-2.8%亏损加大
5月+3.2%
6月+0.5%
7月-1.8%
8月+1.9%
9月+2.0%
10月+0.3%
11月-2.1%
12月+2.5%

月均收益率:

μm=10.1%12=0.842% \mu_m' = \frac{10.1\%}{12} = 0.842\%

月收益率标准差:

σm2.10% \sigma_m' \approx 2.10\%

调整后的年化 Sharpe

Sharpea=0.842%2.10%×12=0.401×3.464=1.39 \text{Sharpe}_a' = \frac{0.842\%}{2.10\%} \times \sqrt{12} = 0.401 \times 3.464 = 1.39

结论:调整后 Sharpe 从 3.96 暴跌至 1.39——这是真实可实现的水平。


常见回测陷阱

陷阱描述如何避免
前瞻偏差(Look-Ahead Bias)信号使用了未来数据严格对齐数据时间戳
生存者偏差(Survivorship Bias)只回测存活至今的股票使用存活/退市全覆盖数据库
过度优化(Overfitting)参数调整过多拟合历史噪声Walk-Forward + 交叉验证
数据窥探(Data Snooping)反复使用同一数据测试预留 Out-of-Sample 数据
交易成本忽略未考虑滑点Slippage——订单簿深度不足导致的预期价与实际成交价之差,详见 1.2 订单类型)和佣金保守估计成本并做敏感性分析
极端值影响单次极端盈利/亏损扭曲结果使用夏普比率的稳健版本

Quant Link:为什么 90% 的回测在上线后失败?AQR 的研究指出三大原因:①回测假设与现实交易环境存在巨大差异(如假设以收盘价成交、零滑点);②数据挖掘导致的虚假显著性——测试足够多的参数组合总能找到一个"看起来好"的结果(Multiple Testing Bias);③市场状态变化——策略在特定市场环境下有效(如低波动),环境改变后失效。真正的量化基金在回测中会做压力测试,包括2008年金融危机、2020年3月的流动性枯竭。


关键公式总结

概念公式用途
年化 SharpeSharpe=μarfσa\text{Sharpe} = \frac{\mu_a - r_f}{\sigma_a}风险调整后收益
年化(月数据)μa=12μm, σa=σm12\mu_a = 12\mu_m,\ \sigma_a = \sigma_m\sqrt{12}月收益年化
年化(日数据)μa=252μd, σa=σd252\mu_a = 252\mu_d,\ \sigma_a = \sigma_d\sqrt{252}日收益年化
净收益率Rnet=RbrutcostR_{\text{net}} = R_{\text{brut}} - \text{cost}扣除交易成本

下一步4.3 绩效评估指标 → 如何全面评估策略表现。

Built with VitePress