尾部对冲的成本拖累:保险费到底吃掉多少长期收益
「买保险要花钱」几乎没人反对,但决定性对照不是「买 vs 不买」,而是「买保险 vs 减仓到同样的尾部风险」。20 年 × 2 万条精确配对路径:每月买 90% 虚值看跌,中位 CAGR 从 6.02% 掉到 5.71%(拖累 −0.317pp/年),但同样把 99 分位回撤压到 74.70%,减仓到 85.13% 仓位 + 现金只给 5.657%——对冲反而多赚 +0.048pp。而换成中位回撤口径,判决立刻翻转:减仓多赚 0.149pp。拖累可精确分解:公平定价下对冲其实是赚的(+0.322pp/年,因为跳跃让 CAPM 世界的保险有真实价值),全部 −0.317 来自 35% 的保险加成(−0.639pp)。盈亏平衡加成 16.25% 而实际 35%(安全边际 −53.6%)。赔付率实测 74.23% 对理论 1/(1+0.35)=74.07%,误差 1.53e-03;零对冲安慰剂逐路径偏差精确 0.000e+00。97.92% 的月份在付钱,剔除最好 1% 的月份后年化 −2.24%。最反直觉的是非单调:K=99% 年保费 21.14% 却让 99 分位回撤 74.2% 差于 K=97% 的 71.2%——保费本身就在制造回撤。5 年窗口跑赢率仅 35.85%,10 年 37.58%。样本量红线 219 年。12 宇宙 CV=0.1737
核心结论:尾部对冲的公平比较对象不是「不对冲」,而是「减仓到同样的尾部风险」。 因为降低尾部风险最便宜的办法从来都是少拿一点仓位,而这不需要买任何东西。
一旦换上这个对照组,结论变得非常微妙:同样把 99 分位最大回撤压到 74.70%,买保险的中位 CAGR 是 5.705%,减仓到 85.13% 仓位 + 现金是 5.657% —— 对冲多赚 0.048pp。
但如果换成中位回撤口径,判决立刻翻转:同样把中位回撤压到 44.97%,减仓组给 5.854%,对冲反而少赚 0.149pp。
同一个策略、同一批路径,两个风险口径给出相反的答案。 这不是模棱两可——这恰好说明了尾部对冲在买什么:它买的是分布最右端那一小块,而不是「风险」这个笼统的东西。

一、基准设定#
本文模拟一个最常见的实现:每月买入 1 个月期、执行价 = 90% 现价的看跌期权,名义等于组合市值,到期结算后滚动。
所有参数都是真值,由构造给定:
| 参数 | 值 | 说明 |
|---|---|---|
| 标的年化对数漂移 | 7% | 已做跳跃补偿 |
| 扩散年化波动 | 16% | |
| 危机跳跃强度 λ | 0.25 次/年 | 约四年一次 |
| 跳跃幅度 | ~ N(−18%, 10%) | 对数空间 |
| 无风险利率 | 2% | |
| 执行价 | 90% 现价 | |
| 保险加成 | 35% | 保费 = 精算公平值 × 1.35 |
| 模拟规模 | 20 年 × 20000 条路径 | 日频,月度滚动 |
关键的建模选择:保费不用 Black-Scholes 定价,而是用精算公平值 × (1+加成)。
原因是 BS 假设对数正态,而这个世界里有跳跃。用一个平坦的隐含波动去给虚值看跌定价,会得到一个系统性低于真实期望赔付的价格——那样模拟出来的「对冲」会凭空变成一门赚钱生意(第一版就是这样,赔付率 150%,对冲白赚 1.04pp/年)。
改用精算公平值之后,赔付率有了精确的理论预期:
- 理论 1/(1+0.35) = 74.074%
- 实测 74.227%
- 偏差 1.53e-03
保费本身也做了核对:单月期权价 0.0020978,× 12 = 2.5174%/年,与模拟累计保费的偏差 1.39e-17。
关键对照组:不对冲的组合与对冲的组合共用同一组随机数,精确配对。两者的一切差异,100% 来自对冲本身。
二、三条安慰剂#
安慰剂 C(先看这条):对冲比例 = 0。 保留全部代码路径,只把名义设为零。
- 中位 CAGR 拖累 0.000000
- 逐路径净值最大绝对偏差 0.000e+00
- 最大回撤最大偏差 0.000e+00
精确为零,不是「约等于」。实现层面没有任何泄漏。
安慰剂 A:公平定价(加成 = 0)。 保费精确等于真实期望赔付,保险公司一分钱不赚。
| 指标 | 基准(加成 35%) | 公平定价 |
|---|---|---|
| 中位 CAGR 拖累 | −0.317pp | +0.322pp |
| 年保费 | 2.517% | 1.865% |
| 赔付率 | 74.23% | 100.80% |
| 跑赢不对冲的路径占比 | 37.60% | 56.10% |
在公平定价下,买尾部保险是划算的——中位 CAGR 提高 0.322pp。
这个结果值得停一下。保费在期望上精确等于赔付(赔付率 100.80%,误差 0.8%),按线性期望,两边应该打平。但中位数变好了,因为避免大幅回撤本身有几何价值:损失 50% 需要赚 100% 才能回本。对冲把左尾切掉,提升了长期复合增长率——这是 Jensen 不等式在起作用,与择时能力无关。
于是拖累可以精确分解:
| 项 | 值 |
|---|---|
| 公平定价下的几何收益 | +0.322 pp/年 |
| 35% 加成的成本 | −0.639 pp/年 |
| 合计(实测) | −0.317 pp/年 |
尾部对冲本身是有价值的,被吃掉价值的是保费的加成。 这两件事在实务讨论里经常被混为一谈——「对冲是负期望所以不要做」这个说法,在这个模型里是错的;正确的说法是「以当前市场价格买入是负期望」。
盈亏平衡加成是 16.25%,而基准是 35%。安全边际 −53.6%。
安慰剂 B:无跳跃。 把危机跳跃关掉,只留扩散:
- 中位 CAGR 拖累 −0.046pp(几乎为零,因为 90% 虚值的期权在纯扩散世界里基本不赔付)
- 赔付率 74.42%(加成结构不变,符合预期)
- 99 分位回撤:不对冲 70.46% vs 对冲 70.20%(几乎没有改善)
- 跑赢率 33.68%
保险的标的消失后,保险就只剩成本。 这条安慰剂确认了赔付确实来自跳跃,不是来自扩散段的噪音。

三、97.92% 的月份在付钱#
这是理解尾部对冲最重要的一张图。
把每个月「对冲组合 − 不对冲组合」的相对收益拿出来(共 480 万个月观测):
| 指标 | 值 |
|---|---|
| 均值 | −0.0557% |
| 中位 | −0.2113% |
| 收益为负的月份占比 | 97.92% |
| 收益为正的月份占比 | 2.08% |
| 最好 1% 月份的平均 | +12.88% |
| 最好 5% 月份的平均 | +2.92% |
| 单月最好 | +48.93% |
| 剔除最好 1% 后的均值 | −0.1864%(年化 −2.24%) |
剔除最好 1% 的月份,这个策略年化亏 2.24%。 全部价值集中在 480 万个月份里的那 4.8 万个。
这个结构有一个直接的实务后果:任何基于「最近表现」的评估,都会在错误的时点做出错误的决定。 在一个没有危机的 3 年里,对冲的拖累是持续的、可见的、每个月都在账单上;而它的价值是一次性的、不可预测的、只在最糟的那个月出现。
这也解释了为什么尾部对冲基金的资金流是顺周期的:危机后大量流入(刚看到赔付),平静期持续流出(每月都在亏)。而这恰好是最差的时点选择——危机后保险最贵,平静期最便宜。

四、非单调:更贵的保险给出更差的保护#
这是全文最反直觉的结果。
扫描执行价(虚值程度),其余不变:
| 执行价/现价 | 年保费 | 中位 CAGR 拖累 | 99 分位回撤 | 年赔付次数 |
|---|---|---|---|---|
| 99% | 21.14% | −5.023pp | 74.2% | 4.27 |
| 97% | 12.02% | −2.593pp | 71.2% | 2.57 |
| 95% | 6.85% | −1.283pp | 72.3% | 1.37 |
| 92% | 3.46% | −0.562pp | 73.8% | 0.47 |
| 90%(基准) | 2.52% | −0.371pp | 74.6% | 0.26 |
| 85% | 1.32% | −0.173pp | 76.5% | 0.13 |
| 80% | 0.60% | −0.079pp | 78.7% | 0.08 |
| 70% | 0.06% | −0.001pp | 81.6% | 0.01 |
| 不对冲 | 0 | 0 | 81.9% | — |
看第一行和第二行。K=99% 的年保费是 21.14%,几乎是 K=97%(12.02%)的两倍,但它的 99 分位回撤(74.2%)反而比 K=97%(71.2%)更差。
原因很直白:保费本身就是回撤。 每年花掉 21.14% 的净值去买保险,这笔支出是确定的、持续的、直接计入净值曲线的。在一段没有危机的时期里,光是付保费就能造出可观的回撤——而保险赔付并不会在那段时间到来。
尾部保护最强的档位是 K=97%(99 分位回撤 71.2%),不是最贵的 K=99%。「买更接近平值的保护」这个直觉,在超过某个点之后会自我抵消。
而单位回撤改善最便宜的档位是 K=80%:花 0.60%/年 的保费,换 3.1pp 的 99 分位回撤改善,每 1pp 改善的成本约 0.026pp/年。K=97% 的同一指标是 0.246pp —— 贵 9.5 倍。
便宜的深度虚值保险效率最高,但它提供的绝对保护量很小。 这是个真实的权衡,不是「哪个更好」的问题。

五、危机要多频繁,保险才回本#
扫描跳跃强度:
| 跳跃强度 | 中位 CAGR 拖累 | 赔付率 | 跑赢率 |
|---|---|---|---|
| 0 次/年 | −0.046pp | 74.4% | 33.68% |
| 0.25(基准) | −0.371pp | 74.7% | 37.40% |
| 0.60 次/年 | −0.693pp | 74.6% | 36.90% |
| 1.30 次/年 | −1.366pp | 74.2% | 33.00% |
注意:拖累随危机频率单调恶化,而且全区间没有过零点。
这是因为保费是按精算公平值定价的——危机变多,保费同步变贵,加成 35% 这个比例不变,于是买方永远付出那 35%。赔付率在全区间稳定在 74% 左右,正是这个机制的体现。
这个结果推翻了一个常见说法:「如果未来危机比历史更频繁,尾部对冲就会赚钱。」在一个保险定价会跟随风险调整的市场里,不会。 只有当你对危机频率的判断优于卖方时,才会赚钱——而那是一个关于信息优势的论断,不是关于尾部风险本身的论断。
对冲比例的扫描则是单调且温和的:
| 对冲比例 | 中位 CAGR 拖累 | 中位回撤 | 99 分位回撤 |
|---|---|---|---|
| 0 | 0 | 48.3% | 81.9% |
| 0.25 | −0.063pp | 46.7% | 79.3% |
| 0.50 | −0.183pp | 45.8% | 77.0% |
| 1.00 | −0.371pp | 44.9% | 74.6% |
| 1.50 | −0.612pp | 45.3% | 73.9% |
注意 1.50 那一行的中位回撤反而回升(45.3% > 44.9%),而 99 分位继续改善。过度对冲开始用中位数的钱去买更深的尾部——同样是保费制造回撤的效应。
六、保护是真的,而且只在尾部#
分位数上的对照非常干净:
| 最大回撤分位 | 不对冲 | 每月买保险 | 改善 |
|---|---|---|---|
| 50 分位 | 48.12% | 44.97% | +3.15pp |
| 95 分位 | 72.55% | 65.72% | +6.83pp |
| 99 分位 | 81.76% | 74.70% | +7.06pp |
改善随分位数单调增强。 这确认了买到的确实是尾部保护,而不是全局的波动率降低。
收益分布的两端:
| 分位 | 不对冲 | 对冲 |
|---|---|---|
| 5 分位 CAGR | −1.426% | −0.680% |
| 中位 CAGR | 6.022% | 5.705% |
| 95 分位 CAGR | 13.424% | 12.205% |
左尾改善 0.746pp,右尾牺牲 1.219pp。 这是一个明确的分布重塑:削掉右边补贴左边,中位数付出 0.317pp 的代价。
如果你的效用函数在左尾足够陡(例如有强制平仓线、有赎回压力、有负债端约束),这笔交易是划算的。如果没有,它就只是把钱从一个口袋换到另一个口袋,中间被收了 0.317pp 的过路费。

七、样本量红线:219 年#
月度相对收益的均值 −0.0557%,标准差 1.428%,信噪比 0.039。
要以 |t| = 2 确认这个拖累真实存在,需要 2630 个月 = 219.1 年。
而 5 年滚动窗口的跑赢率是 35.85%,10 年窗口 37.58%。
把这两个数字放在一起看:你需要 219 年才能在统计上确认对冲是亏的,但每个 10 年窗口里有 62% 的概率它看起来确实是亏的。 这两件事不矛盾——前者说的是精确估计拖累的大小,后者说的是判断符号。
实务含义很直接:关于「尾部对冲值不值得」的争论,在任何人的职业生涯长度内都无法用实证数据解决。 双方都能找到支持自己的窗口。这也是为什么这个话题每次危机后都会重新吵一遍。
12 个独立宇宙的中位拖累:CV = 0.1737。明显高于本系列其他文章(多数在 0.01~0.07),而这个数字本身是信息:拖累的估计值高度依赖样本里恰好发生了几次危机——这正是样本量红线 219 年的另一种表述。
八、代码实现#
import numpy as np
from math import sqrt, exp
TD, TENOR = 252, 21
MU, SIG, RF = 0.07, 0.16, 0.02
JLAM, JMU, JSD = 0.25, -0.18, 0.10
MONEYNESS, LOAD = 0.90, 0.35
def fair_premium(mu, sig, jlam, jmu, jsd, moneyness, tenor, n=4_000_000):
"""精算公平保费 = 真实测度下的期望赔付(贴现)。
不用 Black-Scholes:BS 假设对数正态,会系统性低估含跳跃分布的虚值看跌。"""
rng = np.random.default_rng(987654321)
dt = 1.0 / TD
drift = (mu - jlam * jmu - 0.5 * sig ** 2) * dt
sq, tot, done = sig * sqrt(dt), 0.0, 0
while done < n:
b = min(200_000, n - done)
z = rng.standard_normal((tenor, b))
jn = rng.random((tenor, b)) < jlam * dt
jz = jmu + jsd * rng.standard_normal((tenor, b))
st = np.exp((drift + sq * z + np.where(jn, jz, 0.0)).sum(axis=0))
tot += float(np.maximum(moneyness - st, 0.0).sum())
done += b
return tot / n * exp(-RF * tenor / TD)
def simulate(n_paths=20000, n_months=240, load=LOAD,
moneyness=MONEYNESS, hedge_ratio=1.0, seed=20260807):
rng = np.random.default_rng(seed)
dt = 1.0 / TD
drift = (MU - JLAM * JMU - 0.5 * SIG ** 2) * dt
sq = SIG * sqrt(dt)
prem = hedge_ratio * fair_premium(MU, SIG, JLAM, JMU, JSD,
moneyness, TENOR) * (1 + load)
eq_n = np.ones(n_paths); eq_h = np.ones(n_paths)
peak_n = np.ones(n_paths); peak_h = np.ones(n_paths)
mdd_n = np.zeros(n_paths); mdd_h = np.zeros(n_paths)
for m in range(n_months):
eq_h_open = eq_h * (1 - prem) # 月初扣保费
# 一次性生成整月 21 天:两条腿共用同一组随机数(精确配对)
z = rng.standard_normal((TENOR, n_paths))
jn = rng.random((TENOR, n_paths)) < JLAM * dt
jz = JMU + JSD * rng.standard_normal((TENOR, n_paths))
gross = np.exp(drift + sq * z + np.where(jn, jz, 0.0))
cum = np.cumprod(gross, axis=0)
path_n = eq_n * cum
path_h = eq_h_open * cum
# 向量化 running peak:历史峰值与月内累计最高取大
pk_n = np.maximum(peak_n[None, :], np.maximum.accumulate(path_n, axis=0))
pk_h = np.maximum(peak_h[None, :], np.maximum.accumulate(path_h, axis=0))
mdd_n = np.maximum(mdd_n, (1 - path_n / pk_n).max(axis=0))
mdd_h = np.maximum(mdd_h, (1 - path_h / pk_h).max(axis=0))
peak_n, peak_h = pk_n[-1], pk_h[-1]
# 月末结算:名义 = 月初市值
payoff = hedge_ratio * np.maximum(moneyness - cum[-1], 0.0)
eq_n = path_n[-1]
eq_h = path_h[-1] + payoff * eq_h_open
yrs = n_months * TENOR / TD
return eq_n ** (1 / yrs) - 1, eq_h ** (1 / yrs) - 1, mdd_n, mdd_hpython三个容易踩的坑:
1. 不要用 BS 给这个期权定价。 第一版用了平坦 IV × 1.35 的 BS 价,结果赔付率 150% —— 保险被系统性低估,对冲白赚 1.04pp/年,整篇文章的结论会完全反过来。含跳跃的分布,虚值看跌的真实期望赔付远高于对数正态给出的价格。换成精算公平值 × (1+加成) 之后,赔付率精确落在理论值 74.07% 上。
2. 月度收益的分母口径必须一致。 对冲组合的月初净值要用扣保费之前的值,否则保费会被算进「收益」里,得到一个有偏的相对收益序列。
3. 回撤要在日频上算,不能只在月末采样。 月末采样会系统性低估最大回撤——跳跃通常在月内发生并部分反弹。但逐日 Python 循环跑 5040 步 × 35 次扫描是不可行的(第一版就卡死了)。解法是按月分块:外层 240 个月,内层 21 天一次性生成,用 np.maximum.accumulate 向量化算 running peak。
九、什么时候该买,什么时候不该#
该买的情况:
- 有硬性平仓线或负债端约束。 如果 −60% 的回撤会触发强制清算或大规模赎回,那么「99 分位回撤从 81.8% 降到 74.7%」不是一个统计学改善,而是生存与否的区别。此时中位数上那 0.317pp 是完全值得的。
- 买的是深度虚值。 K=80% 每 1pp 回撤改善只要 0.026pp/年,是 K=97% 的 1/9.5。如果目的是防灾而不是平滑净值曲线,越虚值效率越高。
- 在平静期买。 这个模型里加成是固定的,现实中不是——加成在危机后飙升、在平静期压缩。资金流恰好反着来。
不该买的情况:
- 目的是「降低波动」或「提高 Sharpe」。 中位回撤口径下,减仓到 92.67% 仓位就能达到同样效果,还多赚 0.149pp。尾部对冲不是减仓的高级版本,它是一个只在极端分位数上起作用的工具。
- 用近 3~5 年表现来评估。 5 年窗口跑赢率 35.85%,而 97.92% 的月份在付钱。任何基于近期业绩的评估都会在最糟的时点砍掉这个头寸。
- 相信「危机变多所以对冲会赚钱」。 危机频率从 0 拉到 1.3 次/年,拖累从 −0.046pp 单调恶化到 −1.366pp,全区间无过零点。保费会跟着涨。
最后回到那个分解。在公平定价下,尾部对冲的中位 CAGR 是 +0.322pp/年——它是有价值的。 实际的 −0.317pp,全部来自 35% 的加成,而盈亏平衡加成是 16.25%。
所以真正的问题从来不是「要不要对冲尾部」,而是:你付的这个加成,是 16% 以下还是 35% 以上? 这个数字在市场上每天都在变,而它才是唯一决定答案的东西。