CPPI 组合保险:用动态乘数在保本底线上追逐风险资产
保本理财背后那个只有一行公式的引擎:风险敞口 = m ×(当前净值 − 保本底线),缓冲垫厚就敢上仓位、缓冲垫薄就自动撤退、归零则永久躺平。四年合成行情实测(m=4,底线 80%):熊市里风险资产跌 63.6% 而 CPPI 只回撤 19.1%、终值守住 0.867;代价是牛市 1.737 跑输买入持有的 1.795。600 次蒙特卡洛把这笔交易的账算清楚——CPPI 跌破 0.8 的概率 0.0%、买入持有 16.7%、恒定混合 60/40 是 6.0%,但 CPPI 中位数 1.006 反而低于买入持有的 1.145:它砍掉的左尾是真的,付出的右尾也是真的。最反直觉的是三条边界:震荡市里 CPPI 输给买入持有(0.911 vs 0.971)却仍赢在回撤减半,因为它天生高抛低吸的反面是波动侵蚀;乘数扫描显示换手先升后降(m=3 年均 2.2、m=10 降到 0)——高 m 长期顶满仓根本不需要调仓;再平衡频率的杀伤力全在尾部,每日调仓破底率 0%、季度调仓 22%,而平均终值几乎无差别(1.157 vs 1.159)。理论上 1/m 是能扛住的最大跳空,实测 m=8 在 17.5% 跳空处失守(理论 12.5%),保本承诺在缺口风险面前只是概率陈述(中阶)。
一行公式撑起整个保本理财行业#
你在银行看到的”保本浮动收益”、“90% 保本型 FOF”、“目标保底净值 0.85”,绝大多数底下跑的都是同一个东西,而它的核心只有一行:
风险敞口 = m × (当前净值 − 保本底线)plaintext括号里那部分叫缓冲垫(cushion),是你距离”输不起的那条线”还有多远。乘数 m 决定你把这段安全距离放大几倍去买风险资产。
Perold 和 Black-Jones 在 1980 年代把它形式化为 CPPI(Constant Proportion Portfolio Insurance,固定比例组合保险)。它的行为直觉一句话讲完:
- 赚钱 → 净值抬高 → 缓冲垫变厚 → 加仓
- 亏钱 → 净值下滑 → 缓冲垫变薄 → 减仓
- 亏到贴着底线 → 缓冲垫归零 → 清仓,永久躺平
最后那条是全部安全性的来源,也是全部代价的来源。理解 CPPI 的关键不在于它怎么保本——那是显然的——而在于它为这份保本付出了什么。这篇文章就是把那笔账算清楚。
引擎实现#
完整实现比大多数人想象的短。需要小心的只有两处:底线本身按无风险利率增长(保本是终值口径的承诺),以及不再平衡的日子里权重会随市场自然漂移。
import numpy as np
TD = 252
RF = 0.02 # 无风险年化
FLOOR0 = 0.80 # 保本底线 = 期初净值的 80%
def run_cppi(prices, m, floor_ratio=FLOOR0, rf=RF, w_cap=1.0,
rebal=1, tc=0.0, ratchet=False):
n = len(prices)
rf_d = rf / TD
V = np.zeros(n); V[0] = 1.0 # 组合净值
F = np.zeros(n); F[0] = floor_ratio
W = np.zeros(n) # 风险资产权重
peak, w_prev = 1.0, None
for t in range(1, n):
# 底线随无风险利率增长:承诺的是到期日的保本
F[t] = F[t - 1] * (1 + rf_d)
if ratchet:
F[t] = max(F[t], peak * floor_ratio)
cushion = max(V[t - 1] - F[t], 0.0)
w_target = min(m * cushion / V[t - 1], w_cap) # w_cap=1.0 即不加杠杆
if (t - 1) % rebal == 0 or w_prev is None:
if w_prev is not None and tc > 0:
V[t - 1] *= (1 - abs(w_target - w_prev) * tc)
w = w_target
else:
w = w_prev # 非调仓日沿用旧权重
r = prices[t] / prices[t - 1] - 1
V[t] = V[t - 1] * (1 + w * r + (1 - w) * rf_d)
W[t] = w
# 权重漂移:不调仓的日子里,涨了的那部分自然占比更高
w_prev = w * (1 + r) / (1 + w * r + (1 - w) * rf_d)
peak = max(peak, V[t])
return V, F, Wpythonmax(V - F, 0) 那个截断是灵魂:缓冲垫一旦归零,w_target 恒为 0,组合永久转入纯无风险资产。这就是所谓的 cash lock(现金锁死)——后面会看到它既是保险,也是诅咒。
三种行情下它到底在干什么#
用几何布朗运动生成四年(1008 个交易日)行情。为避免”名叫牛市实际在跌”这种标签矛盾,我按实现终值筛选了代表性路径。m=4,底线 80%,每日再平衡。

| 行情 | 风险资产终值 | CPPI 终值 | 风险资产回撤 | CPPI 回撤 |
|---|---|---|---|---|
| 牛市 | 1.795 | 1.737 | −16.8% | −16.8% |
| 熊市 | 0.364 | 0.867 | −70.5% | −19.1% |
| 震荡市 | 0.971 | 0.911 | −32.3% | −15.4% |
下排的仓位曲线比上排的净值曲线更能说明问题:
- 牛市:仓位早早顶到 100% 然后一直贴着上限。缓冲垫越滚越厚,
m × cushion早就超过 1.0,被w_cap截断。此时 CPPI 退化成买入持有,1.737 vs 1.795 的差距只是初期尚未满仓时踏空的那一小段。 - 熊市:仓位从 80% 一路单调下滑到接近 0,然后躺平。风险资产腰斩再腰斩(−63.6%),CPPI 守住 0.867、回撤只有 19.1%。保险生效了。
- 震荡市:仓位在 15%~45% 之间高频抖动,净值 0.911 略输给买入持有的 0.971,但回撤从 32.3% 砍到 15.4%。
牛市那一栏值得多看一眼:CPPI 在单边上涨里的回撤和买入持有完全相同(都是 −16.8%)。因为满仓状态下它就是买入持有,一分钱保护都没有。CPPI 的保护只在净值向底线靠拢时才启动,而牛市中途的回调发生在缓冲垫最厚的时候。
指望它削平牛市途中的颠簸,是对这个工具的误解。
乘数扫描:三条形状完全不同的曲线#
m 是唯一的核心参数。扫描 1 到 10:

| 行情 | m=1 | m=3 | m=10 |
|---|---|---|---|
| 牛市终值 | 1.226 | — | 1.795 |
| 熊市终值 | 0.939 | — | 0.867 |
| 震荡市终值 | — | 0.954 | 0.867 |
三条曲线的形状完全不同,这正是参数选择困难的根源:
- 牛市单调上升:m 越大越好,m=10 时全程满仓,直接吃满 1.795
- 熊市单调下降:m 越大跌得越早越狠,但因为底线兜底,终值下限被锁死在 0.867 附近
- 震荡市倒 U:m=3 时 0.954,m=10 时跌到 0.867
震荡市那条倒 U 是 CPPI 最本质的弱点。CPPI 是天生的追涨杀跌——涨了加仓、跌了减仓。在无趋势的来回震荡里,这个行为模式每次都在相对高位加、相对低位减,反复挨刀。波动侵蚀(volatility decay)不是实现瑕疵,是策略定义的必然推论。
换手那一栏则给出了一个反直觉的发现:年均单边换手在 m=3 时是 2.2,m=10 时反而降到 0。
原因是高 m 让组合长期顶满 w_cap——顶满就不需要调仓了。所以”m 越大交易成本越高”是错的,真实关系是中等 m 的换手最高,因为只有中等 m 才会让仓位长期停在需要频繁微调的区间。
缺口风险:1/m 是理论上的生死线#
CPPI 的保本承诺建立在一个隐含假设上:价格连续,你总有机会在击穿底线前调仓。
跳空缺口直接违反这个假设。
理论很清楚:满仓风险敞口为 m × cushion,若风险资产单日下跌 g,损失为 m × cushion × g。当 m × cushion × g > cushion,即 g > 1/m 时,底线被击穿。
- m=2 → 能扛 50% 单日跳空
- m=4 → 25%
- m=6 → 16.7%
- m=8 → 12.5%
实测(平稳上行 250 天后遭遇单日跳空):

| 乘数 | 理论阈值 1/m | 实测首次破底 |
|---|---|---|
| m=2 | 50.0% | 50% 内未击穿 |
| m=4 | 25.0% | 27.5% |
| m=6 | 16.7% | 20.0% |
| m=8 | 12.5% | 17.5% |
实测阈值系统性地高于理论值。原因是 250 天上涨后缓冲垫已经增厚,且 w_cap=1.0 的无杠杆约束让实际敞口低于 m × cushion。
但方向上理论完全正确:m 越大,能扛住的一夜之间就越小。选 m=8 意味着你在赌单日跳空不超过 17.5%。2020 年 3 月美股熔断、2024 年 8 月日经单日 −12.4%,这类事件的量级离这条线并不遥远。
这里有一个残酷的耦合:正是在市场最需要保护的极端时刻,缺口风险最大,而保本承诺最可能失效。组合保险最不可靠的时候,恰好是你最需要它的时候。
再平衡频率:杀伤力全在尾部#
直觉上,调仓越频繁、跟踪越紧、越安全,但成本越高。我用 40 条随机路径(3 年,10bp 单边成本,m=5)检验:
| 再平衡间隔 | 平均终值 | 平均回撤 | 破底率 |
|---|---|---|---|
| 1 天 | 1.157 | −26.3% | 0% |
| 5 天 | 1.167 | −26.4% | 0% |
| 10 天 | 1.167 | −26.4% | 0% |
| 21 天 | 1.170 | −26.6% | 0% |
| 63 天 | 1.159 | −27.1% | 22% |
看均值你会得出”频率无关紧要”的结论——1.157 到 1.170 的差异完全在噪声范围内,10bp 的成本几乎看不出来。
但最后一列是断崖:季度再平衡的破底率是 22%,每日到月度都是 0%。
这是典型的尾部风险结构。用平均终值或平均回撤这类中心统计量做决策,会完全错过它。日频到月频之间你可以随便选(甚至月频略优,因为少挨了些震荡市里的追涨杀跌),但跨过某个阈值后保本承诺会以离散的方式崩塌。
一个务实的替代方案是阈值触发再平衡:只在实际权重偏离目标超过某个百分比时才调整。它在平静期省下换手,在剧烈波动期自动提高调仓频率——恰好把交易花在刀刃上。
蒙特卡洛:这笔交易的完整账单#
前面都是单条路径或小样本。600 次蒙特卡洛(3 年,μ=6%,σ=20%)给出完整分布:

| 策略 | 均值 | 中位数 | 5% 分位 | 95% 分位 | 跌破 0.8 概率 |
|---|---|---|---|---|---|
| CPPI (m=4) | 1.171 | 1.006 | 0.862 | 1.883 | 0.0% |
| 买入持有 | 1.209 | 1.145 | 0.624 | 2.009 | 16.7% |
| 恒定混合 60/40 | 1.147 | 1.127 | 0.783 | 1.579 | 6.0% |
这张表是全文的结论。
CPPI 兑现了承诺:600 条路径无一跌破 0.8,5% 分位 0.862 远高于买入持有的 0.624。
代价同样真实:中位数 1.006 比买入持有的 1.145 低了 14 个百分点。一半以上的路径里,CPPI 只是勉强跑赢现金。
分布形状比数字更直白:CPPI 的净值分布左侧被 0.8 那条线硬生生截断,同时右侧比买入持有明显更薄。它不是”降低风险且保持收益”,而是把左尾切下来的一部分,连同右尾的一部分,一起换成了确定性。
和恒定混合 60/40 的对比更能说明 CPPI 的定位。60/40 的中位数 1.127 略高于 CPPI 的 1.006,跌破 0.8 的概率 6.0% 也不算高。如果你的约束是”控制风险”,60/40 更简单也更便宜;只有当约束是”绝对不能跌破某条线”时,CPPI 的复杂度才有意义。
这是一个硬约束优化问题,不是收益优化问题。搞混这一点,就会用错工具。
棘轮版:把底线钉在历史新高上#
标准 CPPI 有个明显缺陷:底线永远锚定期初本金。净值涨到 1.8 之后,理论上你可以从 1.8 一路跌回 0.8 而”没有违反承诺”——但没有任何投资者能接受这种事。
棘轮 CPPI(ratchet / TIPP)的修正是让底线跟随净值新高上调:F = max(F, peak × 0.80)。

| 行情 | 标准终值 / 回撤 | 棘轮终值 / 回撤 |
|---|---|---|
| 牛市 | 1.737 / −16.8% | 1.429 / −10.5% |
| 熊市 | 0.867 / −19.1% | 0.890 / −17.0% |
| 震荡市 | 0.911 / −15.4% | 0.913 / −15.1% |
代价集中在牛市:终值从 1.737 掉到 1.429(少赚 17.7%),换来回撤从 16.8% 降到 10.5%。这正好补上了前面指出的那个洞——标准 CPPI 在牛市中途毫无保护,棘轮版把浮盈锁进了底线。
熊市和震荡市里两者几乎无差别,因为底线从未被抬起过。
**棘轮把”保住本金”改成了”保住战果”。**代价是你在每一波上涨中都提前锁死了一部分参与度,且更容易触发 cash lock——一旦从高点回落到棘轮底线,你会在相对高位永久清仓,之后的反弹一分都吃不到。
三盆冷水#
**第一,cash lock 是永久性的,而市场会反弹。**缓冲垫归零后 w_target 恒为 0,此后无论行情多好都与你无关。前面熊市那条路径里 CPPI 在中途就基本清仓了——如果第四年出现 V 形反转,它一分都吃不到。这不是 bug,是保本承诺的数学必然:**要保证不跌破底线,就必须在贴近底线时放弃所有向上参与度。**实务上的缓解手段(设置最低仓位、缓冲垫低于阈值时暂停减仓)本质都是在偷偷放弃保本承诺,做之前请想清楚你在放弃什么。
第二,“保本”是概率陈述,不是保证。缺口风险那一节已经证明,m=8 遇上 17.5% 的跳空就会失守。此外,底线的兑现依赖于无风险资产真的无风险——2022 年债券和股票同步下跌时,“安全”的那一半也在亏钱。宣传材料里的”保本”通常还附带一堆前提:持有到期、发行方不违约、市场不出现极端缺口。CPPI 提供的是在连续价格路径假设下的保本,而危机恰恰是这个假设失效的时刻。
**第三,最优 m 依赖你无法预知的未来行情。**乘数扫描已经很清楚:牛市里 m 越大越好,震荡市里 m=3 附近最优,熊市里 m 越小越好。你必须在事前选定一个 m,而它的表现完全取决于事后才知道的 regime。常见的”波动率自适应 m”(如 m = 目标风险 / 已实现波动)是个合理方向,但它把参数选择问题换成了波动率预测问题——而波动率在崩盘时的跳变速度往往快过任何估计窗口的反应速度。没有免费的午餐,只有换个地方交的学费。
什么时候该用它#
用一个判据自检:你有没有一条真正硬的底线?
- 有明确的绝对底线(保本理财产品、养老金给付下限、监管资本约束、“这笔钱明年要付首付”)→ CPPI 是为你设计的。它把一个软性的风险偏好问题变成硬约束满足问题,而且实现只有几十行代码。
- 只是”想少亏点” → 用 60/40 恒定混合。前面的数据显示它中位数更高、复杂度更低、无 cash lock 风险,唯一劣势是不给绝对保证。
- 追求长期最大化终值 → 别用 CPPI。中位数 1.006 vs 买入持有 1.145 已经说明一切,你在为一份不需要的保险持续付费。
参数上,如果确实要用:
- m 取 3~5:能扛 20%~33% 的单日跳空,换手也在可控范围
- 底线设 80%~90%:太高会让缓冲垫从一开始就薄到没有参与度
- 月频或阈值触发再平衡:日频没有额外收益,季度频率的 22% 破底率不可接受
- 想保住浮盈就上棘轮,但接受牛市少赚约 18% 和更早触发 cash lock
最后一句:CPPI 不是一个能让你赚更多钱的策略,它是一个能让你在特定情形下不被迫离场的机制。当你的负债端有刚性约束时,“不被迫离场”本身就值那笔保费。没有这个约束还去买这份保险,就只是白交钱。