Backtest inflation
A backtest that picks its best-looking strategy is the same argmax on the same noise — promised-vs-delivered is why live performance disappoints in-sample results even without overfitting anything.
Lesson 0017 gave the risk term honest error bars. Expected returns are estimated far worse — a defensible alpha forecast has an error bar wider than the forecast. Feed such numbers to an optimizer and something perverse happens: the optimizer allocates to your mistakes. This lesson is why that's guaranteed, and the standard fixes — one of which you already learned without noticing.
Explain why a mean-variance optimizer's own forecast for its book is always biased upward (the winner's curse), quantify it as the promised-vs-delivered gap, and apply the remedies ladder: shrink the estimates, penalize uncertainty in the score, or go fully robust — and recognize that box-robustness is exactly an L1 penalty, Lesson 0015's kink wearing a new hat.
It's what everyone tries first: you estimated α̂, so optimize on α̂. The failure isn't that estimates are noisy — averages of noisy estimates are fine. The failure is that an optimizer doesn't average. It takes an argmax:
estimate: α̂_i = α_i + noise_i the optimizer funds the LARGEST α̂_i ⇒ it systematically selects the names whose noise came up positive ⇒ promised = α̂ᵀw* overstates delivered = αᵀw*, every single time E[promised] > E[delivered]: the winner's curse, built into argmax itself
Michaud's name for a mean-variance optimizer — “error maximizer” — is literal: among books with similar true merit, the one that looks best on estimates is the one whose errors flatter it most, and that's the one the solver returns. You met the same demon in Lesson 0017, where the risk minimizer dove into phantom zero-risk directions. Same theorem, other side of the objective.
The remedies form a ladder, each rung buying more safety for more conservatism:
1. shrink: replace α̂ with τα̂ + (1-τ)μ̄ (pull toward the cross-section mean) 2. penalize: rank by α̂_i - δ·s_i (s_i = estimate's error bar) 3. robust: optimize the WORST alpha in a box α ∈ [α̂ - δs, α̂ + δs]: max_w min_α αᵀw = max_w [ α̂ᵀw - δ Σ_i s_i|w_i| ] the worst case turns into an L1 PENALTY — Lesson 0015's kink!
Read rung 3 twice. For each name, the adversary shoves α_i to whichever end of its error bar hurts your position: down δs_i if you're long, up δs_i if you're short. Cost: δs_i|w_i|. So robust optimization is the absolute-value machinery you already own — and just as κ|w - w_prev| made a no-trade zone (Lesson 0012), δs_i|w_i| makes a no-hold zone: names whose alpha can't clear their own error bar get exactly zero weight. Sparse books aren't a style choice; they're what robustness looks like. (Ellipsoidal uncertainty sets give δ√(wᵀSw) instead — a second-order cone, still convex, same story.)
Sixty quarters. True alphas never change; each quarter the desk re-estimates with fresh noise and re-optimizes. The glamour name (Hot growth: true α 3.0, error bar ±4.0) is exactly what a naive argmax loves. Promised is the optimizer's forecast for its own book; delivered is what the true alphas pay. Three experiments: (1) run at δ = 0 — promised runs persistently above delivered, and often above the oracle line, which no real book can beat on average: that daylight is the winner's curse, live; (2) now slide δ up with the run finished — the same sixty noise draws get re-scored, so every change you see is caution, not luck: the gap closes and delivered rises toward the oracle as lucky-but-mediocre names stop displacing steady ones; (3) overdo it (δ = 2) — delivery plateaus just below the oracle: the cost of insurance you no longer need. Press ↻ for fresh luck; the pattern survives.
-
A backtest that picks its best-looking strategy is the same argmax on the same noise — promised-vs-delivered is why live performance disappoints in-sample results even without overfitting anything.
The famous model is rung 1 industrialized: shrink your views toward market-implied returns, weighting by confidence. Papers citing it are answering exactly this lesson's problem.
Robust terms enter CVXPY as - delta * cp.norm1(cp.multiply(s, w)) in a maximization — concave, so DCP-legal. The sign discipline from Lesson 0015 carries over unchanged.
E[promised] > E[delivered] even with unbiased estimates?α_i ∈ [α̂_i ± δs_i], worst case, long-only book. The robust objective equals?The MOSEK Portfolio Optimization Cookbook devotes a chapter each to estimation error and robust optimization — the box and ellipsoid derivations above, done carefully. Boyd & Vandenberghe's robust optimization material shows why worst-case-over-a-set preserves convexity in general. New cheat sheet: alpha uncertainty card.
Ask your agent anything unclear — good prompts: “derive max min αᵀw over the box step by step,” “how does the no-hold zone width relate to Lesson 0012's no-trade zone width,” or “where exactly does Black–Litterman sit on the remedies ladder?”