CPPI and Drawdown-Based Portfolio Insurance
CPPI (Constant Proportion Portfolio Insurance) is a dynamic allocation rule that keeps portfolio value above a floor by shifting between a risky asset and cash as wealth changes. It is the classic algorithmic form of portfolio insurance — related to, but different from, option overlays and vol targeting. This article covers the mechanics, gap risk, and when CPPI helps versus hurts.
The rule
Pick a floor F_t (e.g. 80% of initial capital, or a bond floor growing at rate r). Define cushion:
C_t = V_t − F_t
Allocate to the risky asset:
E_t = m × C_t
with multiplier m (typically 3–5). Remainder Vt − Et goes to cash/bonds.
def cppi_step(V: float, F: float, m: float, r_risky: float,
r_safe: float, E_max: float | None = None) -> tuple[float, float]:
C = max(V - F, 0.0)
E = m * C
if E_max is not None:
E = min(E, E_max)
E = min(E, V) # no leverage beyond NAV unless allowed
B = V - E
V_new = E * (1 + r_risky) + B * (1 + r_safe)
return V_new, E
If V falls toward F, cushion shrinks → equity exposure collapses → floor protection. If V rises, exposure expands — convex payoff profile, similar to owning calls.
Why it looks like options
CPPI synthesizes a call-like payoff via dynamic trading (as does classic portfolio insurance). You pay for protection via:
- Underperformance in choppy markets (buy high, sell low path dependency)
- Trading costs on rebalance
- Gap risk when the risky asset jumps through the floor between rebalances
gap_risk: if overnight crash > 1/m, cushion can go negative before you delever
For m=5, a −20% gap can theoretically breach the floor. This is why CPPI is not a hard guarantee — see jump models and overnight gaps (overnight premium).
Choosing m and the floor
| Choice | Effect |
|---|---|
| Higher m | More equity upside; larger gap risk |
| Lower m | Safer; more cash drag |
| Rising floor | Locks in gains; ratchets risk down |
| Fixed floor | Simpler; may leave cushion unused |
Institutions often cap Et ≤ Vt (no leverage) or ≤ 100–150% with explicit leverage policy.
CPPI vs volatility targeting
| CPPI | Vol targeting | |
|---|---|---|
| Goal | Protect a floor | Stabilize vol / risk |
| Signal | Distance to floor | Realized/predicted σ |
| Path | Convex (insurance-like) | More linear risk scaling |
| Failure mode | Gap through floor | Slow to cut in crashes if σ lags |
You can combine: vol-target the risky sleeve, then apply CPPI on the sleeve vs floor. Also compare to simple drawdown control rules (cut risk when DD > threshold).
Implementation details
- Rebalance frequency — daily vs weekly; more frequent reduces gap risk, raises costs
- Risky asset — index ETF / futures; futures add roll
- Floor instrument — cash, T-bills, or zero-coupon bond matching horizon
- Costs — apply cost-aware bands
(no-trade zone around target E)
def cppi_path(returns, V0=100.0, floor_frac=0.8, m=4.0):
V, F = V0, V0 * floor_frac
out = []
for r in returns:
C = max(V - F, 0.0)
E = min(m * C, V)
V = E * (1 + r) + (V - E) # safe rate ~0 for simplicity
out.append(V)
return out
When CPPI fails psychologically and economically
- Long sideways markets: repeated whipsaw; clients abandon at the bottom of cushion
- Post-crash: locked into cash while recovery runs (opportunity cost)
- Floors set too tight: almost always in cash
- Floors set too loose: almost never protects
CPPI is a product design tool as much as an alpha tool. For systematic quants, a transparent drawdown brake plus vol targeting is often easier to govern than classic CPPI.
Key takeaways
- CPPI sets equity = m × (value − floor); convex like synthetic calls
- Gap risk when crashes exceed 1/m between rebalances — not a hard guarantee
- Higher m = more upside and more breach risk
- Differs from vol targeting: floor protection vs risk stabilization
- Account for costs, rebalance speed, and client behavior in sideways markets
