Value at Risk berechnen: 3 Methoden im Vergleich
Historischer, parametrischer und Monte-Carlo-VaR mit derselben SPY-Renditereihe, ergänzt um den Expected Shortfall, den VaR nicht erfasst.
Der Value at Risk, kurz VaR, wird berechnet, indem zunächst ein Zeithorizont und ein Konfidenzniveau festgelegt werden. Anschließend wird aus einer Renditereihe ein bestimmtes Perzentil abgelesen. Ein 1-Tages-VaR von 2 % bei einem Konfidenzniveau von 99 % würde bedeuten, dass der Verlust in 99 von 100 Handelssitzungen unter 2 % bleibt und diese Schwelle in der hundertsten Sitzung überschreitet. Drei Standardmethoden beantworten diese Frage auf Basis identischer Eingangsdaten. Ihre Ergebnisse weichen stärker voneinander ab, als die meisten erwarten.
Was Value at Risk tatsächlich misst
VaR ist ein Quantil einer Verlustverteilung. Sortiert man alle Tagesrenditen einer Stichprobe vom schlechtesten zum besten Ergebnis und geht vom negativen Ende aus 1 % der Beobachtungen nach innen, entspricht die dort erreichte Rendite – als positiver Verlust ausgewiesen – dem historischen 1-Tages-VaR auf dem Konfidenzniveau von 99 %. Diese Konstruktion verspricht kein Worst-Case-Ergebnis. Sie markiert die Grenze des Bereichs, den die Schätzung noch beschreibt.
Diese Eigenschaft wird am häufigsten missverstanden. Ein VaR von 99 % besagt, dass die schlechtesten 1 % der Tage hinter diesem Schwellenwert liegen. Er sagt nicht, wie weit sie darüber hinausgehen. Maximaler Drawdown beantwortet eine andere Frage: den tatsächlichen Verlust eines Portfolios vom Höchststand bis zum Tiefststand. Beide Kennzahlen können dasselbe Paar von Portfolios daher in umgekehrter Reihenfolge einstufen.
Jede nachfolgende Zahl basiert auf einer einzigen Zeitreihe: den täglichen Schlusskursen von SPY vom Beginn des Jahres 2010 bis zum Ende des Jahres 2025, umgerechnet in prozentuale Veränderungen von Schlusskurs zu Schlusskurs. Der Zeitraum ist fest definiert und nicht rollierend. Jedes Panel berechnet die Zeitreihe aus denselben Daten. Dadurch verändern sich die Zahlen nicht zwischen den Durchläufen.
Das exakte SQL hinter jeder Zahl
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-12-01'
AND date < '2026-01-01'
GROUP BY date
),
rets AS
(
SELECT date, 100 * (close_px / prev_close - 1) AS ret_pct
FROM
(
SELECT date, close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM px
)
WHERE date >= '2010-01-01' AND prev_close > 0
)
SELECT
toString(toYear(date)) AS year,
count() AS sessions,
round(avg(ret_pct), 3) AS mean_return_pct,
round(stddevSamp(ret_pct), 2) AS daily_sigma_pct
FROM rets
GROUP BY year
ORDER BY yearDie Zeitreihe umfasst 16 Kalenderjahre und allein 252 Handelssitzungen in 2010. Zwei Merkmale sind für alles Folgende entscheidend. Der durchschnittliche Tagesertrag ist über diesen Zeithorizont nahezu irrelevant: 0.054% in 2010 gegenüber einer täglichen Standardabweichung, Sigma, von 1.13%. Außerdem ist Sigma nicht konstant. 2020 lag bei 2.11% pro Tag, 2017 bei 0.43%. Eine Standardabweichung kann beide Zeiträume nicht beschreiben.
So wird Value at Risk berechnet: drei Methoden
Historischer VaR: Das Perzentil aus den beobachteten Daten ablesen
Sortieren Sie die tatsächlichen Renditen und bestimmen Sie das entsprechende Perzentil. Es wird keine Verteilung angenommen. Das ist der zentrale Vorteil dieser Methode. Sie setzt jedoch voraus, dass die Stichprobe bereits einen Tag der Art enthält, den die Schätzung abdecken soll. Wird das Konfidenzniveau weit genug nach außen verschoben, bestimmen nur wenige der schlechtesten Handelstage im gesamten Beobachtungsfenster das Ergebnis.
Parametrischer VaR: Mittelwert minus z mal Sigma
Fassen Sie die Zeitreihe mit ihrem Mittelwert und ihrem Sigma zusammen und unterstellen Sie anschließend eine Normalverteilung der Renditen. Der VaR entspricht z mal Sigma minus dem Mittelwert. Dabei ist z das Quantil der Standardnormalverteilung: 1,645 bei 95 %, 2,326 bei 99 % und 3,090 bei 99,9 %. Die Berechnung ist sofort erledigt, doch die Annahme versagt in eine bestimmte Richtung. Tägliche Aktienrenditen liegen im mittleren Bereich enger zusammen als bei einer Normalverteilung und reichen an den Extremen deutlich weiter. Sigma ist hier derselbe Nenner wie beim Sharpe Ratio und bringt bei Daten mit fetten Enden denselben blinden Fleck mit sich.
Monte-Carlo-VaR: Simulation mit festgelegtem Seed
Erzeugen Sie eine große synthetische Stichprobe aus einem angenommenen Prozess und lesen Sie das Perzentil aus den simulierten Werten ab. Die folgende Darstellung verwendet 40.000 standardnormalverteilte Ziehungen. Sie werden mithilfe der Box-Muller-Transformation aus einer durch einen Hash mit Seed erzeugten gleichverteilten Sequenz gebildet und auf den Mittelwert und das Sigma der Zeitreihe skaliert. Der Seed ist in der SQL-Abfrage hinterlegt. Daher sind die Ziehungen bei jeder erneuten Ausführung identisch. Die Simulation bietet Flexibilität, Pfadabhängigkeiten und Korrelationen zwischen mehreren Anlageklassen, aber keine zusätzliche Realitätsnähe: Wird ihr eine Normalverteilung vorgegeben, liefert sie die parametrische Antwort mit zusätzlichem Stichprobenrauschen zurück. Beim Resampling der beobachteten Renditen bleibt dagegen der reale Tail erhalten. Diese Technik steht hinter den Bootstrapped-Konfidenzintervallen.
Das exakte SQL hinter jeder Zahl
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-12-01'
AND date < '2026-01-01'
GROUP BY date
),
rets AS
(
SELECT date, 100 * (close_px / prev_close - 1) AS ret_pct
FROM
(
SELECT date, close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM px
)
WHERE date >= '2010-01-01' AND prev_close > 0
),
emp AS
(
SELECT
avg(ret_pct) AS mu,
stddevSamp(ret_pct) AS sd,
quantileExact(0.100)(ret_pct) AS h90,
quantileExact(0.050)(ret_pct) AS h95,
quantileExact(0.025)(ret_pct) AS h975,
quantileExact(0.010)(ret_pct) AS h99,
quantileExact(0.005)(ret_pct) AS h995,
quantileExact(0.001)(ret_pct) AS h999
FROM rets
),
draws AS
(
SELECT
quantileExact(0.100)(z) AS z90,
quantileExact(0.050)(z) AS z95,
quantileExact(0.025)(z) AS z975,
quantileExact(0.010)(z) AS z99,
quantileExact(0.005)(z) AS z995,
quantileExact(0.001)(z) AS z999
FROM
(
SELECT sqrt(-2 * log(u1)) * cos(2 * pi() * u2) AS z
FROM
(
SELECT
(cityHash64('var-seed-u1', i) % 999999937 + 1) / 999999938.0 AS u1,
(cityHash64('var-seed-u2', i) % 999999937 + 1) / 999999938.0 AS u2
FROM (SELECT arrayJoin(range(40000)) AS i)
)
)
)
SELECT
tupleElement(lvl, 1) AS confidence,
round(-1 * tupleElement(lvl, 2), 2) AS historical_var_pct,
round(tupleElement(lvl, 3) * sd - mu, 2) AS parametric_var_pct,
round(-1 * (mu + sd * tupleElement(lvl, 4)), 2) AS monte_carlo_var_pct,
round(-1 * tupleElement(lvl, 2) - (tupleElement(lvl, 3) * sd - mu), 2) AS method_spread
FROM
(
SELECT
mu,
sd,
arrayJoin([
('90.0%', h90, 1.281552, z90, 1),
('95.0%', h95, 1.644854, z95, 2),
('97.5%', h975, 1.959964, z975, 3),
('99.0%', h99, 2.326348, z99, 4),
('99.5%', h995, 2.575829, z995, 5),
('99.9%', h999, 3.090232, z999, 6)
]) AS lvl
FROM emp
CROSS JOIN draws
)
ORDER BY tupleElement(lvl, 5)Beim Konfidenzniveau von 95.0% liegen die drei Methoden höchstens einen Prozentpunkt auseinander: 1.66% historisch, 1.74% parametrisch und 1.71% simuliert. Bei 99.9% gehen sie auseinander: 5.85% historisch gegenüber 3.31% parametrisch, eine Differenz von 2.54 Prozentpunkten bei identischen Daten. Die simulierte Spalte liegt bei jedem Niveau neben der parametrischen Spalte. Genau das ist die Aussage und kein Mangel. Eine Simulation reproduziert die Verteilung, die ihr vorgegeben wird.
Lesen Sie die Tabelle spaltenweise. Mit jedem höheren Konfidenzniveau weitet sich die Schwelle. Lesen Sie sie zeilenweise. Dann fällt die Methodenwahl im mittleren Bereich der Verteilung kaum ins Gewicht, dominiert aber im Tail. Ein VaR-Limit ohne Angabe der Methode und des Beobachtungsfensters ist keine Zahl, die jemand anderes reproduzieren kann.
Was VaR nicht zeigt: Expected Shortfall
Der Expected Shortfall, auch Conditional VaR genannt, bildet den durchschnittlichen Verlust an den Tagen ab, an denen der VaR überschritten wird. Der VaR zeigt, wo der Randbereich der Verlustverteilung beginnt. Der Expected Shortfall misst, was innerhalb dieses Bereichs liegt.
Das exakte SQL hinter jeder Zahl
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-12-01'
AND date < '2026-01-01'
GROUP BY date
),
rets AS
(
SELECT date, 100 * (close_px / prev_close - 1) AS ret_pct
FROM
(
SELECT date, close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
FROM px
)
WHERE date >= '2010-01-01' AND prev_close > 0
),
qs AS
(
SELECT
quantileExact(0.100)(ret_pct) AS q90,
quantileExact(0.050)(ret_pct) AS q95,
quantileExact(0.025)(ret_pct) AS q975,
quantileExact(0.010)(ret_pct) AS q99,
quantileExact(0.005)(ret_pct) AS q995,
quantileExact(0.001)(ret_pct) AS q999
FROM rets
),
tails AS
(
SELECT
any(q90) AS var90,
any(q95) AS var95,
any(q975) AS var975,
any(q99) AS var99,
any(q995) AS var995,
any(q999) AS var999,
avgIf(ret_pct, ret_pct <= q90) AS es90,
avgIf(ret_pct, ret_pct <= q95) AS es95,
avgIf(ret_pct, ret_pct <= q975) AS es975,
avgIf(ret_pct, ret_pct <= q99) AS es99,
avgIf(ret_pct, ret_pct <= q995) AS es995,
avgIf(ret_pct, ret_pct <= q999) AS es999
FROM rets
CROSS JOIN qs
HAVING countIf(ret_pct <= q999) > 0
)
SELECT
tupleElement(lvl, 1) AS confidence,
round(-1 * tupleElement(lvl, 2), 2) AS historical_var_pct,
round(-1 * tupleElement(lvl, 3), 2) AS expected_shortfall_pct,
round(tupleElement(lvl, 3) / tupleElement(lvl, 2), 2) AS es_to_var_ratio
FROM
(
SELECT
arrayJoin([
('90.0%', var90, es90, 1),
('95.0%', var95, es95, 2),
('97.5%', var975, es975, 3),
('99.0%', var99, es99, 4),
('99.5%', var995, es995, 5),
('99.9%', var999, es999, 6)
]) AS lvl
FROM tails
)
ORDER BY tupleElement(lvl, 4)Bei 99.0% beträgt der VaR dieser Reihe 3.09%, der Expected Shortfall liegt bei 4.43%. Das entspricht dem 1.44-Fachen des Schwellenwerts. Bei einer Normalverteilung läge dieses Verhältnis auf demselben Niveau bei etwa 1,15. Selbst bei 99.9%, wenn der Schwellenwert bereits 5.85% erreicht hat, beläuft sich der durchschnittliche Verlust an einem Überschreitungstag auf 8.14%. Ein ausschließlich auf dem VaR basierendes Limit behandelt jede Überschreitung als dasselbe Ereignis. Die Quotientenspalte zeigt, wie wenig das der Realität entspricht.
Bedeutet ein 1-Tages-VaR von 99 % für ein Institut dasselbe wie für einen Trader?
Nein. Der Unterschied liegt vor allem im Zeithorizont. Ein Trader, der über Nacht keine Position hält, ist nur wenige Stunden dem Risiko ausgesetzt. Eine Schwelle für eine Handelssitzung entspricht daher grundsätzlich seiner Haltedauer. Der Intraday-Verlauf kann jedoch deutlich über die Veränderung von Schlusskurs zu Schlusskurs hinausgehen. Ein Institut, das langfristige Verbindlichkeiten finanziert, hält Positionen über Jahre. Sein Risiko erstreckt sich über Quartale. Der 1-Tages-VaR dient dort eher als Kennzahl für Kapital und Überwachung als als Beschreibung des tatsächlich getragenen Risikos. Die Eigenkapitalregeln für Banken basierten jahrelang auf einem 1-Tages-VaR von 99 %. Im späteren Baseler Rahmenwerk für Marktrisiken wurde die Kennzahl durch einen Expected Shortfall von 97,5 % ersetzt.
Die übliche Übertragung zwischen Zeithorizonten erfolgt über die Skalierung mit der Quadratwurzel der Zeit: Der Wert für eine Handelssitzung wird mit der Quadratwurzel der Anzahl der Handelssitzungen im betrachteten Horizont multipliziert. Dieser Schritt setzt unabhängige Renditen mit konstantem Sigma voraus. Die oben dargestellte jährliche Sigma-Spalte zeigt bereits, dass diese Annahme nur teilweise erfüllt ist.
Das exakte SQL hinter jeder Zahl
WITH
px AS
(
SELECT date, max(toFloat64(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= '2009-11-01'
AND date < '2026-01-01'
GROUP BY date
),
multi AS
(
SELECT
date,
100 * (close_px / p1 - 1) AS r1,
100 * (close_px / p5 - 1) AS r5,
100 * (close_px / p10 - 1) AS r10,
100 * (close_px / p20 - 1) AS r20
FROM
(
SELECT
date,
close_px,
lagInFrame(close_px, 1) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p1,
lagInFrame(close_px, 5) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p5,
lagInFrame(close_px, 10) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p10,
lagInFrame(close_px, 20) OVER (ORDER BY date ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS p20
FROM px
)
WHERE date >= '2010-01-01' AND p20 > 0
),
q AS
(
SELECT
quantileExact(0.01)(r1) AS q1,
quantileExact(0.01)(r5) AS q5,
quantileExact(0.01)(r10) AS q10,
quantileExact(0.01)(r20) AS q20
FROM multi
)
SELECT
tupleElement(h, 1) AS horizon,
round(-1 * tupleElement(h, 3), 2) AS actual_var_pct,
round(-1 * q1 * sqrt(tupleElement(h, 2)), 2) AS sqrt_scaled_var_pct,
round(tupleElement(h, 3) / (q1 * sqrt(tupleElement(h, 2))), 2) AS actual_to_scaled_ratio
FROM
(
SELECT
q1,
arrayJoin([
('1 session', 1.0, q1, 1),
('5 sessions', 5.0, q5, 2),
('10 sessions', 10.0, q10, 3),
('20 sessions', 20.0, q20, 4)
]) AS h
FROM q
)
ORDER BY tupleElement(h, 4)Die erste Zeile dient als Identitätsprüfung: Bei 1 session entspricht der skalierte Wert dem gemessenen Wert. Das Verhältnis beträgt 1. Bei 20 sessions weichen die beiden Werte voneinander ab. Dies geschieht nicht in der Richtung, vor der bei dieser Näherung üblicherweise gewarnt wird: Die Skalierung des Werts für eine Handelssitzung ergibt 13.8%, während die über diesen Horizont gemessenen Renditen 10.7% ergeben. Das Verhältnis beträgt 0.78. In diesem Zeitfenster liegt der skalierte Wert über dem gemessenen Tail über mehrere Handelssitzungen.
Hier wirken zwei Muster gegeneinander. Eine fat-tailed Verteilung für eine einzelne Handelssitzung wird dünner, wenn Renditen addiert werden. Das aggregierte 99%-Quantil nimmt dann langsamer zu als die Quadratwurzel des Zeithorizonts. Volatilitätscluster wirken in die andere Richtung, weil sich heftige Handelssitzungen innerhalb eines Zeitfensters häufen. In dieser Datenreihe ist das erste Muster stärker. In einem anderen Zeitfenster oder bei einem anderen Vermögenswert ist jedoch keine der beiden Richtungen garantiert. Genau darin liegt der entscheidende Punkt: Der Multiplikator ist eine Annahme, keine Messung. Auf dieser Clusterbildung beruht auch das Volatilitäts-Targeting, wenn es Positionen neu dimensioniert.
Eine weitere Einschränkung, klar formuliert: Alle obigen Werte beziehen sich auf den VaR eines einzelnen Vermögenswerts, nämlich eines breit diversifizierten Indexfonds. Ein Portfolio aus zehn korrelierten Titeln ist einem Konzentrationsrisiko ausgesetzt. Ein Portfolio-VaR berücksichtigt dieses über eine Korrelationsschätzung. Korrelationen verändern sich jedoch gerade in dem Moment am stärksten, in dem die Schätzung relevant wird.
Methodische Hinweise und Konventionen
- Die Perzentile stammen aus einem exakten Quantil und nicht aus einer Stichprobenschätzung. Die Monte-Carlo-Ziehungen basieren auf einer per Hash gesetzten, gleichverteilten Sequenz, die in das SQL geschrieben wurde. Dadurch lässt sich jede Zahl hier auf denselben Wert reproduzieren.
- Die Renditen sind Veränderungen der Schlusskurse von Schlusskurs zu Schlusskurs, ohne Wiederanlage von Dividenden. Dies ist die übliche Konvention für einen VaR über eine Handelssitzung.
- Das Panel für die verschiedenen Zeithorizonte verwendet überlappende Zeitfenster: Aufeinanderfolgende Renditen über 20 Handelssitzungen teilen sich 19 Tage. Der Tail basiert daher auf deutlich weniger unabhängigen Beobachtungen, als die Anzahl der Zeilen vermuten lässt.
FAQ
Was ist ein 1-Tages-VaR von 99 %?
Dabei handelt es sich um das Verlustniveau, das an einem von 100 Handelstagen überschritten wird, gemessen über eine einzelne Handelssitzung. In der obigen Zeitreihe liegt die historische Schätzung bei 3.09%. Die Kennzahl bezeichnet einen Schwellenwert und sagt nichts über die Höhe der Verluste oberhalb dieses Werts aus.
Welche VaR-Berechnungsmethode ist am genauesten?
Keine der drei Methoden ist unabhängig von den zugrunde liegenden Annahmen grundsätzlich genau. Jede beantwortet die Frage unter anderen Voraussetzungen. Der historische VaR bildet die zugrunde gelegte Stichprobe getreu ab und sagt nichts über Ereignisse aus, die in der Stichprobe nicht enthalten sind. Der parametrische VaR ist kostengünstig und unterschätzt die Extremrisiken von Aktien. Die Monte-Carlo-Methode ist nur so gut wie die Verteilung, mit der sie gespeist wird.
Was ist der Unterschied zwischen VaR und Expected Shortfall?
Der VaR ist der Schwellenwert bei einem gewählten Konfidenzniveau. Der Expected Shortfall bildet den durchschnittlichen Verlust an den Tagen ab, an denen dieser Schwellenwert überschritten wird. In dieser Zeitreihe liegt der Expected Shortfall beim Konfidenzniveau von 99 % bei 1.44-mal dem VaR. Bei einer Normalverteilung wären es etwa das 1,15-Fache.
Kann man einen 1-Tages-VaR in einen 10-Tages-VaR umrechnen?
Die Multiplikation mit der Quadratwurzel aus 10 ist die übliche Näherung. Sie setzt voraus, dass die Renditen unabhängig sind und eine konstante Volatilität aufweisen. Das Panel zum Zeithorizont misst die Abweichung: Über 20 Sitzungen lag der skalierte Wert bei 13.8%, verglichen mit einem gemessenen Wert von 10.7%.
Jedes Panel oben enthält das SQL, mit dem es erstellt wurde. Um dieselben drei Berechnungen für einen anderen ticker oder ein anderes Zeitfenster auszuführen, formulieren Sie die Anfrage in einfachem Englisch im Strasmore-Terminal.