Reference 0018
Alpha Uncertainty Card
The optimizer doesn't average your errors — it argmaxes them. Subtract the error bar before you hand it anything.
The Winner's Curse
α̂_i = α_i + noise (unbiased!) but the solver funds the LARGEST α̂ ⇒ E[ promised α̂ᵀw* ] > E[ delivered αᵀw* ] always promised - delivered = the promise gap: report it on every backtest
The Remedies Ladder
1. shrink: τα̂ + (1-τ)μ̄ (Black-Litterman = this, industrialized) 2. penalize: rank by α̂_i - δs_i (s_i = error bar; the lab's dial) 3. robust: worst case over a set: box α ∈ [α̂ ± δs]: max_w min_α αᵀw = α̂ᵀw - δΣ s_i|w_i| ← L1! (Ref 0015) ellipsoid: α̂ᵀw - δ√(wᵀSw) ← SOCP box-robust ⇒ NO-HOLD ZONE: names whose alpha can't clear their own error bar get weight exactly zero (sparse books)
CVXPY Snippet
objective = cp.Maximize(alpha_hat @ w
- delta * cp.norm1(cp.multiply(s, w)) # box-robust
- gamma * risk)
# concave in a maximize: DCP-legal. +delta would be the padding bug (Ref 0015).
Whiteboard Traps
"estimates are unbiased so the book is fine": selection bias ≠ estimate bias backtest picked from many candidates: same argmax, same curse δ too big: insurance you don't need; delivery plateaus robust ≠ pessimistic forecast: it's a penalty on POSITIONS, not on views
Use this page with Lesson 0018 (same-luck-different-caution lab), Reference 0015 (the L1 mechanics), and Reference 0012 (zone logic). Source: MOSEK Portfolio Cookbook, estimation-error and robust chapters.