Maximaler Drawdown: Tiefe und Erholungszeit
Der maximale Drawdown zeigt den stärksten Rückgang vom Hoch zum Tief. Erfahren Sie, wann er tief ist und warum die Erholung zum neuen Hoch länger dauert.
Der maximale Drawdown ist der stärkste Rückgang einer Wertreihe vom Hoch zum Tief, gemessen als Prozentsatz des jeweils erreichten Höchststands. Steigt ein Konto auf 120.000 US-Dollar, fällt anschließend auf 84.000 US-Dollar und erholt sich danach wieder, beträgt der maximale Drawdown 30 Prozent. Dieser Wert bleibt bestehen, weil die Kennzahl die schlechteste Phase der gesamten Historie erfasst und nicht den aktuellen Zustand. Die meisten Anleger nennen nur die Tiefe des Rückgangs. In derselben Kennzahl stecken jedoch zwei weitere Zeitangaben: die Zeit vom Hoch bis zum Tief und die deutlich längere Zeit vom Tief bis zu einem neuen Hoch.
Wie wird der maximale Drawdown berechnet?
Die gesamte Berechnung erfolgt in einem Durchlauf über die Zeitreihe. Bei jeder Beobachtung aktualisieren Sie das bisherige Maximum, setzen den aktuellen Wert dazu ins Verhältnis und speichern den schlechtesten bislang beobachteten Wert.
- Setzen Sie den laufenden Höchststand auf den ersten Wert.
- Erhöhen Sie den Höchststand bei jedem neuen Wert, wenn dieser höher ist.
- Berechnen Sie den Drawdown für diesen Zeitpunkt: Wert geteilt durch Höchststand minus eins.
- Speichern Sie den niedrigsten Wert. Das ist der maximale Drawdown.
Es gehen weder eine Renditezeitreihe noch eine Volatilitätsschätzung oder eine Verteilungsannahme in die Berechnung ein. Die Schleife arbeitet mit einer einfachen Zahlenliste und der Python-Standardbibliothek. Installieren Sie auf einem frischen Ubuntu-System zunächst den Interpreter:
apt-get update && apt-get install -y python3
Speichern Sie die Schleife als maxdd.py. Bei den folgenden Kursen handelt es sich um eine frei erfundene Zeitreihe mit zehn Werten. Sie ist kurz genug, um die Berechnung von Hand zu prüfen:
prices = [100.0, 104.0, 98.0, 92.0, 95.0, 88.0, 90.0, 101.0, 99.0, 106.0]
peak = prices[0]
max_dd = 0.0
for price in prices:
if price > peak:
peak = price
drawdown = price / peak - 1.0
if drawdown < max_dd:
max_dd = drawdown
print(f"maximum drawdown: {max_dd * 100:.1f}%")
Führen Sie python3 maxdd.py aus. Das Ergebnis ist maximum drawdown: -15.4%. Prüfen Sie es von Hand: Der Höchststand vor dem Tief lag bei 104, das Tief bei 88, und 88 geteilt durch 104 ergibt 0,846. Die Zeitreihe endet anschließend bei 106, einem Allzeithoch, doch die 15,4 % bleiben bestehen. Der maximale Drawdown hält den schlimmsten Moment innerhalb einer Stichprobe dauerhaft fest. Er sagt nichts darüber aus, wo die Zeitreihe aktuell steht. Zwei weitere Variablen in derselben Schleife erfassen den zeitlichen Ablauf: den Index, an dem der Höchststand erreicht wurde, und den Index, an dem der schlechteste Wert auftrat.
Wie eine Drawdown-Kurve aussieht
Eine Drawdown-Kurve zeigt Schritt 3 für jeden Zeitpunkt, statt ihn auf den schlechtesten Einzelwert zu reduzieren. Die Linie liegt immer dann bei null, wenn die Zeitreihe ein neues Hoch erreicht, und fällt dazwischen unter null. Daher wird diese Lücke als „underwater“ bezeichnet. Hier sehen Sie die Kurve für SPY, einen ETF auf den S&P 500, auf Basis der Monatsendkurse seit Januar 2016.
Das exakte SQL hinter jeder Zahl
WITH monthly AS (
SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY month_start
),
runs AS (
SELECT month_start,
close_px,
max(close_px) OVER (ORDER BY month_start
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM monthly
)
SELECT formatDateTime(month_start, '%Y-%m') AS month,
round(100 * (close_px / running_peak - 1), 2) AS drawdown_pct
FROM runs
ORDER BY month_startÜber 127 Monatsendwerte hinweg bleibt die Linie lange nahe null und fällt nur an wenigen Stellen deutlich ab. Der letzte erfasste Monat liegt -1.27% unter dem bisherigen Höchststand. Zwei Merkmale der Form verdeutlichen das Prinzip. Erholungen verlaufen als langsame Anstiege und nicht als scharfe Gegenbewegungen. Jedes neue Hoch setzt die Kurve auf null zurück und löscht damit die sichtbare Erinnerung an die vorherigen Rückgänge.
Wie lange dauert die Erholung von einem Drawdown?
In jedem Drawdown stecken drei verschiedene Kennzahlen. Sie gleichzusetzen, ist die häufigste Fehlinterpretation einer Performance-Tabelle:
- Tiefe: der prozentuale Rückgang des Werts unter seinen Höchststand.
- Zeit bis zum Tief: die Kalendertage vom Höchststand bis zum Tiefpunkt.
- Erholungsdauer: die Kalendertage vom Tiefpunkt bis zu einem neuen Höchststand.
Die dritte Kennzahl ist normalerweise die längste. Eine einzelne Schlagzeilenzahl zeigt sie jedoch nie. Die folgende Übersicht rekonstruiert anhand täglicher Schlusskurse jede abgeschlossene Drawdown-Phase von SPY seit 2016. Eine Phase beginnt an dem Tag, an dem ein Höchststand erreicht wird, und endet an dem Tag, an dem der Fonds erstmals darüber schließt.
Das exakte SQL hinter jeder Zahl
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-01-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session_date
),
runs AS (
SELECT session_date,
close_px,
max(close_px) OVER (ORDER BY session_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM daily
),
episodes AS (
SELECT running_peak AS peak_px,
min(session_date) AS peak_date,
argMin(session_date, close_px) AS trough_date,
min(close_px) AS trough_px
FROM runs
GROUP BY running_peak
),
sequenced AS (
SELECT peak_px,
peak_date,
trough_date,
trough_px,
leadInFrame(peak_date, 1) OVER (ORDER BY peak_date
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS recovery_date
FROM episodes
)
SELECT formatDateTime(peak_date, '%b %Y') AS episode_label,
round(100 * (1 - trough_px / peak_px), 1) AS fall_from_peak_pct,
dateDiff('day', peak_date, trough_date) AS days_to_trough,
dateDiff('day', trough_date, recovery_date) AS days_to_new_high,
dateDiff('day', peak_date, recovery_date) AS days_underwater
FROM sequenced
WHERE recovery_date > trough_date
AND round(100 * (1 - trough_px / peak_px), 1) >= 5
ORDER BY fall_from_peak_pct DESC
LIMIT 8Die tiefste abgeschlossene Phase der Liste beginnt in Feb 2020 und erreicht 34.2% unter dem vorherigen Höchststand. Der Rückgang dauerte 33 Kalendertage. Die anschließende Erholung nahm 148 Tage in Anspruch. Insgesamt blieb der Fonds 181 Tage unter Wasser. Der nächste Eintrag aus Jan 2022 ist mit 25.4% weniger tief. Der Fonds blieb dabei 746 Tage unter seinem alten Höchststand.
Tiefe und Dauer können vollständig auseinanderfallen. Ein heftiger Rückgang mit schneller Erholung und ein flacher, jahrelanger Abwärtstrend werden in einer einzigen Prozentzahl zusammengefasst. Der Crash im März 2020 ist das klassische Beispiel für die erste Form. Wie sich Märkte von Crashs erholen beschreibt den zweiten Teil der Entwicklung.
Warum der maximale Drawdown mit längerer Messdauer schlechter ausfällt
Der maximale Drawdown ist ein Maximum. Eine längere Historie kann ihn daher nur unverändert lassen oder vergrößern. Der laufende Höchststand liegt in einem längeren Betrachtungszeitraum zu jedem Zeitpunkt mindestens so hoch wie im kürzeren Zeitraum. Das bestimmt die mathematische Logik. Eine Messung desselben Fonds über fünf Zeitfenster, die alle am 31. Juli 2026 enden, zeigt diesen Effekt.
Das exakte SQL hinter jeder Zahl
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-07-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session_date
),
scoped AS (
SELECT arrayJoin([1, 2, 3, 5, 10]) AS lookback_years,
session_date,
close_px
FROM daily
),
windowed AS (
SELECT lookback_years, session_date, close_px
FROM scoped
WHERE session_date >= subtractYears(toDate('2026-07-31'), lookback_years)
),
runs AS (
SELECT lookback_years,
session_date,
close_px,
max(close_px) OVER (PARTITION BY lookback_years ORDER BY session_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM windowed
)
SELECT concat(toString(lookback_years), if(lookback_years = 1, ' year', ' years')) AS lookback,
round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,
formatDateTime(argMax(session_date, 1 - close_px / running_peak), '%b %Y') AS worst_point
FROM runs
GROUP BY lookback_years
ORDER BY lookback_yearsIm zurückliegenden 1 year-Zeitraum betrug der stärkste Rückgang 9.1%. Wird dieselbe Zeitreihe auf 10 years verlängert, beträgt der Wert 34.2%; der Tiefpunkt wurde dabei in Mar 2020 erreicht. Der Fonds ist dadurch nicht riskanter geworden. Die Stichprobe ist lediglich länger.
Dieselbe mathematische Logik verzerrt auch den Vergleich von Strategien. Ein Backtest über drei Jahre und ein Backtest über zwanzig Jahre können ein identisches Verhalten beschreiben und dennoch sehr unterschiedliche Drawdowns ausweisen. Ohne Angabe des Betrachtungszeitraums ist die Kennzahl daher wenig aussagekräftig. Look-ahead-Bias beim Backtesting behandelt eine weitere Möglichkeit, wie ein sauber wirkender Backtest seine Ergebnisse besser erscheinen lässt.
Maximaler Drawdown im Vergleich zur Volatilität
Die Volatilität misst die typische Größe einer täglichen Bewegung in beide Richtungen. Der maximale Drawdown misst einen konkreten Abwärtspfad. Beide Kennzahlen beschreiben Risiken, beantworten aber unterschiedliche Fragen. Die Übersicht stellt sie für acht bekannte Unternehmen über den Fünfjahreszeitraum bis zum 31. Juli 2026 gegenüber. Die Volatilität wurde auf Basis täglicher Schlusskurse annualisiert.
Das exakte SQL hinter jeder Zahl
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'KO', 'JNJ', 'CVX', 'VZ', 'PG')
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-08-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, session_date
),
runs AS (
SELECT ticker,
session_date,
close_px,
max(close_px) OVER (PARTITION BY ticker ORDER BY session_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak,
lagInFrame(close_px, 1) OVER (PARTITION BY ticker ORDER BY session_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM daily
)
SELECT ticker,
round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,
round(100 * sqrt(252) * stddevSampIf(close_px / prev_close - 1, prev_close > 0), 1) AS annualized_volatility_pct
FROM runs
GROUP BY ticker
HAVING countIf(prev_close > 0) > 20
ORDER BY max_drawdown_pct DESCBetrachten Sie beide Spalten gemeinsam. VZ verzeichnete mit 45.4% den stärksten Rückgang der Gruppe. Die annualisierte Volatilität lag bei 22.6%. Am anderen Ende fiel KO um 20.9%, bei einer Volatilität von 16.7%. Die Volatilität ist ein Durchschnitt über jeden Handelstag im betrachteten Zeitraum. Ein solcher Durchschnitt kann einen langen, langsamen Rückgang verharmlosen. Der Drawdown zeigt dagegen den schlechtesten Pfad, den der Kurs tatsächlich genommen hat. Eine ruhige Position, die zwei Jahre lang allmählich nachgibt, kann daher einen tiefen Drawdown bei unauffälliger Volatilität aufweisen.
Die Anomalie niedriger Volatilität untersucht, wie sich Werte mit geringer Volatilität über lange Zeiträume entwickeln. Die Positionsgrößenbestimmung nach dem Kelly-Kriterium zeigt, wie sich eine Drawdown-Toleranz in eine Positionsgröße übersetzen lässt.
Was die Kennzahl nicht aussagen kann
Vier Grenzen sollten Sie im Blick behalten:
- Sie beschreibt nur einen realisierten Verlauf. Derselbe Prozess hätte bei einem anderen Verlauf ein deutlich schlechteres Ergebnis liefern können.
- Sie hängt von der Länge des Beobachtungszeitraums ab. Zwei Drawdowns lassen sich daher nur über gleich lange Zeitfenster vergleichen.
- Sie hängt von der Abtastfrequenz ab. Monatsultimo-Kurse blenden die Intraday-Tiefs aus und ergeben über denselben Zeitraum eine kleinere Kennzahl als Tages-Schlusskurse.
- Sie enthält keine Information über die Zukunft. Dass ein Wert 30 % unter seinem Hoch liegt, sagt nichts darüber aus, ob der 31. Datenpunkt morgen erreicht wird.
Diese letzte Grenze erklärt, warum ein automatisiertes System eine Drawdown-Regel und nicht nur einen Drawdown-Schwellenwert braucht. „Bei 20 % anhalten“ beantwortet eine Frage und lässt zwei weitere offen: Was geschieht beim Anhalten mit den offenen Positionen, und welche Informationen führen zur Wiederaufnahme des Systems? Sicherheitsunterbrechungen für Trading-Bots erläutert die Struktur einer solchen Regel. Die Kosten einer willkürlichen pauschalen Regel entstehen in der Erholungsphase. Ein System, das nahe dem Tief aussetzt und spät wieder startet, verpasst den Anstieg. Die besten Tage verpassen beziffert diese Auswirkung.
Vor dem Vergleich zweier Kennzahlen ist ein Messdetail wichtig: Ein Drawdown auf Basis der Kursreihe eines Fonds und ein Drawdown auf einem tatsächlichen Konto unterscheiden sich, sobald Geld zu- oder abfließt oder Dividenden gutgeschrieben werden. wie Monatsrenditen gemessen werden behandelt diesen Punkt vollständig.
Maximaler Drawdown: Häufige Fragen
Was ist ein guter maximaler Drawdown?
Es gibt keinen universellen Wert. Entscheidend sind die Vergleichsgröße und der betrachtete Zeitraum. In den zehn Jahren bis zum 31. Juli 2026 betrug der stärkste Rückgang von einem laufenden Hoch bei SPY auf Basis der Tagesschlusskurse 34.2%. Eine Strategie, die über einen kürzeren Zeitraum einen niedrigeren Wert ausweist, war deshalb nicht unbedingt sicherer.
Ist der maximale Drawdown dasselbe wie die Volatilität?
Nein. Die Volatilität beschreibt die typische tägliche Bewegung. Der maximale Drawdown beschreibt den stärksten Rückgang vom Hoch zum Tief innerhalb eines zusammenhängenden Verlaufs. Eine Position mit niedriger Volatilität, die zwei Jahre lang kontinuierlich fällt, kann einen größeren Drawdown aufweisen als eine stark schwankende Position, die immer wieder neue Höchststände erreicht.
Wie lange dauert die Erholung von einem maximalen Drawdown?
Das ist unterschiedlich. Der Anstieg zurück zum vorherigen Hoch nimmt häufig mehr Zeit in Anspruch als der Rückgang. Bei SPY dauerte die längste abgeschlossene Phase unterhalb eines vorherigen Hochs seit 2016 181 Kalendertage – vom Hoch bis zum Erreichen eines neuen Hochs. Davon entfielen 33 Tage auf den Rückgang.
Sagt der maximale Drawdown künftige Verluste voraus?
Nein. Er beschreibt einen bereits eingetretenen Kursverlauf. Ein längerer Betrachtungszeitraum führt fast immer zu einem höheren Wert. Der maximale Drawdown zeigt, welchen Verlust eine Strategie bisher verkraftet hat. Er setzt keine Grenze für die künftige Entwicklung.
Hinter jedem oben dargestellten Panel ist die zugehörige SQL-Abfrage gespeichert. Öffnen Sie ein Panel, ändern Sie den ticker oder den Zeitraum und führen Sie dieselbe Drawdown-Berechnung im Strasmore-Terminal aus.