How to chart maximum drawdown with an underwater equity curve
Quick answer
To chart maximum drawdown, plot the underwater series: drawdown[t] = equity[t] / running_max(equity up to t) - 1, which is zero at new highs and negative otherwise. The most negative value is the maximum drawdown. For example, the S&P 500's record close of 4,818.62 on 3 January 2022 to its low of 3,577.03 on 12 October 2022 is a drawdown of -25.8%. Always report recovery time alongside depth.
A maximum drawdown chart, the underwater equity curve, plots how far an investment sits below its previous peak at every point in time. The line rides at zero whenever the portfolio is at a new high and dips into the red the rest of the time. The deepest dip is the maximum drawdown.
The whole chart comes from one running calculation. For an equity series, the drawdown at each point is the value divided by the highest value seen up to that point, minus one:
drawdown[t] = equity[t] / running_max(equity, 0..t) - 1
It is always zero or negative, because you cannot be below a peak you have just set. Take the minimum of that series and you have the maximum drawdown. Everything else on the chart is presentation.
A tiny worked example
Take an equity curve of 100, 110, 120, 90, 95, 100, 130. The running maximum climbs 100, 110, 120, 120, 120, 120, 130. Divide each value by the running maximum and subtract one, and the drawdown series is 0, 0, 0, -25%, -21%, -17%, 0.
The peak is 120 (the third point), the trough is 90 (the fourth), so the maximum drawdown is 90 / 120 - 1 = -25%. The curve only returns to zero at the final point, 130, when the portfolio finally clears its old high of 120. That return-to-zero is the recovery, and it matters as much as the depth.
A real one: the S&P 500 in 2022
Use closing prices and the picture is the same at scale. The S&P 500 set a record close of 4,818.62 on 3 January 2022 and bottomed at 3,577.03 on 12 October 2022. That is a maximum drawdown of 3,577.03 / 4,818.62 - 1 = -25.8%.
Depth is only half the story. The index did not close back above its January 2022 record until early 2024, roughly two years underwater. A -25.8% drawdown that takes two years to recover is a very different experience from the same depth recovered in three months, and that difference is exactly what the underwater chart is built to show. (Figures as of 17 June 2026, from daily closing prices.)
Building the chart
Plot the drawdown series as an area chart anchored to a zero line at the top, shading downward. Time on the x-axis, drawdown percentage on the y-axis, with the axis running from zero down to something past your worst value. Do not flip it into positive numbers: the convention is negative, and reading -32% as a fall is instant, while reading 32% forces the reader to remember it means a loss.
Annotate the deepest point with its value and date, and the recovery point where the line returns to zero. If the series is still below water at the end of your data, leave the recovery open. Never draw a recovery that has not happened.
In code
In pandas the core calculation is two lines:
running_max = equity.cummax()
underwater = equity / running_max - 1.0
max_drawdown = underwater.min() # e.g. -0.258
cummax gives the running peak, the division gives the underwater series, and its minimum is the maximum drawdown. To report duration as well, find the index of that minimum, then the first later index where the underwater series returns to zero.
Pair it with the equity curve
An underwater plot is most useful stacked directly beneath the equity curve it describes, sharing an x-axis. The top panel shows growth; the bottom shows the cost of getting there. Read together, they answer the question a single performance number cannot: not just how much you made, but how much pain you sat through to make it.
[QUADESTO-EMBED: equity curve over an underwater drawdown panel, shared time axis, hover shows drawdown depth and days underwater at each point]
The Quadesto angle
Drop in a price or NAV series and Quadesto returns the equity curve and its underwater panel together, depth and recovery-time labelled, ready to embed. The free tier carries a Made with Quadesto credit; Pro (149 pounds a month) removes it and adds branded themes for client and investor reporting.