12 ETFs: sechs ES-Streuungsverhältnisse 0,671–0,768; Gaussian-Gleichsturz 0,3180 gegenüber 0,4211 im Training.
Grafik: Mehr Szenarien verringern bei festem Training die Streuung, nicht die Gaussian-Gleichsturz-Lücke. Separater OOS: drei Tages-VaR-Verfahren.

Wenn eine Monte-Carlo-Risikosimulation stark schwankt, liegt ein Vorschlag nahe: einfach doppelt so viele Szenarien erzeugen. Aber welche zusätzliche Risikoinformation steckt wirklich in den nächsten 756 simulierten Beobachtungen? Eine stabilere Schätzung und eine realistischere Abbildung extremer Verluste sind zwei verschiedene Dinge.

Ich habe das anhand von zwölf ETFs, sechs klassischen Szenariogeneratoren und 50 gepaarten Zufalls-Seeds untersucht. Beim Sprung von 756 auf 1.512 generierte Beobachtungen sank die zufällige Streuung einiger Kennzahlen tatsächlich. Dennoch blieb die gemeinsame Verlustquote des Gaussian-Generators bei nur ungefähr 0.3180; im festgelegten historischen Trainingsfenster lag die Referenz bei 0.4211.

Mit „gemeinsamer Verlustquote“ meine ich eine konkrete Frage: Wenn SPY einen besonders schlechten Tag hat, wie viele der anderen ETFs haben gleichzeitig einen besonders schlechten Tag? Der Schwellenwert wird für jeden ETF im Voraus als unterstes 5%-Quantil der Trainingsrenditen festgelegt. Für die generierten Daten wird er nicht neu geschätzt.

Beim Prüfen eines Risikoszenariogenerators trenne ich deshalb drei Fragen: Wird die Schätzung mit mehr Ziehungen stabiler? Bleiben gleichzeitige Verluste und aufeinanderfolgende starke Schwankungen erhalten? Ist die Risikoschwelle außerhalb der Stichprobe kalibriert? Die ersten beiden betreffen die feste Trainingshistorie. Die dritte prüfe ich separat anhand eines enger gefassten Ein-Tages-VaR-Tests — nicht als OOS-Rangliste für alle sechs Generatoren.

Zwölf ETFs, ein festes Training mit 756 Renditetagen

Die Kursdaten stammen aus Boris Marjanovics Huge Stock Market Dataset. Laut Datensatzbeschreibung gilt CC0; Dividenden und Aktiensplits wurden bei den Kursen berücksichtigt. Meine zwölf ETFs decken Aktien, Staatsanleihen, Unternehmens- und Kreditrisiken, Gold, Rohstoffe, den US-Dollar und Immobilien ab. Nur SPY zu beobachten, würde den gemeinsamen Rückgang unterschiedlicher Anlageklassen verdecken. Die vollständige Tickerliste steht unten.

Ich habe die angepassten Close-Kurse aus den zwölf Quelldateien nach gemeinsamen Handelstagen verbunden und fehlende Daten nicht aufgefüllt. In dieser Kaggle-Version beginnt HYG erst am 2007-04-11. Die Schnittmenge reicht somit vom 2007-04-11 bis 2017-11-10 und umfasst 2.668 Kurstage. Daraus berechne ich einfache Tagesrenditen und bilde an jedem Tag den gleichgewichteten Durchschnitt der zwölf ETFs. Die Portfoliodefinition bleibt durchgehend gleich.

Für die Szenariogenerierung verwende ich ausschließlich die ersten 756 Tagesrenditen — ungefähr drei Handelsjahre einschließlich des Schocks von 2008. Das Fenster bleibt fest, damit alle sechs Verfahren dieselbe Vergangenheit sehen. Den Freiheitsgrad der Student-t-Verteilung setze ich auf fünf fest; nachträglich anhand der OOS-Ergebnisse wird er nicht angepasst.

VerfahrenSo entstehen die Renditeszenarien
GaussianMultivariate Normalverteilung mit Mittelwert und Kovarianz aus dem Training
Student-t df=5Multivariate t-Verteilung mit fünf Freiheitsgraden und angepasster Kovarianz
IID BootstrapGanze Tageszeilen mit ETF-Renditen unabhängig und mit Zurücklegen ziehen
Moving-block 5 / 20 / 60Zusammenhängende Abschnitte von 5, 20 oder 60 Renditetagen ziehen

Hier lauert ein leicht zu übersehender Fehler: Wenn ich bei zwei Simulationen die Zufallszahlen ändere, kann ich reinen Zufall für einen Effekt der Stichprobengröße halten. Deshalb verwende ich dieselben 50 Seeds, 1000–1049. Für jeden Seed generiere ich zuerst 1.512 Beobachtungen und verwende die ersten 756 derselben Folge als kleinere Stichprobe. Im Grunde wird dieselbe Historie von 756 Tagen wieder und wieder durchgespielt. Zusätzliche Simulationstage sind keine neuen realen Markttage.

Auch Student-t hat eine Falle. Eine Verteilung mit dickeren Rändern hilft wenig, wenn man nebenbei die gesamte Varianz vergrößert. Meine Implementierung erzeugt zunächst mit dem Cholesky-Faktor der Trainingskovarianz korrelierte Normalvariablen und multipliziert sie mit √(3/χ²₅); χ²₅ bezeichnet eine Chi-Quadrat-Variable mit fünf Freiheitsgraden. Das entspricht einer t-Skalenmatrix von 3/5 der Trainingskovarianz. Ohne die Korrektur wächst die erzeugte Kovarianz auf 5/3 des beabsichtigten Werts.

Was durch die Verdoppelung tatsächlich stabiler wurde

Beginnen wir mit dem Ein-Tages-ES(5%): der durchschnittlichen Rendite innerhalb der schlechtesten fünf Prozent. Ich berechne ihn für jeden Seed separat und vergleiche anschließend die Standardabweichung der 50 ES-Werte über die Seeds zwischen N=1.512 und N=756. Damit messe ich Simulationsstreuung, nicht die unbekannte Prognosegenauigkeit am künftigen Markt.

GeneratorVerhältnis der seedübergreifenden ES-Standardabweichung: 1.512 / 756
Gaussian0.718
Student-t df=50.671
IID Bootstrap0.746
Moving-block 50.768
Moving-block 200.681
Moving-block 600.734

Die sechs Werte liegen zwischen 0.671 und 0.768, also durchweg unter eins. In diesen 50 gepaarten Versuchen liegen die ES-Schätzungen nach der Verdoppelung näher beieinander. 1/√2≈0.707 liefert eine nützliche Intuition für Stichprobenrauschen. Eine Randverteilungskennzahl wie ES muss aber nicht exakt mit dieser Rate konvergieren.

Bei gleichzeitigen Verlusten sieht es anders aus. Ich betrachte die simulierten Tage, an denen SPY unter sein im Training festgelegtes 5%-Quantil fällt. Für jeden dieser Tage berechne ich, welcher Anteil der restlichen elf ETFs ebenfalls seine eigene festgelegte Schwelle unterschreitet, und bilde den Durchschnitt. Der mittlere Fehler des Gaussian-Generators gegenüber der Trainingsreferenz verändert sich praktisch nicht: ungefähr −0.1036 bei N=756 und −0.1031 bei N=1.512.

Mehr Ziehungen machen den berechneten Wert ruhiger. Sie bringen dem Generator nicht automatisch die fehlenden gemeinsamen Crash-Tage bei.

IID Bootstrap bewahrt den gemeinsamen Absturz, vergisst aber die Folge schlechter Tage

Eine ähnliche Quote gleichzeitiger Verluste bedeutet noch nicht, dass starke Bewegungen auch zeitlich ähnlich aufeinanderfolgen. Alle folgenden Kennzahlen berechne ich auf Basis der gleichgewichteten täglichen Renditen des Zwölf-ETF-Portfolios. Die Autokorrelation der absoluten Renditen mit einem Tag Verzögerung, ACF(1), beschreibt grob die Häufung starker Schwankungen. 60-Tage-ES und maximaler Drawdown betrachten längere Verlustpfade.

Vor der Berechnung ist eine Falle wichtig: 60 Tagesrenditen einfach zu addieren ist keine saubere Berechnung eines kumulierten Verlusts. Ich verschiebe ein Fenster von 60 aufeinanderfolgenden Tagen jeweils um einen Tag und berechne die kumulierte Rendite mit ∏(1+rₜ)-1 durch Verkettung. Der Durchschnitt der schlechtesten fünf Prozent dieser Fenster ist der 60-Tage-ES. Den maximalen Drawdown berechne ich erst innerhalb jedes Fensters auf dem aufgezinstem Vermögenspfad und nehme dann das 5%-Quantil der Fensterwerte.

Hier stehen die Mittelwerte aus 50 Seeds bei N=1.512 neben der empirischen Referenz aus derselben Trainingshistorie:

SzenarioquelleGemeinsame VerlustquoteAbsolutrendite ACF(1)60-Tage-ES(5%)5%-Quantil des maximalen 60-Tage-Drawdowns
Trainingsreferenz0.42110.3000-21.01%-25.45%
Gaussian0.3180-0.0011-15.77%-16.53%
Student-t df=50.3549-0.0005-15.97%-17.00%
IID Bootstrap0.42650.0059-15.15%-16.26%
Block 50.42090.2408-14.45%-15.75%
Block 200.42270.2842-16.54%-18.56%
Block 600.41130.2684-17.49%-20.48%

Der entscheidende Unterschied steckt im IID Bootstrap. Es zieht jeweils die gesamte Renditezeile eines Handelstags. Damit bleibt erhalten, welche ETFs am selben Tag nachgaben: Die Quote von 0.4265 liegt nahe an der Trainingsreferenz 0.4211. Die Reihenfolge der Tage geht jedoch verloren, weil die Zeilen unabhängig gezogen werden. ACF(1) fällt auf 0.0059, während die Referenz 0.3000 beträgt.

Anders gesagt: Das Modell erinnert sich daran, welche Anlagen am selben Tag fallen können, aber kaum noch daran, ob heftige Marktbewegungen aufeinanderfolgen.

Mit Block 20 steigt ACF(1) auf 0.2842, nahe an der historischen Referenz. Block 60 verschiebt den 60-Tage-ES von −15.15% beim IID-Verfahren auf −17.49%; der historische Wert beträgt jedoch −21.01%. Größere Blöcke sind keine Garantie: Block 5 liefert hier sogar einen flacheren 60-Tage-ES als IID.

Warum nutze ich überlappende 60-Tage-Fenster? Ohne Überlappung bleiben von 756 Trainingstagen nur etwa 12, von 1.512 simulierten Tagen etwa 25 Abschnitte übrig. Aus einem Dutzend unabhängiger Pfade ein verlässliches unteres 5%-Risiko abzuleiten, überzeugt mich nicht. Deshalb verschiebe ich täglich: 697 Fenster im Training und 1.453 Fenster im generierten Pfad. Überlappende Fenster sind aber keineswegs genauso viele unabhängige Risikoereignisse. Außerdem enthält das Training den Crash von 2008. −21.01% ist die Referenz genau dieser Vergangenheit und kein präzises universelles Ziel.

Moving-block: Blockgrenzen und Randgewichtung sind nicht dasselbe

Als ACF mit den Blockverfahren stieg, wollte ich zunächst einfach sagen: „Sie erhalten die zeitliche Reihenfolge.“ Beim erneuten Prüfen des Samplers fiel mir auf, dass ich zwei Effekte vermischte.

Der erste Effekt sind Übergänge zwischen Blöcken. Innerhalb eines Blocks folgen historische Tage aufeinander. Der nächste Block kann jedoch irgendwo anders in der Vergangenheit beginnen. Bei Blocklänge L verläuft ungefähr 1/L der Nachbarschaftspaare über einen Übergang. Unter einer vereinfachten Annahme unabhängig aneinandergesetzter Blöcke wird die Autokorrelation erster Ordnung ungefähr mit 1−1/L gedämpft. Bei einer Trainings-ACF von 0.3000 ergibt diese Faustregel für L=5 etwa 0.240 und für L=20 etwa 0.285, nahe an den gemessenen 0.2408 und 0.2842. L=60 passt dagegen nicht zu einer so simplen Skalierung. Die Faustregel erklärt einen Mechanismus, ersetzt aber keinen Messwert.

Der zweite Effekt sind ungleiche Auswahlwahrscheinlichkeiten am Anfang und Ende der Trainingshistorie. Im üblichen nichtzirkulären Moving-block kann ein Block bei Positionen von 0 bis 756−L starten. Tage am Rand kommen in weniger möglichen Blöcken vor als Tage in der Mitte; die positionsabhängigen Gewichte können sich um höchstens den Faktor L unterscheiden. Um den tatsächlichen Einfluss hier zu prüfen, habe ich mit denselben 50 Seeds eine zusätzliche Variante berechnet: Circular Block mit gleichmäßig verteilten Startpositionen und einem möglichen Übergang vom Ende zum Anfang.

BlocklängeACF(1): Standard / Circular60-Tage-ES: Standard / Circular
50.2408 / 0.2411-14.45% / -14.35%
200.2842 / 0.2884-16.54% / -16.37%
600.2684 / 0.2792-17.49% / -17.23%

Die Unterschiede sind eher klein. Bei Block 20 ändert sich ACF von 0.2842 auf 0.2884, der 60-Tage-ES von −16.54% auf −16.37%. Die Randgewichtung existiert, erklärt in diesem Datensatz aber nicht den Hauptunterschied zwischen Block und IID. Circular verbindet zudem künstlich den letzten und den ersten Trainingstag. Ich würde es deshalb nicht pauschal zum besseren Verfahren erklären.

Der zusätzliche Vergleich zwang mich, den Einfluss der Blockübergänge von der Stichprobengewichtung an den Rändern sauber zu trennen. Zur Methode gibt es das Stanford-Dokument über Circular Block Resampling.

Ein-Tages-VaR: Drei Verfahren bestehen die Kalibrierung über den gesamten OOS-Zeitraum nicht

Jetzt wechsle ich zu einer engeren Frage: Wenn der nächste tatsächliche Handelstag kommt, liegt die vorhergesagte Verlustschwelle richtig? Das ist keine OOS-Rangliste der sechs Generatoren von oben. Verglichen werden ausschließlich drei Ein-Tages-VaR-Verfahren: historisches empirisches Quantil, Gaussian und Student-t mit fünf Freiheitsgraden. Für jeden Zieltag berechne ich die Schwelle aus den vorherigen rollierenden 756 tatsächlich beobachteten Portfoliorenditen neu. Das starre Fenster aus dem Simulationsvergleich bleibt hier nicht eingefroren.

Das 5%-Quantil von t5 ist wieder varianzangepasst. Eine VaR-„Überschreitung“ heißt, dass die realisierte Rendite des folgenden Tags unter die modellierte untere 5%-Schwelle fällt. Die OOS-Prüfung umfasst 1.911 verschiedene Ein-Tages-Zielwerte:

Ein-Tages-95%-VaR-VerfahrenÜberschreitungenQuoteKupiec-p-WertChristoffersen-p-Wert (Unabhängigkeit)
Historisches empirisches Quantil522.72%6.16e-70.0145
Gaussian512.67%3.16e-70.0122
Student-t df=5623.24%1.75e-40.0171

Bei einem nominellen 5%-Niveau wären über 1.911 Tage im Mittel etwa 95.55 Überschreitungen zu erwarten. Gemessen wurden nur 51–62. Weniger Überschreitungen bedeuten nicht automatisch eine erfolgreiche Kalibrierung. Der Kupiec-Test prüft die Häufigkeit, Christoffersen die Unabhängigkeit der Ereignisse. Die p-Werte beider Tests sind hier klein.

Dieses Ergebnis gilt für den gesamten Zeitraum von 1.911 Tagen. Die frühen rollierenden Trainingsfenster enthalten noch den Schock von 2008, die späteren nicht mehr. Eine getrennte Prüfung nach Marktphasen habe ich diesmal nicht durchgeführt. Aufeinanderfolgende Doppelüberschreitungen gab es bei den drei Verfahren nur 5 / 5 / 6, was bei der Interpretation des Unabhängigkeitstests ebenfalls wichtig ist.

Den 60-Tage-ES von Block 60 habe ich absichtlich nicht in diese Tabelle hineingezwängt. Für eine echte mehrtägige OOS-Prüfung muss zuerst das 60-Tage-Prognoseziel sauber definiert werden; täglich verschobene 60-Tage-Verluste überlappen stark. Ein tragfähiges Testverfahren dafür habe ich in dieser Studie nicht fertiggestellt. Den Ein-Tages-Test von Kupiec/Christoffersen einfach zu übernehmen, würde eine nicht vorhandene Sicherheit vortäuschen.

Bei Student-t steckt noch eine Überraschung: „Dicke Ränder“ bedeuten nicht bei jedem Konfidenzniveau ein konservativeres VaR. Für df=5 und angeglichene Varianz liegt das standardisierte linke 5%-Quantil bei etwa −1.56085, also näher an null als das Gaussian-Quantil −1.64485. Der Verteilungsname allein sagt nicht, in welche Richtung sich eine konkrete Schwelle bewegt.

Wohin würde ich das nächste Rechenbudget stecken?

Bei der nächsten Forderung „Dann simulieren wir eben doppelt so viel“ würde ich zuerst drei Dinge fragen: Ist die Streuung nur Zufallsrauschen? Bewahrt der Generator gleichzeitige und fortgesetzte Verluste? Gibt es eine OOS-Kalibrierung für den passenden Risikozeitraum? Mehr Ziehungen beantworten hauptsächlich die erste Frage.

Müsste ich Block 20, Block 60 oder Student-t für eine produktive Risikoabsicherung auswählen, würde ich aus diesem fixierten historischen Vergleich keinen Sieger erklären. Die ACF von Block 20 liegt nahe an einer vergangenen Beobachtung, beweist aber keine künftige Risikodeckung. Student-t hat dickere Ränder, muss beim 95%-VaR aber nicht strenger sein. Erst den Risikozeitraum definieren, dann passend OOS testen.

Die zwei Beobachtungen, die ich mitnehme: Die Gaussian-Lücke bei gemeinsamen Verlusten blieb trotz doppelter Szenariozahl bestehen. Und die Circular-Nachprüfung zwang mich, meine erste Erklärung zu präzisieren. Wenn jemand „eine Million Risikoszenarien“ bewirbt, möchte ich wissen: Welche realen Beobachtungen werden wiederholt — und welche Risikostrukturen bleiben tatsächlich erhalten?

Wer erst an einem kleineren Beispiel die Statistik der Verlustschwänze verstehen will, findet in meinem Python-Beispiel zu NaN und dem CVaR-Stichprobennenner in vectorbt einen einfacheren Einstieg.


Datenquelle und feste Parameter: Kaggle Huge Stock Market Dataset v3, ETFs SPY, IWM, EFA, EEM, TLT, IEF, LQD, HYG, GLD, DBC, UUP, VNQ. Gemeinsame bereinigte Schlusskurstage 2007-04-11 bis 2017-11-10, insgesamt 2.668 Zeilen; keine fehlenden Tage aufgefüllt. Feste CSV-SHA-256: 0a20c095f0d9400fbf7d30e17a0c664716f147c460b03bf5439cd980ef8bf38a. Die Szenariostudie nutzt 756 Renditetage Training und 50 gepaarte Seeds; separat gibt es 1.911 tägliche OOS-Zielwerte für den Ein-Tages-VaR. Dies ist ein historischer Methodenvergleich für Risikomodelle, keine Anlageberatung.