跳转到内容

自助法与蒙特卡洛

夏普比率、最大回撤、t 值的解析置信区间都建立在"收益独立同分布"之上,而真实收益自相关、异方差、厚尾俱全。重抽样绕开解析推导:直接用数据自身的经验分布回答"这个统计量有多不稳定"。

普通(i.i.d.)自助法逐条随机抽取收益,破坏时间序列的自相关结构——而自相关恰恰决定波动率聚集与回撤形态。金融数据应使用:

  • 块自助法(block bootstrap):连续抽取长度为 LL 的块,块内保留自相关。LL 的经验法则取 T\sqrt{T} 量级;
  • 平稳自助法(stationary bootstrap):块长随机(几何分布),平均块长仍为 LL,对非平稳更稳健。
block-bootstrap.py
import numpy as np
def block_bootstrap_ci(returns: np.ndarray, stat, n_boot: int = 2000,
block: int = 21, alpha: float = 0.05, seed: int = 42) -> tuple:
"""returns: 日收益序列;stat: 统计量函数(如年化夏普)"""
rng = np.random.default_rng(seed)
T = len(returns)
stats_ = []
for _ in range(n_boot):
idx = []
while len(idx) < T:
start = rng.integers(0, T)
idx.extend((start + np.arange(block)) % T)
sample = returns[idx[:T]]
stats_.append(stat(sample))
lo, hi = np.quantile(stats_, [alpha / 2, 1 - alpha / 2])
return float(lo), float(hi)
# 用法:年化夏普的 95% 置信区间
# ann_sr = lambda r: r.mean() / r.std() * np.sqrt(252)
# block_bootstrap_ci(daily_excess, ann_sr, block=21)

一条 3 年日频、SR=1\mathrm{SR}=1 的策略,块自助法给出的 95% 区间通常接近 ±0.7\pm 0.7——与解析结果一致,但不需要任何分布假设。

  • 蒙特卡洛:先假设一个收益生成过程(如 GARCH + 学生 t),反复模拟策略在该过程下的表现分布。结论只在其假设的生成过程内有效——若策略吃的是过程里没建模的效应,蒙特卡洛看不出问题。
  • 重排检验(permutation test):把信号序列随机平移或反转,看"对齐后"的收益是否显著优于"错位后"的原分布。它不依赖任何收益分布假设,是检验择时类策略是否只是运气的利器。
  • 回测报告的每个关键指标(SR、年化、最大回撤)都给 bootstrap 置信区间;
  • 评估择时信号用重排检验,评估分布假设下的稳健性用蒙特卡洛;
  • 记住重抽样的根本局限:它回答"这个统计量在此样本下多不稳定",不能回答"未来分布是否改变"。
  • 普通自助法破坏序列相关,金融数据应用块自助法或平稳自助法
  • 蒙特卡洛的结论只在其假设的生成过程内有效
  • 用重排检验(permutation test)评估择时策略