← 返回目录
p5.6动手⏱ 约 16 分钟

蒙特卡洛与自助法:给结论配一个区间

同一批日收益只换顺序,最大回撤在 -30.3% 到 -60.1% 之间——29.8 个百分点的宽度,全是路径决定的

🔎 最后验证 2026-07📚 来源:5000 次重采样(顺序重排/iid 自助/分块自助)于 2026-07-31 在 ECS 实测,输出见 code/outputs/🧰 numpy 2.5.1、qlab.engine(本课自研)、Python 3.12.13
为什么学这个

到这里为止,我们报告的一直是点估计:年化 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 的策略,照样可能因为市场结构变化而在下一年失效——区间管的是随机性,不管结构性。

五、报告规范

一个数至少要带一个区间。最低要求:

  1. 重采样方法与次数(iid / 分块 + 块长 + 次数 + 随机种子)
  2. 年化与夏普的 95% 区间,不只是点估计
  3. 最大回撤的区间——这是散户最该看、也最少被给出的一个
  4. 超额收益的区间与 P(超额 ≤ 0),而不是只报"跑赢 X 个百分点"
  5. 一句话说明区间不覆盖什么(结构变化、多重检验)
❓ 测验
一份报告写:「策略年化 12%,基准 9%,跑赢 3 个百分点」。你做完分块自助,发现超额的 95% 区间是 [-4.1, +10.2] pp。正确结论是?
✏️ 填空
iid 自助法抹掉了 ___ 聚集,给出的区间偏窄——区间偏窄意味着你会以为结论比实际更确定。

📌 免责:本课为技术教学,标的为沪深300 指数与成分股按代码序取样(非精选),所有回测为历史模拟,不构成投资建议。

✅ 小结

三件事:

  1. 顺序重排回答"路径能有多不同":同一批日收益只换顺序,最大回撤 95% 区间 [-60.10%, -30.34%],宽 29.8 个百分点最大回撤不是策略的属性,是"策略 × 这一次的顺序"的属性
  2. iid 自助的区间是假窄的:它抹掉波动聚集,年化区间 12.58 pp,而分块自助(块长 21 日)是 14.52 pp,宽 15%。块长没有唯一正解——跑几个块长,报最宽的那个
  3. 真正该问的是"区间跨不跨 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 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「顺序重排 5000 次(双均线 5/20,沪深300,4023 个交易日):最大回撤实测 -43.88%,95% 区间 [-60.10%, -30.34%](宽 29.8 pp),中位 -43.81%,实测处于第 50 百分位」
📚 本节 code/monte_carlo.py,2026-07-31 于 ECS 实测(随机种子 20260731),输出见 code/outputs/stdout.txt✓ 已核验 2026-07
「iid 自助 5000 次:年化 95% 区间 [-6.45%, +6.13%](宽 12.58 pp)、夏普 [-0.45, +0.54]、P(年化≤0)=55.2%;分块自助(块长 21 日):年化 [-7.16%, +7.36%](宽 14.52 pp)、夏普 [-0.54, +0.61]、P(年化≤0)=54.4%;分块比 iid 宽 15%」
📚 同上实测✓ 已核验 2026-07
「超额区间:双均线 vs 买入持有实测 -2.00 pp,分块自助 95% 区间 [-10.93, +3.23] pp,P(超额≤0)=86.0%,区间跨 0」
📚 同上实测✓ 已核验 2026-07
「对 p5.2 中唯一跑赢的波动率目标族做同样检验(8 只等权):实测超额 -1.59 pp,95% 区间 [-8.68, +1.69] pp,P(超额≤0)=90.1%,区间跨 0」
📚 本节 code/mc_winner.py,2026-07-31 于 ECS 实测,输出见 code/outputs/winner_stdout.txt✓ 已核验 2026-07
「汇总口径对比:逐股年化再平均(波动率目标 3.58% vs 买入持有 3.00%,超额 +0.58 pp)与日收益等权成组合(4.28% vs 5.87%,超额 -1.59 pp);成分年化波动均值 15.8% vs 31.1%,等权组合波动 10.8% vs 21.3%,B 相对 A 增益 +0.70 pp vs +2.87 pp」
📚 本节 code/agg_check.py,2026-07-31 于 ECS 实测,输出见 code/outputs/agg_stdout.txt✓ 已核验 2026-07
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · p5.7
成本、冲击与容量:一个策略能装下多少钱
继续读下一节 →