Maximum Drawdown Explained: The Risk Metric That Matters Most
Maximum drawdown (MDD) is the largest peak-to-trough decline in an equity curve, and it is the most misused number on a tear sheet — because it is an extreme order statistic whose expected value grows with the length of the track record, not a stable property of the strategy. A single realized maximum drawdown is one draw from a distribution, and the draw you happen to observe is almost always smaller than the one you will eventually live through. This guide treats drawdown as a random variable: we derive its expected magnitude, quantify the sample-length bias, simulate its distribution, and show how to size positions against the drawdown you have not yet seen.
Definition and the path-dependence problem
At each point you track the running maximum of equity and measure the shortfall below it; the maximum drawdown is the deepest such shortfall over the window:
drawdown(t) = equity(t) / running_max(equity)[t] - 1
max_drawdown = min(drawdown) # most negative value
Unlike volatility or VaR, drawdown is path-dependent: it depends on the order in which returns arrive, not just their distribution. Two return series with identical means, variances, and even identical sets of returns can have completely different maximum drawdowns depending on sequencing. This is why drawdown cannot be recovered from a single-period risk model and why it must be simulated to be understood.
Why the realized MDD is a biased estimate of risk
Because MDD is the minimum of the drawdown process, its expected magnitude increases with the number of observations — you have simply had more chances to hit a deep trough. Under a geometric Brownian motion with annual drift mu and volatility sigma, the expected maximum drawdown is a known function of the Sharpe-like ratio mu/sigma and the horizon (Magdon-Ismail, Atiya, Pratap, Abu-Mostafa, 2004). The qualitative facts you need:
- For a profitable strategy (
mu > 0), expected MDD grows roughly with the
logarithm of the number of periods.
- For a zero- or negative-drift process, it grows closer to the square root of the
number of periods — much faster.
The practical consequence: a strategy backtested over 2 years and another over 10 years are not comparable on raw MDD, and a young strategy's drawdown is systematically understated. Reporting "max drawdown was -18%" without stating the window length — and ideally the expected MDD for that length — is close to meaningless.
| Backtest length | Expected MDD multiple vs. 1-year baseline (low-drift) |
|---|---|
| 1 year | 1.0x |
| 3 years | ~1.5x |
| 5 years | ~1.8x |
| 10 years | ~2.3x |
These are illustrative scalings for a low-drift process; the point is direction and magnitude, not precision. Your live worst case will, with high probability, exceed your backtested worst case simply because live trading samples more of the distribution.
The recovery asymmetry
A loss of d requires a gain of d/(1-d) to recover, and the convexity is brutal:
| Drawdown | Gain to recover |
|---|---|
| -10% | +11% |
| -25% | +33% |
| -50% | +100% |
| -75% | +300% |
| -90% | +900% |
This convexity is the mathematical reason capital preservation dominates upside capture: avoiding a 50% loss is worth far more than the headline number suggests, because the climb back is twice the size of the fall.
Computing drawdown, duration, and its distribution in Python
The point estimate is trivial; the distribution is what you should report. The code below computes the realized MDD and duration, then bootstraps the trade sequence to produce a distribution of plausible drawdowns.
import numpy as np
import pandas as pd
def drawdown_stats(equity: pd.Series) -> dict:
running_max = equity.cummax()
dd = equity / running_max - 1
trough = dd.idxmin()
peak = equity[:trough].idxmax()
after = equity[trough:]
recovered = after[after >= equity[peak]]
recovery = recovered.index[0] if len(recovered) else None
underwater = (equity < running_max)
# longest consecutive underwater run
longest = cur = 0
for flag in underwater:
cur = cur + 1 if flag else 0
longest = max(longest, cur)
return {"max_drawdown": dd.min(), "peak": peak, "trough": trough,
"recovery": recovery, "max_underwater_periods": longest}
def drawdown_distribution(returns: pd.Series, n_boot=5000, seed=0):
"""Bootstrap the worst drawdown to expose its sampling distribution.
Stationary block bootstrap preserves short-term autocorrelation, which
a naive iid resample destroys (and which materially affects drawdown).
"""
rng = np.random.default_rng(seed)
r = returns.dropna().to_numpy()
n = r.size
block = max(int(n ** (1/3)), 1) # rough optimal block length
worst = np.empty(n_boot)
for i in range(n_boot):
idx, out = [], 0
while out < n:
start = rng.integers(0, n)
length = rng.geometric(1/block)
idx.extend(range(start, start + length))
out += length
sample = r[np.array(idx[:n]) % n]
eq = np.cumprod(1 + sample)
worst[i] = (eq / np.maximum.accumulate(eq) - 1).min()
return {
"realized": (np.cumprod(1+r) / np.maximum.accumulate(np.cumprod(1+r)) - 1).min(),
"median_boot": np.median(worst),
"p95_worst": np.percentile(worst, 5), # 5th pct = 95% bad-case drawdown
"p99_worst": np.percentile(worst, 1),
}
The block bootstrap matters: drawdown is acutely sensitive to autocorrelation, and an IID resample (which destroys serial structure) systematically understates drawdown for trending or autocorrelated strategies. The p95worst and p99worst outputs are the numbers to size against, not the single realized figure.
Related path and tail metrics
Maximum drawdown is one summary of a rich object. Complement it with:
- Drawdown duration / time underwater — often the binding constraint on a
trader's resolve. Two strategies sharing a -30% MDD feel completely different if one recovers in two months and the other stays underwater for two years.
- Ulcer index — root-mean-square of the drawdown series, penalizing depth and
duration jointly; more informative than MDD for grinding underwater periods.
- Average drawdown — the typical, not worst, experience.
- Calmar / MAR ratios — return per unit of drawdown; see
Calmar and Information ratios. Note these inherit MDD's sample-length bias.
Drawdown is path-dependent and complementary to distributional risk measures: VaR and CVaR describe single-period tail losses, while volatility measurement feeds both. None substitutes for the others.
Sizing against the drawdown you haven't seen
The standard mistake is to set leverage so that the backtested MDD equals your tolerance. Since the live worst case typically exceeds the historical one, this guarantees you breach tolerance. A defensible rule scales leverage by a stressed drawdown estimate:
safe_leverage = drawdown_tolerance / (stressed_drawdown * safety_factor)
where stresseddrawdown is the p95worst from the block-bootstrap distribution above (not the realized MDD), and safety_factor is 1.5-2.0 to cover model error and non-stationarity. Drawdown scales roughly linearly with leverage, so halving size roughly halves drawdown. Combine this with fractional Kelly sizing, volatility targeting to keep risk stable across regimes, and Monte Carlo stress tests for the full distribution.
Drawdown duration has its own brutal distribution
Depth gets the attention, but time underwater is frequently the constraint that actually breaks a trader or triggers a redemption. The expected recovery time from a drawdown is dramatically asymmetric to the drawdown depth, because recovery requires compounding back at the strategy's drift while the drift itself is small relative to volatility. Under a diffusion model, the expected time to recover a drawdown of depth d scales roughly with d / mulog, where mulog is the per-period log drift — so a low-Sharpe strategy spends far longer underwater per unit of drawdown than a high-Sharpe one, even at equal depth. This is why two strategies with an identical -30% maximum drawdown can have completely different lived experiences: the high-drift one claws back in months, the low-drift one languishes for years. Always report the maximum underwater duration alongside the depth, and recognize that a shallow, long drawdown can end a track record that a deep, fast one would have survived. The Ulcer index, which integrates depth over time, is the single statistic that captures both at once and is worth quoting whenever duration matters.
How drawdown is gamed or distorted
- Short windows. The most common distortion: reporting MDD over a period too
short to have sampled the real worst case. Often unintentional, always misleading.
- Mark smoothing. Illiquid or model-marked books suppress measured drawdown by
not recognizing losses promptly — the same mechanism that inflates Sharpe.
- Frequency choice. Monthly-marked equity hides intra-month troughs that daily
marks would reveal, understating MDD.
- Survivorship and lookahead. A backtest contaminated by
backtesting biases understates drawdown just as it overstates return.
Honest limitations
Maximum drawdown's strength — that it captures the lived, path-dependent worst case — is also its weakness: as a single extreme order statistic it is high-variance, sample-length-dependent, and not comparable across track records without normalization. It tells you the depth of one hole, not the probability of holes of various depths, which is why the distribution of drawdown (from a block bootstrap or Monte Carlo) is far more useful than the point estimate. And because it depends on sequencing, it is unstable to small changes in the return series — reordering a handful of returns can move it substantially.
Conclusion
Maximum drawdown decides whether a strategy is survivable, not just profitable, and the recovery asymmetry makes controlling it the single highest-leverage risk decision you make. But treat the realized MDD for what it is: one noisy, upward-biased-toward- shallow draw from a distribution whose expectation grows with sample length. Report it with its window, simulate its distribution with a block bootstrap that preserves autocorrelation, size against the stressed (not realized) drawdown, and report duration alongside depth. Combine it with the Sharpe and Sortino ratios, sound position sizing, and a clean backtest so that a worse-than- historical drawdown still leaves you in the game.
