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 lengthExpected MDD multiple vs. 1-year baseline (low-drift)
1 year1.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:

DrawdownGain 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.

#maximum drawdown #risk management #trading metrics #drawdown #quant finance