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

ChoiceEffect
Higher mMore equity upside; larger gap risk
Lower mSafer; more cash drag
Rising floorLocks in gains; ratchets risk down
Fixed floorSimpler; may leave cushion unused

Institutions often cap Et ≤ Vt (no leverage) or ≤ 100–150% with explicit leverage policy.

CPPI vs volatility targeting

CPPIVol targeting
GoalProtect a floorStabilize vol / risk
SignalDistance to floorRealized/predicted σ
PathConvex (insurance-like)More linear risk scaling
Failure modeGap through floorSlow 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

  1. Rebalance frequency — daily vs weekly; more frequent reduces gap risk, raises costs
  2. Risky asset — index ETF / futures; futures add roll
  3. Floor instrument — cash, T-bills, or zero-coupon bond matching horizon
  4. 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
#CPPI #portfolio insurance #drawdown control #dynamic hedging #gap risk