halo 的技术博客

返回

「我想赚上涨的钱,但最多只亏 20%。」这句话听起来像一句愿望,但在组合保险(Portfolio Insurance)的框架里,它可以被写成一个可执行的仓位公式。最经典的实现之一就是 CPPI(Constant Proportion Portfolio Insurance,恒定比例投资组合保险)

它的核心思想朴素到一句话就能说清:先划出一条绝不让组合跌破的「底线」(floor),把「当前资产 − 底线」当成缓冲垫,只拿缓冲垫的一个倍数去买风险资产。 市场涨,资产离底线远,缓冲垫厚,自动加仓;市场跌,缓冲垫被吃掉,自动减仓。下行约束就这样被「焊」进了每一天的仓位里。

本文用一段带两次崩盘的 6 年日度行情演示 CPPI 的真实表现,并诚实指出它最大的几个陷阱——尤其是一个教科书经常轻描淡写、实盘却要命的 gap risk(跳空风险)

一、CPPI 的数学:把约束变成仓位#

设第 tt 日组合净值为 AtA_t,你设定的保护底线(floor)为 FtF_t。CPPI 定义三个量:

  • 缓冲垫(cushion)Ct=AtFtC_t = A_t - F_t —— 你「亏得起」的空间。
  • 风险敞口(exposure)Et=mCtE_t = m \cdot C_t —— 拿缓冲垫的 mm 倍去买股票/风险资产。mm乘数(multiplier),通常取 3~5。
  • 安全资产(bond)Bt=AtEtB_t = A_t - E_t —— 剩下的钱买债券(无风险或低波动)。

下一日的净值更新为:

At+1=Et(1+rtrisky)+Bt(1+rtsafe)A_{t+1} = E_t(1+r^{\text{risky}}_t) + B_t(1+r^{\text{safe}}_t)

其中 EtE_t 必须 clamp 到 [0,At][0, A_t]:当缓冲垫耗尽(Ct0C_t\le 0),风险敞口直接归零,全部转债券,组合停在底线附近。

直觉上:乘数 mm 越大,越激进——同样的缓冲垫撬动更多股票,上涨时弹性更大,但下跌时 cushion 被吞噬得更快、减仓更剧烈。

CPPI 与买入持有的权益曲线对比

二、Python:一个可直接跑的 CPPI 引擎#

下面这段代码就是生成上方图表的同一套逻辑,去掉了绘图、只留核心。注意 clamp——它保证崩盘时不会出现「负敞口」这种无意义状态。

三、缓冲垫如何变成「自动止损」#

把资产、底线、缓冲垫画在同一张图上,CPPI 的机制就一目了然:

资产价值、底线与缓冲垫的结构

崩盘那天(图中红点),风险资产暴跌,资产净值 AtA_t 下坠;但因为它已经把一部分钱放在债券里,下坠的幅度被缓冲垫吸收了一大部分。更关键的是第二天:新的 cushion 变薄,公式自动把风险敞口 EtE_t 调小,相当于「被动止损减仓」。你不需要手动设止损线——仓位公式替你做了。

这里有一个和「固定比例仓位」的本质区别:普通「永远 60% 股票」在崩盘里照跌 60% 的比例;CPPI 的仓位随 cushion 缩放,跌得越多、仓位越轻,天然带一个加速去杠杆的机制。

四、真实计算结果(6 年,含两次崩盘)#

我跑了一段 1512 个交易日(约 6 年)的行情:风险资产年化 9%、波动 17%,债券年化 2.5%,在第 60% 处注入 −38% 崩盘、第 85% 处注入 −18% 熊市。floor 固定为 0.80。结果:

策略终值最大回撤
买入持有(全仓风险)0.539−72.3%
CPPI m=20.853−45.3%
CPPI m=30.834−53.8%
CPPI m=50.812−58.3%

CPPI 确实把回撤从 −72% 拉到了 −45%~−58% 区间——但注意:它没有把回撤锁死在 20%。这就是下一节的陷阱。

CPPI 与买入持有的回撤对比

五、乘数 mm 的权衡:收益与 cushion 侵蚀#

固定 floor=0.80,扫描乘数 m{1,2,3,4,5,6}m\in\{1,2,3,4,5,6\}

  • 终值:m=10.970,  20.853,  30.834,  40.819,  50.812,  60.809m=1\to0.970,\;2\to0.853,\;3\to0.834,\;4\to0.819,\;5\to0.812,\;6\to0.809
  • 最大回撤:m=125.8%,  245.3%,  353.8%,  457.3%,  558.3%,  658.8%m=1\to-25.8\%,\;2\to-45.3\%,\;3\to-53.8\%,\;4\to-57.3\%,\;5\to-58.3\%,\;6\to-58.8\%

乘数 m 对终值与最大回撤的影响

规律很清楚:mm 越大,上行参与度越高,但回撤也越深、cushion 被吞噬得越快。而且这个市场里 mm 超过 2 之后终值反而下降——因为崩盘太多,更大的敞口只是多吃了跌幅。这告诉我们一个朴素的道理:CPPI 不是「无脑加 mm 就能多赚」,乘数是对「我愿意为上行放弃多少下行保护」的定价。

六、真实陷阱(务必知道)#

  1. Gap risk(跳空风险)——最致命的坑。 CPPI 是「今天看 cushion、明天调仓位」,中间隔着一个交易日。如果风险资产单日暴跌(比如 −38%),当天你还是满敞口,这一天的亏损会直接穿透 floor。这就是为什么上面 m=2m=2、floor=0.80 的理论最大单日亏损约 m(1F)=2×0.2=40%m\cdot(1-F)=2\times0.2=40\%,实测 −45.3%——它必然会阶段性跌破底线。教科书说「CPPI 保证不破 floor」,前提是你盘中能连续再平衡且资产不跳空;真实股票/期货做不到。

  2. 乘数是双刃剑,且上限受监管/券商约束。 机构 CPPI 的 mm 往往被合规上限卡住(如 ≤5),否则 cushion 归零时一次反弹也救不回来。

  3. floor 的设置是信仰问题。 floor 设太高(如 0.95),cushion 永远薄,几乎全仓债券,等于放弃了大部分上涨;设太低(如 0.5),回撤保护形同虚设。floor 该多高,取决于你的「最大可忍亏损」,不是拍脑袋。

  4. 再平衡摩擦与税费。 每天调仓、且 cushion 薄时频繁加减仓,交易成本会啃掉本就不多的超额。实盘要用阈值带(cushion 变化超 x% 才调)压低换手。

  5. 债券端并非真·无风险。 上面用 2.5% 短债近似安全资产;若 floor 用长债或信用债对冲,安全资产自己也会跌,floor 保护被打折扣。

七、小结#

CPPI 的价值不在于「保证不亏」,而在于把一句模糊的「我不想亏太多」翻译成每天自动执行的仓位纪律:缓冲垫厚就进攻、薄就防守,下行约束内嵌在公式里,不靠人盯盘、不靠意志力。但它有三个必须正视的前提——跳空会击穿 floor、乘数要匹配你的风险预算、再平衡有成本。把它当「带保护的可变仓位策略」而非「保本神器」,才算用对了。

本文行情为带崩盘的 GBM 合成数据,仅用于演示 CPPI 机制;实盘落地请用真实标的收益序列,并把 gap risk、交易成本、floor 路径(通常用现值折现而非常数)一并建模。CPPI 仅做多头研究示例,不构成任何投资建议。

最大回撤控制与 CPPI:把下行约束写进仓位管理
https://blog.halo26812.eu.org/blog/drawdown-cppi-control
Author halo
Published at 2026年7月12日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨