💡 回测陷阱深度解析
本章详细讲解了回测框架,这里重点强调三个最致命的回测陷阱:
1. 未来函数(Look-ahead Bias)
错误示例:
# ❌ 错误:使用当天收盘价判断买入
if df['close'].iloc[i] > df['open'].iloc[i]:
buy_at_open() # 无法在开盘时知道收盘价!
正确做法:
# ✅ 正确:使用前一天信号
signal = (df['close'].shift(1) > df['ma20'].shift(1))
position = signal.shift(1) # T+1执行
returns = position * df['close'].pct_change()
2. 过拟合(Overfitting)
问题: 参数在历史数据上表现完美,实盘却亏损
解决方案:
# 样本外测试
train = data[:int(len(data)*0.7)] # 训练集70%
test = data[int(len(data)*0.7):] # 测试集30%
# 在训练集优化参数
best_params = optimize(train)
# 在测试集验证
test_return = backtest(test, best_params)
print(f"样本外收益: {test_return:.2%}")
3. 忽略交易成本
现实成本:
- 手续费:0.03%(券商)
- 印花税:0.1%(卖出)
- 滑点:0.05%-0.2%(市场冲击)
def apply_trading_cost(returns, turnover_rate):
"""应用交易成本"""
commission = 0.0003 # 手续费
stamp_tax = 0.001 # 印花税(卖出)
slippage = 0.0005 # 滑点
total_cost = (commission * 2 + stamp_tax + slippage) * turnover_rate
return returns - total_cost
4. 回测指标速查
| 指标 | 计算公式 | 优秀标准 |
|---|
| 夏普比率 | (收益率 - 无风险利率) / 波动率 | > 2.0 |
| 最大回撤 | (谷值 - 峰值) / 峰值 | < 15% |
| 卡玛比率 | 年化收益 / 最大回撤 | > 3.0 |
| 胜率 | 盈利次数 / 总次数 | > 50% |
| 盈亏比 | 平均盈利 / 平均亏损 | > 1.5 |
黄金法则: 策略在考虑交易成本后的夏普比率仍>1.5,才值得实盘!