蒙特卡洛与自助法:给结论配一个区间
同一批日收益只换顺序,最大回撤在 -30.3% 到 -60.1% 之间——29.8 个百分点的宽度,全是路径决定的
到这里为止,我们报告的一直是点估计:年化 X%、夏普 Y、最大回撤 Z。
但你手上这条净值曲线,只是一次实现。
拿双均线 5/20 在沪深300 上的日收益,一天都不改、只把顺序打乱,重排 5000 次:
最大回撤 实测 -43.88% 95% 区间 [-60.10%, -30.34%] 中位 -43.81%
年化 实测 -0.34% 重排中位 -0.34%(顺序不影响累计收益)
同一批收益,最大回撤的 95% 区间宽 29.8 个百分点。
你实际经历的回撤有多深,很大程度上是顺序决定的——而顺序,是你完全不能控制、也无法预测的那部分。
这一节给三个数字配三个区间,并且回答那个真正该问的问题:"跑赢了"这个结论,区间跨不跨 0?
体检报告写"血糖 5.8"。
医生不会只看这一个数,他会问:这是空腹还是餐后?测了几次?正常范围是多少?
一个没有区间的数,无法判断。
而量化报告里最常见的形式,恰恰是"年化 18%"——孤零零一个数。
一、顺序重排:回答"路径能有多不同"
重排不改变任何一天的收益,也不改变期末累计收益。它只改变路径。
| 实测 | 95% 区间 | 中位 | 实测所处百分位 | |
|---|---|---|---|---|
| 最大回撤 | -43.88% | [-60.10%, -30.34%] | -43.81% | 第 50 百分位 |
| 年化 | -0.34% | (几乎不变) | -0.34% | — |
实测那条路径正好落在中位数附近——运气不算好也不算坏。但区间告诉你:
同样这批收益,你完全可能经历 -60% 的回撤。
这正是 p4.8 那张水下图背后的东西:最大回撤不是策略的属性,是"策略 × 这一次的顺序"的属性。
而 p4.7 用最大回撤算的 Calmar 比率,继承了同样的不确定性——分母本身就有 30 个百分点的浮动。
二、iid 自助法与分块自助法:回答"如果再来一次"
有放回重抽 5000 次,给年化和夏普做区间:
| 方法 | 年化 95% 区间 | 夏普 95% 区间 | P(年化 ≤ 0) |
|---|---|---|---|
| iid 自助(逐日重抽) | [-6.45%, +6.13%] | [-0.45, +0.54] | 55.2% |
| 分块自助(块长 21 日) | [-7.16%, +7.36%] | [-0.54, +0.61] | 54.4% |
区间宽度:iid 12.58 pp,分块 14.52 pp——分块宽了 15%。
iid 自助法给出的区间是"假窄"的。
它把每天当成独立同分布来抽,抹掉了波动聚集(大涨大跌成堆出现)——而真实收益序列里,这种成堆是常态。
后果很直接:区间偏窄 = 你会以为结论比实际更确定。
分块自助法按块重抽(本例块长 21 日,约一个月),保留了块内的自相关与波动聚集,给出的区间宽 15%。
块长怎么选?没有唯一正解。块太短退化成 iid,块太长则样本内可用的块数不够。常见做法是取几个块长(如 5/21/63 日)都跑一遍,报告最宽的那个区间——因为在"高估确定性"和"低估确定性"之间,前者的代价大得多。
三、真正该问的问题:区间跨不跨 0
点估计说"策略比买入持有差 2.00 个百分点"。给这个差值做分块自助:
实测年化差 -2.00 pp(策略 -0.34% − 买入持有 1.66%)
95% 区间 [-10.93, +3.23] pp
P(超额 ≤ 0) 86.0%
→ 区间跨过 0:无法拒绝「两者没有差别」
注意这句话的方向:数据既不能证明策略更好,也不能证明它更差。16 年、4023 个交易日,仍然不足以分辨出一个 2 个百分点的年化差异。
把这套方法用在你最想相信的那个结论上
上面用的是双均线,它本来就是负的,"区间跨 0"不意外。
所以把 p5.2 里唯一跑赢的那个族拉过来,做同样的检验:
波动率目标(8 只等权)年化 4.28% 买入持有 5.87% 实测超额 -1.59 pp
分块自助 95% 区间 [-8.68, +1.69] pp;P(超额 ≤ 0) = 90.1%
区间跨过 0
这才是这套方法真正的用法:先用在你自己最想相信的那个结论上。
这里出现了一个必须解释的口径冲突,不解释就是硬伤。
p5.2 报的是"波动率目标 3.58% vs 买入持有 3.00%,超额 +0.58 pp";这里却是"4.28% vs 5.87%,超额 -1.59 pp"。
两个都没算错,是汇总口径不同:
| 口径 | 波动率目标 | 买入持有 | 超额 |
|---|---|---|---|
| A 逐股算年化再取算术平均 | 3.58% | 3.00% | +0.58 pp |
| B 日收益等权成组合再算年化 | 4.28% | 5.87% | -1.59 pp |
机制:等权日频再平衡把组合波动降下来,而波动拖累约等于方差的一半——成分越波动,能被拿回来的拖累越多。
成分年化波动均值 波动率目标 15.8% 买入持有 31.1%
等权组合年化波动 波动率目标 10.8% 买入持有 21.3%
B 相对 A 的增益 波动率目标 +0.70pp 买入持有 +2.87pp
买入持有的成分本来就更波动(它没有任何降波动作),所以在 B 口径下获益 +2.87 pp,直接把 +0.58 吃成了 -1.59。
"怎么把多只标的汇总成一个数"这件事本身,能改变结论的方向。
它和成本假设(p4.2,74 pp)、读法歧义(p5.1,3.80 pp)、市场状态标签(p5.2,50.4% 重合)属于同一类:都不是计算错误,都能翻转结论,都必须写进规格书(p5.1 第①类:数据口径)。
🔧 动手做:同一批收益,最大回撤能差 30 个百分点(5 分钟)
跑蒙特卡洛脚本,把同一批日收益只打乱顺序 5000 次,看最大回撤的分布。
你会看到(实测):同一批收益、只换顺序,最大回撤 95% 区间是 [-60.1%, -30.3%]——宽 29.8 个百分点。而这条策略对买入持有的超额,区间跨 0,P(超额≤0)=86%。
想明白:一个最大回撤数字根本不构成证据——同样的收益,运气好演成 -30%、运气差演成 -60%。同理"超额 -2pp"看着像输,但区间跨 0,你连"它到底跑赢没"都下不了结论。单点数字骗人,要看区间。
四、这些区间刻画什么,不刻画什么
| 刻画 | 在同一个数据生成过程下重抽,结果会有多分散(抽样不确定性) |
| 不刻画 | ① 策略族选错了 ② 市场结构变了 ③ 你在 218 组参数里挑了最好的那组 |
这三种不确定性,重采样一个都测不出来。 ①② 要靠 p5.5 的滚动前推,③ 要靠 p3.4 的多重检验校正。
所以把区间当成"结论的下限保护"是错的:它只是同一假设下的散布范围。
一个 95% 区间不下穿 0 的策略,照样可能因为市场结构变化而在下一年失效——区间管的是随机性,不管结构性。
五、报告规范
一个数至少要带一个区间。最低要求:
- 重采样方法与次数(iid / 分块 + 块长 + 次数 + 随机种子)
- 年化与夏普的 95% 区间,不只是点估计
- 最大回撤的区间——这是散户最该看、也最少被给出的一个
- 超额收益的区间与 P(超额 ≤ 0),而不是只报"跑赢 X 个百分点"
- 一句话说明区间不覆盖什么(结构变化、多重检验)
📌 免责:本课为技术教学,标的为沪深300 指数与成分股按代码序取样(非精选),所有回测为历史模拟,不构成投资建议。
三件事:
- 顺序重排回答"路径能有多不同":同一批日收益只换顺序,最大回撤 95% 区间 [-60.10%, -30.34%],宽 29.8 个百分点。最大回撤不是策略的属性,是"策略 × 这一次的顺序"的属性
- iid 自助的区间是假窄的:它抹掉波动聚集,年化区间 12.58 pp,而分块自助(块长 21 日)是 14.52 pp,宽 15%。块长没有唯一正解——跑几个块长,报最宽的那个
- 真正该问的是"区间跨不跨 0":双均线超额 -2.00 pp,区间 [-10.93, +3.23],P(超额 ≤ 0)=86.0%;把 p5.2 里唯一跑赢的波动率目标拉来做同样检验,区间 [-8.68, +1.69],同样跨 0
外加一个必须写进规格书的发现:汇总口径能翻转结论。同一批回测,"逐股年化再平均"给出超额 +0.58 pp,"日收益等权成组合"给出 -1.59 pp——机制是等权日频再平衡消除波动拖累,而成分越波动拿回来的越多(31.1% vs 15.8%)。
最后一条边界:区间管的是随机性,不管结构性。它测不出策略族选错、市场结构变化、以及你在 218 组参数里挑了最好的那组。
下一节换一个维度:同样一个策略,放 10 万和放 10 亿,是两回事。冲击成本、容量上限,以及"为什么小资金的回测结果不能外推"。
🔎 来源与核验· 5 条,点开核对
