← Alle Insights

Monte-Carlo-Simulation für Trading-Strategien: was die Verteilung wirklich sagt.

Ein Backtest zeigt einen Pfad. Ein einziger. Monte-Carlo zeigt die Wolke aller Pfade, die die gleiche Strategie hätte zeichnen können — und macht damit sichtbar, was man im Backtest systematisch übersieht: das Risiko, dass alles nur Glück war.

Wenn ich eine Strategie zum ersten Mal sehe, bekomme ich fast immer dieselbe Zahl präsentiert: „CAGR 18 %, max Drawdown 12 %, Sharpe 1,4." Diese Zahlen sind nicht falsch. Sie sind nur eine Punktschätzung aus genau einem Verlauf der Geschichte. Hätten dieselben Trades in leicht anderer Reihenfolge stattgefunden — und die Reihenfolge ist in einem stochastischen Markt zu großen Teilen Zufall — wären die Kennzahlen andere gewesen. Manchmal deutlich andere.

Warum ein einzelner Backtest nicht genug ist.

Ein Backtest ist eine Realisierung. Eine Stichprobe der Größe 1 aus einem Prozess, der prinzipiell unendlich viele Pfade hätte produzieren können. Daraus eine Wahrscheinlichkeitsaussage zu destillieren („die Strategie macht 18 % p. a.") ist statistisch gesehen unzulässig — Sie haben weder Konfidenzintervall noch Streuung. Sie haben einen Wert.

Monte-Carlo löst genau dieses Problem. Statt einen Pfad zu betrachten, simulieren Sie tausende. Sie bekommen keine Punktschätzung mehr, sondern eine Verteilung. Und in dieser Verteilung steckt fast alles, was Sie über das Risiko der Strategie wissen müssen.

Zwei Schulen: Shuffle vs. Stochastik.

In der Trading-Praxis gibt es zwei verbreitete Monte-Carlo-Varianten, die oft durcheinandergebracht werden:

Beide Verfahren beantworten nicht ganz dieselbe Frage. Das Shuffle-Verfahren fragt: „Wie hätte mein Backtest in anderer Reihenfolge ausgesehen?" Die parametrische Simulation fragt: „Wie könnte die Zukunft aussehen, wenn die Verteilung stabil bleibt?" Das eine ist diagnostisch, das andere prognostisch.

Was Sie aus der Verteilung lesen.

Sobald Sie tausende Pfade haben, werden vier Größen interessant, die im Einzelbacktest nicht sichtbar sind:

Python-Implementation.

Eine schlanke Monte-Carlo-Funktion auf Trade-Returns-Ebene, parametrisierbar zwischen Shuffle und parametrischer Simulation:

# Monte-Carlo auf Trade-Return-Serie
import numpy as np
import pandas as pd

def monte_carlo(returns, n_sims=10_000, n_trades=None,
                method="shuffle", seed=42):
    rng = np.random.default_rng(seed)
    n_trades = n_trades or len(returns)
    r = np.asarray(returns)

    if method == "shuffle":
        # Permutation der historischen Returns
        sims = np.array([rng.choice(r, size=n_trades, replace=False)
                         if n_trades <= len(r)
                         else rng.choice(r, size=n_trades, replace=True)
                         for _ in range(n_sims)])
    elif method == "parametric":
        mu, sigma = r.mean(), r.std(ddof=1)
        sims = rng.normal(mu, sigma, size=(n_sims, n_trades))
    else:
        raise ValueError(method)

    equity = np.cumprod(1 + sims, axis=1)
    final  = equity[:, -1] - 1
    dd     = (equity / np.maximum.accumulate(equity, axis=1) - 1).min(axis=1)

    return pd.DataFrame({
        "final_return": final,
        "max_drawdown": dd,
    })

# Anwendung
res = monte_carlo(strategy_returns, n_sims=10_000, method="shuffle")
print(res["final_return"].quantile([0.05, 0.5, 0.95]))
print(res["max_drawdown"].quantile([0.05, 0.5, 0.95]))

Ein typisches Ergebnis aus einem realen Mandat: backtestete Strategie mit 18 % CAGR, DD von 14 %. Nach 10 000 Monte-Carlo-Pfaden: 5 %-Perzentil-Return bei 8 %, Median 17 %, 95 %-Perzentil 29 %. Drawdown-95 %-Perzentil: 26 %. Der Mandant dachte, er kennt seinen Worst Case. Tat er nicht.

Wo Monte-Carlo lügt.

Das Verfahren hat zwei harte Annahmen, die in Tradingstrategien oft verletzt sind:

Serielle Korrelation

Wenn Sie historische Returns shuffeln, zerstören Sie die Reihenfolge. Bei Trend-Strategien ist diese Reihenfolge aber Teil der Edge: Gewinn-Trades clustern sich, weil sie aus einem Trend stammen. Shuffeln zerschlägt diese Cluster und unterschätzt damit sowohl die guten als auch die schlechten Phasen. Bei Mean-Reversion-Strategien ist der Effekt umgekehrt.

Workaround: Block-Bootstrap (siehe nächster Artikel zu Bootstrap-Resampling) oder stationary bootstrap. Beide erhalten Korrelations-Strukturen durch Sampling ganzer Trade-Blöcke statt einzelner Trades.

Stationarität

Monte-Carlo unterstellt, dass die Verteilung der Returns konstant bleibt — die Vergangenheit also für die Zukunft repräsentativ ist. Regime-Wechsel (Vola-Spikes, Korrelations-Bruch, neue Marktteilnehmer) sind nicht abgebildet. Eine Strategie, die in einem Low-Vol-Regime kalibriert wurde, sieht in der Monte-Carlo wunderschön aus — bis das Regime kippt.

Bootstrap vs. Monte-Carlo: kurze Abgrenzung.

Bootstrap und Monte-Carlo werden oft synonym verwendet, sind aber technisch verschieden:

Das Trade-Shuffle-Verfahren oben ist streng genommen ein Bootstrap ohne Replacement. Den eigentlichen Unterschied — und wann welches Verfahren sauberer ist — beleuchte ich im nächsten Artikel.

Meine Praxis.

Jede Strategie, die ich für einen Mandanten validiere, läuft durch eine Standard-Pipeline mit drei Monte-Carlo-Stufen:

  1. Trade-Shuffle auf den Backtest-Returns, 10 000 Pfade. Liefert Drawdown- und Return-Verteilung.
  2. Stationary Bootstrap mit mittlerer Blocklänge, falls die Autokorrelation der Returns signifikant ist.
  3. Parametrische Vorwärtssimulation mit angepasster t-Verteilung (statt Normal), um Fat-Tails realistischer abzubilden.

Wenn das 5-%-Perzentil des Endwerts negativ ist oder der 95-%-Perzentil-Drawdown über meiner persönlichen Toleranzschwelle liegt, geht die Strategie nicht live — unabhängig davon, wie schön der Backtest aussieht. Diese Disziplin spart langfristig mehr Geld als jede Optimierung.

Sie wollen wissen, was Ihre Strategie in 10 000 Paralleluniversen produziert? Erstgespräch buchen — ich rechne es Ihnen vor.