Max Drawdown, Ulcer Index, Calmar — Three Ways to Measure "How Painful the Drop"
4-section structure: Concept / How We Compute / How to Read / Caveats.
1. Concept
Standard deviation says "how much it fluctuates". VaR/CVaR says "worst single-day loss". But for investors, the most visceral pain measurement is:
"From when I bought to now, how much did it fall from its peak?"
That's drawdown. Three complementary angles:
| Metric | Answers |
|---|---|
| Max Drawdown (MDD) | What's the deepest drawdown in history? |
| Ulcer Index (UI) | Averaged pain across the whole period (not just the deepest) |
| Calmar Ratio | Annual return per unit of worst drawdown |
2. How We Compute
2.1 Max Drawdown
running_max = max of price seen so far
drawdown_t = (price_t − running_max_t) / running_max_t # negative
max_dd = min(drawdown)
Example: stock goes 100 → 150 → 90:
- running_max = 150; drawdown = −40%; MDD = −40%
2.2 Ulcer Index
ulcer = √(mean(drawdown²)) × 100
Quadratic mean amplifies deeper drawdowns. Distinguishes "deep but short" from "deep and prolonged" — MDD can't.
2.3 Calmar Ratio
annual_return = (end_price / start_price) ^ (252 / n_days) − 1
calmar = annual_return / |MDD|
Answers: "do the returns justify the worst pain?"
2.4 Data & Window
- Stock: past 252 trading-day close
- Portfolio: daily NAV
- Sample < 30 →
available: false
3. How to Read
3.1 MDD Color Scale
| MDD | Color | Profile |
|---|---|---|
| > −10% | 🟢 | Stable (bonds, utilities) |
| −10% to −25% | 🟡 | Mainstream large/growth |
| < −25% | 🔴 | High-vol growth, cyclicals |
3.2 Ulcer Index Scale
| UI | Color | Reading |
|---|---|---|
| < 5 | 🟢 | Low pain |
| 5–12 | 🟡 | Moderate |
| > 12 | 🔴 | High pain |
3.3 Calmar Scale
| Calmar | Color | Reading |
|---|---|---|
| > 1.0 | 🟢 | Excellent (>1% ann. return per 1% MDD) |
| 0.3–1.0 | 🟡 | Acceptable |
| < 0.3 | 🔴 | Drawdown not worth it |
3.4 Combined Matrix
| MDD | Ulcer | Calmar | Interpretation |
|---|---|---|---|
| Low | Low | High | 🟢 Ideal — steady winners |
| Deep | Low | High | 🟡 Flash crash survivor (deep MDD, mostly calm + high return) |
| Low | High | Mid | 🟡 Prolonged stagnation |
| Deep | High | Low | 🔴 Painful (deep + prolonged + low return) |
3.5 Sharpe / Sortino / Calmar Comparison
| Ratio | Denominator | Psychological Match |
|---|---|---|
| Sharpe | Total volatility | Low volatility tolerance |
| Sortino | Downside volatility | Only care about drops |
| Calmar | Single worst drawdown | Can't stomach major crashes |
4. Caveats
⚠️ MDD Is Extremely Sample-Sensitive
If 252 days missed major events → MDD looks mild → Calmar inflated. Late-bull-market Calmar is the most misleading.
Mitigation:
- Pair with P1C.1 VaR/CVaR
- Longer windows (configurable in future)
- P2.3 historical stress tests (Phase 2)
⚠️ No MDD Reset
Running-max classic approach — drawdowns don't age out. A 2008 −50% stays on record in 2024.
Pros: stable long-term view. Cons: early shocks "permanently remembered".
Rolling-window MDD is alternative but noisier at window edges; we chose stability.
⚠️ Ulcer Is Level, Not Percent
Ulcer = 8.5 doesn't mean "8.5% average drawdown". It's quadratic mean × 100.
Use for relative comparison (A=5 vs B=10: A half as painful); not for absolute interpretation.
⚠️ Calmar Inflates in Bull Markets
2021 post-2020-crash Calmar was explosive (small MDD, high returns). Doesn't guarantee future.
High Calmar ≠ low risk — it just means the past happened not to crash.
⚠️ Portfolio Legacy Compat
- Old field
max_drawdown_pct: positive (e.g., 35.0 for −35%) - New field
drawdown.max_drawdown_pct: negative (academic convention)
Both returned to avoid breaking legacy UI.
⚠️ Short Samples Break Calmar
- < 1 year: annualization distorts, MDD may not have shown yet
- min_sample = 30 but recommend 252+
Further Reading
- Sharpe Ratio
- Sortino & Downside Deviation
- VaR vs CVaR: Worst 5% Loss
- Portfolio Stress Testing (Phase 2 planned)
Try It
- Stock Analysis → Risk: MDD / Ulcer / Calmar cards below VaR/CVaR/Sortino
- Portfolio: portfolio version in the row below
- Compare same stock's Sharpe/Sortino/Calmar; pick the one matching your psychological frame
- Click 📐 for formulas and parameters