🔍 数据窥探偏差 · 前视·幸存·选择

样本内/外 · 过拟合识别
① 前视偏差 (Look‑Ahead Bias) 未来信息泄漏

定义:在回测中使用了策略构建时尚未知晓的未来数据,导致绩效虚高。

  • 典型场景: 用未来财报数据调参、使用未来价格计算指标(如未来波动率)。
  • 后果: 回测夏普比率 3.0+,实盘直接崩塌。
  • 防范: 严格按时间顺序滚动训练/测试;只使用截至回测点的信息。
# 前视偏差示例 (错误)
df['signal'] = (df['close'].shift(-1) > df['close'])  # 使用了未来收盘价
📅 时间轴污染
t₀ t₁ (未来数据) t₂ 泄漏
② 幸存者偏差

只关注“幸存”标的,忽略退市/破产样本。 回测收益被系统性高估。

  • 案例: 只选当前仍在交易的股票回测,剔除退市股。
  • 量化影响: 年化收益可能虚高 2%~5% (取决于市场)。
📊 幸存者 vs 全样本
组合年化收益最大回撤
幸存者+14.2%-18%
全样本(含退市)+9.7%-34%
③ 选择偏差

数据选择/时间段/参数选择导致的有偏结论。 常见于“最佳”参数或特定牛市区间。

  • 数据切片偏差: 只选 2008-2012 测试,避开下跌。
  • 多重比较偏差: 1000个策略中选出表现最好的前5个。
  • 缓解: 交叉验证、滚动窗口、正则化。
🎯 选择偏差示意 牛市 熊市 震荡 只选牛市段
④ 样本内 (IS) 与 样本外 (OOS) 测试 过拟合防火墙

样本内: 用于训练/拟合策略参数的数据。
样本外: 未参与拟合、模拟未来未知的数据。

  • 黄金法则: OOS 绩效与 IS 差距过大 → 过拟合。
  • 常见比例: 70% IS / 30% OOS 或 滚动时间序列。
  • 警惕: 多次使用同一OOS调整参数 → 变成“隐式IS”。
# 时间序列分割 (伪代码)
split_idx = int(len(df) * 0.7)
train = df.iloc[:split_idx]   # 样本内
test  = df.iloc[split_idx:]   # 样本外
📈 训练·验证·测试
样本内 (IS) 拟合/调参 样本外 (OOS) 验证/实盘模拟 绩效差距 → 过拟合指标
IS Sharpe OOS Sharpe
📋 偏差对比 & 防范清单
偏差类型本质典型后果防范措施
前视偏差未来信息泄漏回测虚高,实盘崩溃严格时间戳、点进点出
幸存者偏差忽略退市样本收益高估2~5%使用全样本 + 退市数据
选择偏差数据/参数选择偏误统计显著性虚假多重假设检验校正
IS/OOS 失衡样本内过拟合OOS 绩效骤降滚动验证、正则化
✅ 使用walk‑forward分析 ✅ 避免数据 snooping ✅ 设置OOS惩罚项 ✅ 组合交叉验证
🧠 过拟合识别 · 数据窥探防御架构
原始数据 去前视/幸存 清洗 & 对齐 IS / OOS 分割 时间序列 绩效诊断 过拟合反馈 · 调整参数 / 数据

🔁 迭代中避免数据窥探,保持样本外独立性