← Zurück zu den Artikeln
July 11, 2026
5 min read

Asymmetrisches und heavy-tailed GARCH: EGARCH, GJR und Student-t

#volatility
#GARCH
#EGARCH
#risk
#VaR
#crypto
#algorithmic-trading

In Teil 1 dieser Serie haben wir GARCH(1,1) von Grund auf aufgebaut: die Intuition der Volatilitätsclusterung, die Rekursion der bedingten Varianz, die Maximum-Likelihood-Schätzung, die Prognose und die üblichen Residuendiagnostiken mit der arch-Bibliothek. Falls Sie ihn nicht gelesen haben, beginnen Sie dort — dieser Beitrag setzt voraus, dass Sie ein einfaches GARCH(1,1) bereits schätzen und interpretieren können, und leitet die Grundlagen nicht erneut her.

Einfaches GARCH(1,1) ist eine gute Baseline und eine schlechte endgültige Antwort. Es hat zwei strukturelle Mängel, die in einem Backtest billig zu ignorieren, mit echtem Kapital aber teuer zu ignorieren sind. Erstens ist es symmetrisch: Das Modell reagiert auf einen +5%+5\%-Tag genau so wie auf einen 5%-5\%-Tag, weil der Schock nur über sein Quadrat, εt12\varepsilon_{t-1}^2, in die Varianzrekursion eingeht. Das Quadrieren verwirft das Vorzeichen. Zweitens unterstellt es gaußsche Innovationen: Selbst nachdem GARCH die Volatilitätsclusterung aufgesogen hat, sind die standardisierten Residuen von BTC und ETH sichtbar fat-tailed, und eine gaußsche Likelihood bepreist den Rand systematisch zu niedrig. Ein 99%-VaR eines GARCH(1,1)-Normal-Modells wird weit häufiger als in 1% der Fälle durchbrochen.

Dieser Beitrag behebt beide Mängel. Wir fügen Asymmetrie mit GJR-GARCH und EGARCH hinzu sowie fette Ränder (heavy tails) mit Student-tt- und Hansens Skew-tt-Innovationen. Anschließend tun wir das, was tatsächlich die Miete zahlt: Wir verwandeln die geschätzte bedingte Verteilung in eine Ein-Schritt-Prognose für Value-at-Risk und Expected Shortfall und backtesten diese Prognose ehrlich mit den Tests von Kupiec und Christoffersen. Ein Volatilitätsmodell, das man nie einem Risikotest unterzieht, ist Dekoration.

Der Leverage-Effekt, und warum Krypto unordentlicher ist

Bei Aktien hat die Asymmetrie einen Namen und eine Geschichte. Der Leverage-Effekt (Black, 1976): Wenn die Aktie eines Unternehmens fällt, steigt sein Verschuldungsgrad, das Eigenkapital wird mechanisch riskanter, und die Volatilität nimmt zu. Schlechte Nachrichten erhöhen die künftige Volatilität stärker als gleich große gute Nachrichten. Empirisch ist dies eine der robustesten stilisierten Tatsachen der Literatur zur Aktienvolatilität.

Krypto hat weder Eigenkapital noch Bilanz-Leverage im unternehmerischen Sinne, dennoch zeigt sich meistens eine leverage-effekt-ähnliche Asymmetrie — getrieben von erzwungenem Deleveraging statt von Buchhaltung. Wenn BTC stark fällt, werden überbesicherte Kredite liquidiert, Long-Positionen in Perpetual-Futures zwangsgeschlossen, die Funding-Rate kippt, und die Kaskade befeuert die Volatilität. Der Mechanismus unterscheidet sich also, doch das Vorzeichen stimmt oft mit dem der Aktien überein: Abwärtsbewegungen lassen die Volatilität stärker ansteigen.

Die wichtige Einschränkung: Krypto ist unordentlicher, und Sie sollten Asymmetrie eher als empirische Frage denn als Gesetz behandeln. Heftige Aufwärtsbewegungen — Short Squeezes, ein hebelbefeuerter Melt-up, ein Kurssprung nach einer ETF-Zulassung — können die realisierte Volatilität ebenfalls ansteigen lassen. Je nach Asset und Stichprobenfenster kann die geschätzte Asymmetrie stark, schwach oder gelegentlich mit dem „falschen“ Vorzeichen ausfallen. Die Disziplin, auf der dieser Beitrag besteht: das asymmetrische Modell schätzen, prüfen, ob der Asymmetrieparameter statistisch signifikant und in der erwarteten Richtung ist, und den zusätzlichen Parameter nur behalten, wenn er sich seinen Platz verdient. Nehmen Sie nicht an, dass sich die Aktien-Geschichte übertragen lässt; testen Sie sie.

Auf Asymmetrie testen, bevor Sie sie modellieren

Der obige Auftrag lautet, Asymmetrie als empirisch zu behandeln — also führen Sie, bevor Sie ein asymmetrisches Modell schätzen, einen billigen formalen Test darauf durch, ob Asymmetrie überhaupt vorhanden ist. Die Engle-Ng-Sign-Bias-Tests (1993) tun genau das. Schätzen Sie zunächst ein symmetrisches GARCH(1,1), nehmen Sie dessen quadrierte standardisierte Residuen zt2z_t^2 und regressieren Sie sie auf Indikatoren für Vorzeichen und Größe des vorangegangenen Schocks:

zt2=a0+a1St1+a2St1εt1+a3St1+εt1+utz_t^2 = a_0 + a_1 S_{t-1}^- + a_2 S_{t-1}^- \varepsilon_{t-1} + a_3 S_{t-1}^+ \varepsilon_{t-1} + u_t

wobei St1=1{εt1<0}S_{t-1}^- = \mathbf{1}\{\varepsilon_{t-1} < 0\} und St1+=1St1S_{t-1}^+ = 1 - S_{t-1}^-. Die Logik: Wenn das symmetrische Modell bereits alles erfasst hat, sollten Vorzeichen und Größe des gestrigen Schocks das heutige quadrierte Residuum nicht vorhersagen, sodass a1=a2=a3=0a_1 = a_2 = a_3 = 0. Einzelne tt-Tests sind die Tests auf Sign-Bias (a1a_1), Negative-Size-Bias (a2a_2) und Positive-Size-Bias (a3a_3); ein gemeinsamer FF-Test über alle drei ist der Omnibustest. Ein signifikantes a1a_1 oder a2a_2 besagt, dass negative Schocks vom symmetrischen Modell systematisch falsch bepreist werden — Ihr Hinweis, dass GJR oder EGARCH helfen wird.

import statsmodels.api as sm

def sign_bias_test(symmetric_res):
    """Engle-Ng sign-bias tests on a fitted symmetric GARCH result."""
    z = symmetric_res.std_resid.dropna()
    z2 = (z ** 2).values[1:]
    eps_lag = z.values[:-1]                      # standardized shock proxy
    neg = (eps_lag < 0).astype(float)
    X = np.column_stack([
        np.ones_like(eps_lag),                   # intercept
        neg,                                     # sign bias
        neg * eps_lag,                           # negative size bias
        (1 - neg) * eps_lag,                     # positive size bias
    ])
    ols = sm.OLS(z2, X).fit()
    names = ["const", "sign_bias", "neg_size_bias", "pos_size_bias"]
    for nm, coef, t, p in zip(names, ols.params, ols.tvalues, ols.pvalues):
        print(f"{nm:16s} coef={coef:+.4f}  t={t:+.2f}  p={p:.3f}")
    print(f"Joint F p-value: {ols.f_pvalue:.4f}")
    return ols

sign_bias_test(models["GARCH-N"])

Ist der gemeinsame FF-Test nicht signifikant, haben Sie die empirische Erlaubnis, symmetrisch zu bleiben und zwei Parameter zu sparen. Ist er signifikant — das übliche Ergebnis für BTC/ETH —, fahren Sie mit reinem Gewissen zu GJR/EGARCH fort, im Wissen, dass Sie ein reales Merkmal modellieren und nicht Rauschen hinterherjagen. Das ist die empirische Disziplin, die der Aufhänger verlangte: Unterstellen Sie nicht die Leverage-Geschichte der Aktien, sondern testen Sie darauf.

GJR-GARCH: Asymmetrie über einen Schwellenwert-Term

Das Glosten-Jagannathan-Runkle-Modell (1993) — mitunter TGARCH oder Threshold-GARCH genannt — ist die kleinstmögliche Änderung an GARCH(1,1), die schlechten und guten Nachrichten unterschiedliche Effekte erlaubt. Erinnern Sie sich an die symmetrische Rekursion der bedingten Varianz aus Teil 1:

σt2=ω+αεt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

GJR fügt einen Schwellenwert-Term hinzu: eine zusätzliche Dosis Varianz, die sich nur nach einem negativen Schock einschaltet.

σt2=ω+αεt12+γIt1εt12+βσt12\sigma_t^2 = \omega + \alpha\,\varepsilon_{t-1}^2 + \gamma\,I_{t-1}\,\varepsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

wobei It1I_{t-1} der Indikator ist

It1={1if εt1<00if εt10I_{t-1} = \begin{cases} 1 & \text{if } \varepsilon_{t-1} < 0 \\ 0 & \text{if } \varepsilon_{t-1} \geq 0 \end{cases}

Lesen Sie die Rekursion fallweise. Nach einem positiven Schock (εt10\varepsilon_{t-1} \geq 0) ist der Indikator null, und der Einfluss des quadrierten Schocks auf die Varianz der nächsten Periode ist bloß α\alpha. Nach einem negativen Schock ist der Indikator eins, und der Einfluss beträgt α+γ\alpha + \gamma. Der Parameter γ\gamma ist die gesamte Asymmetrie-Geschichte in einer einzigen Zahl:

  • γ>0\gamma > 0: Negative Schocks erhöhen die Volatilität stärker als positive Schocks gleicher Größe. Das ist der Leverage-Effekt, und genau das erwarten Sie bei BTC/ETH die meiste Zeit.
  • γ=0\gamma = 0: Das Modell fällt zurück auf symmetrisches GARCH(1,1). Ein Likelihood-Ratio- oder tt-Test auf γ\gamma ist daher ein direkter Test darauf, ob überhaupt Asymmetrie existiert.
  • γ<0\gamma < 0: Positive Schocks erhöhen die Volatilität stärker — das gelegentliche Krypto-Melt-up-Regime. Selten, aber schließen Sie es nicht a priori aus.

Positivität und Stationarität

Da σt2\sigma_t^2 weiterhin additiv aufgebaut ist, muss jeder Term nichtnegativ bleiben. Die hinreichenden Positivitätsbedingungen lauten

ω>0,α0,α+γ0,β0.\omega > 0, \quad \alpha \geq 0, \quad \alpha + \gamma \geq 0, \quad \beta \geq 0.

Beachten Sie, dass γ\gamma selbst negativ sein darf, solange α+γ0\alpha + \gamma \geq 0, sodass der Einfluss nach schlechten Nachrichten nie negativ wird.

Für Kovarianzstationarität nehmen Sie an, dass die Innovationen zt=εt/σtz_t = \varepsilon_t/\sigma_t mit einer um null symmetrischen Verteilung standardisiert sind, sodass P(εt1<0)=1/2P(\varepsilon_{t-1} < 0) = 1/2 und der Indikator im Mittel γ/2\gamma/2 beiträgt. Die Stationaritätsbedingung wird zu

α+β+12γ<1.\alpha + \beta + \tfrac{1}{2}\gamma < 1.

Die unbedingte (langfristige) Varianz ist dann

σˉ2=ω1αβ12γ.\bar{\sigma}^2 = \frac{\omega}{1 - \alpha - \beta - \tfrac{1}{2}\gamma}.

Dies ist das GJR-Analogon zum Ergebnis σˉ2=ω/(1αβ)\bar{\sigma}^2 = \omega/(1-\alpha-\beta) aus Teil 1, wobei der zusätzliche 12γ\tfrac{1}{2}\gamma-Term den durchschnittlichen Beitrag der Leverage-Halbwertszeit berücksichtigt. Ist Ihre Innovationsverteilung schief (Hansens Skew-tt, siehe unten), wird das 1/21/2 durch die tatsächliche Wahrscheinlichkeit ersetzt, dass zt<0z_t < 0, doch 1/21/2 ist die übliche Referenz für die berichtete Persistenz.

EGARCH: Modellierung der Log-Varianz, keine Positivitätsrestriktionen

GJR hält Sie in einer Zwangsjacke der Varianzpositivität: Jede Parameterkombination muss gegen Ungleichungsrestriktionen geprüft werden, was während der Optimierung lästig und während der rollierenden Neuschätzung schlimmer ist, wenn ein Fenster gelegentlich in einen unzulässigen Bereich abdriftet. Nelsons Exponential-GARCH (1991) umgeht dies vollständig, indem es den Logarithmus der bedingten Varianz modelliert. Da logσt2\log \sigma_t^2 jede reelle Zahl sein kann, ist σt2=exp(logσt2)\sigma_t^2 = \exp(\log \sigma_t^2) automatisch positiv, unabhängig von den Parametern. Keine Restriktionen aufzuerlegen.

Schreiben Sie die Rekursion mithilfe der standardisierten Innovation zt1=εt1/σt1z_{t-1} = \varepsilon_{t-1}/\sigma_{t-1}:

logσt2=ω+βlogσt12+α(zt1Ezt1)+γzt1\log \sigma_t^2 = \omega + \beta \log \sigma_{t-1}^2 + \alpha\bigl(|z_{t-1}| - \mathbb{E}|z_{t-1}|\bigr) + \gamma\, z_{t-1}

Zwei Terme tragen den Schock, und ihre Trennung ist die ganze Idee:

  • Der Magnituden-Term α(zt1Ezt1)\alpha(|z_{t-1}| - \mathbb{E}|z_{t-1}|) reagiert auf die Größe des Schocks, unter Entfernung des Vorzeichens. Das Subtrahieren von Ezt1\mathbb{E}|z_{t-1}| zentriert ihn, sodass ein Schock durchschnittlicher Größe nichts beiträgt. Für eine Standardnormalverteilung ist Ez=2/π0.7979\mathbb{E}|z| = \sqrt{2/\pi} \approx 0.7979; für ein standardisiertes Student-tt ist der erwartete Absolutwert kleiner und hängt von ν\nu ab, aber arch behandelt dies intern.
  • Der Vorzeichen-Term γzt1\gamma\, z_{t-1} ist die Asymmetrie. Er ist linear in der vorzeichenbehafteten Innovation, sodass ein negatives zt1z_{t-1} logσt2\log\sigma_t^2 in die entgegengesetzte Richtung drückt wie ein positives.

Die Vorzeichenkonvention ist wichtig und bringt viele durcheinander. In dieser Parametrisierung entspricht der Leverage-Effekt (schlechte Nachrichten erhöhen die Volatilität) einem γ<0\gamma < 0: Ein negativer Schock zt1<0z_{t-1} < 0 macht dann γzt1>0\gamma z_{t-1} > 0, was die Log-Varianz erhöht. Das ist das umgekehrte Vorzeichen zu GJRs γ>0\gamma > 0. Lesen Sie stets die Dokumentation des Modells selbst zur Konvention, statt zu raten; arch berichtet EGARCH mit seinem eigenen Vorzeichen, und wir prüfen es unten gegen eine News-Impact-Kurve, statt uns auf unser Gedächtnis zu verlassen.

Da in Logarithmen alles additiv ist, wird die Persistenz eines EGARCH(1,1) durch den einzelnen autoregressiven Koeffizienten β\beta auf logσt12\log\sigma_{t-1}^2 gesteuert; Stationarität erfordert nur β<1|\beta| < 1. Das ist eine deutlich sauberere Bedingung als die GJR-Ungleichung, und es ist ein echter praktischer Vorteil, wenn Sie auf rollierenden Fenstern neu schätzen.

Eine erwähnenswerte Feinheit: EGARCHs Reaktion auf Schocks ist exponentiell in der Innovation (man exponentiiert am Ende), während GJR quadratisch ist. EGARCH reagiert daher heftiger auf große Schocks — ein Vorteil bei Krypto, wo die Tail-Ereignisse die entscheidenden sind, aber auch ein Grund, warum EGARCH gelegentlich unplausibel große Varianzprognosen nach einem Ausreißertag erzeugen kann. Keines ist universell besser; Sie wählen anhand der Out-of-Sample-Anpassung und der Risiko-Backtests, worum es in dieser gesamten Serie geht.

Die News-Impact-Kurve

Der sauberste Weg, den Unterschied zwischen symmetrischem GARCH, GJR und EGARCH zu sehen, ist die News-Impact-Kurve (Engle und Ng, 1993): Halten Sie σt1\sigma_{t-1} auf seinem langfristigen Niveau fest und tragen Sie die bedingte Varianz der nächsten Periode σt2\sigma_t^2 als Funktion des letzten Schocks εt1\varepsilon_{t-1} auf. Sie beantwortet: „Gegeben ein Schock dieser Größe und dieses Vorzeichens, um wie viel erhöht das Modell die morgige Volatilität?“

  • Symmetrisches GARCH erzeugt eine symmetrische Parabel, zentriert bei null. Ein 5%-5\%- und ein +5%+5\%-Schock landen auf derselben Höhe. Genau das ist der Mangel, den wir beheben.
  • GJR erzeugt eine Parabel mit einem Knick bei null — steiler auf der linken Seite (negative Schocks) als auf der rechten, wenn γ>0\gamma > 0. Die beiden Hälften haben Krümmungen α+γ\alpha+\gamma bzw. α\alpha.
  • EGARCH erzeugt eine asymmetrische, exponentielle V-Form: Die beiden Arme haben aufgrund des γz\gamma z-Terms unterschiedliche Steigungen, und das Ganze krümmt sich wegen der abschließenden Exponentiation schneller nach oben als eine Parabel.

Wir tragen alle drei später im Implementierungsteil aus geschätzten Parametern auf — es ist die mit Abstand nützlichste Diagnostik, um zu vermitteln, was Ihnen Asymmetrie einbringt.

Fette Ränder: Student-t- und Skew-t-Innovationen

Asymmetrie behebt die Reaktion des Modells auf das Vorzeichen der Schocks. An der Verteilung der Schocks selbst ändert sie nichts. Einfaches GARCH unterstellt ztN(0,1)z_t \sim \mathcal{N}(0,1), und diese Annahme ist bei Krypto fast immer falsch. Selbst nachdem GARCH die Volatilitätsclusterung entfernt hat, behalten die standardisierten Residuen zt=εt/σtz_t = \varepsilon_t / \sigma_t Exzesskurtosis — sie sind fat-tailed. Eine gaußsche Likelihood, die die Schultern der Verteilung anpasst, gewichtet zu gering, wie oft ein standardisierter 44-, 55- oder 66-Sigma-Tag tatsächlich vorkommt.

Die Konsequenz fürs Risiko ist unmittelbar. Ein gaußscher 99%-VaR verwendet das Quantil Φ1(0.01)2.326\Phi^{-1}(0.01) \approx -2.326, prognostiziert also VaR0.992.326σt\text{VaR}_{0.99} \approx 2.326\,\sigma_t. Ist die wahre standardisierte Verteilung ein Student-tt mit etwa ν=5\nu = 5 Freiheitsgraden, liegt das wahre 1%-Quantil nahe 3.36-3.36 — der gaußsche VaR ist bei diesem Konfidenzniveau um rund 44%44\% zu optimistisch. Sie werden ihn weit häufiger als in 1% der Fälle durchbrechen und von „unmöglichen“ Tagen systematisch überrascht werden. Das ist keine Krypto-Eigenheit; Bollerslev (1987) führte tt-GARCH gerade deshalb ein, weil Aktien- und FX-Residuen dieselben fetten Ränder zeigten. Krypto ist nur eine extremere Version desselben Problems.

Standardisiertes Student-t

Die Student-tt-Dichte hat einen Freiheitsgradparameter ν>2\nu > 2, der die Randdicke steuert: kleines ν\nu bedeutet fette Ränder, und mit ν\nu \to \infty konvergiert das tt zur Gaußverteilung. Der Haken ist, dass die rohe tνt_\nu-Verteilung die Varianz ν/(ν2)1\nu/(\nu-2) \neq 1 hat, sodass wir sie auf Einheitsvarianz standardisieren müssen, bevor wir sie als Innovation verwenden — sonst wäre das „σt\sigma_t“ in der GARCH-Rekursion nicht tatsächlich die bedingte Standardabweichung.

Die standardisierte Student-tt-Innovation mit Einheitsvarianz hat die Dichte

f(z;ν)=Γ ⁣(ν+12)π(ν2)  Γ ⁣(ν2)(1+z2ν2)ν+12,ν>2.f(z;\nu) = \frac{\Gamma\!\left(\frac{\nu+1}{2}\right)}{\sqrt{\pi(\nu-2)}\;\Gamma\!\left(\frac{\nu}{2}\right)}\left(1 + \frac{z^2}{\nu-2}\right)^{-\frac{\nu+1}{2}}, \qquad \nu > 2.

Beachten Sie das (ν2)(\nu-2) im Inneren — das ist die Standardisierung, die so umskaliert, dass Var(z)=1\mathrm{Var}(z)=1. Der Log-Likelihood-Beitrag einer Beobachtung ist, gegeben die bedingte GARCH-Varianz σt2\sigma_t^2 und zt=εt/σtz_t = \varepsilon_t/\sigma_t,

t=logΓ ⁣(ν+12)logΓ ⁣(ν2)12log(π(ν2))12logσt2ν+12log ⁣(1+zt2ν2).\ell_t = \log\Gamma\!\left(\tfrac{\nu+1}{2}\right) - \log\Gamma\!\left(\tfrac{\nu}{2}\right) - \tfrac{1}{2}\log\bigl(\pi(\nu-2)\bigr) - \tfrac{1}{2}\log\sigma_t^2 - \frac{\nu+1}{2}\log\!\left(1 + \frac{z_t^2}{\nu-2}\right).

Der Term 12logσt2-\tfrac{1}{2}\log\sigma_t^2 ist die Jacobi-Determinante der Transformation von εt\varepsilon_t nach ztz_t — derselbe Term, den Sie in der gaußschen GARCH-Likelihood in Teil 1 gesehen haben. Nur die Form ändert sich. Die Maximierung von tt\sum_t \ell_t gemeinsam über die GARCH-Parameter und ν\nu ist genau das, was arch tut, wenn Sie dist='t' übergeben.

Das geschätzte ν\nu ist selbst informativ. Für tägliche BTC/ETH-Renditen landen Sie typischerweise im Bereich ν36\nu \approx 3\text{–}6 — fette Ränder, aber mit endlicher Varianz (was ν>2\nu > 2 erfordert) und meist endlicher Kurtosis (was ν>4\nu > 4 erfordert). Fällt Ihr geschätztes ν\nu unter 4, seien Sie sich bewusst, dass die Stichprobenkurtosis im Modell technisch unendlich ist und manche Schätzer instabil werden; es ist ein Signal, Ausreißer und Datenqualität genau zu prüfen.

Hansens Skew-t

Student-tt ist fat-tailed, aber immer noch symmetrisch — der linke und der rechte Rand sind gleich schwer. Krypto-Renditeresiduen sind oft zusätzlich schief: Der linke Rand (Crashs) ist schwerer als der rechte. Hansens Skew-tt (1994) verallgemeinert das standardisierte tt mit einem Schiefeparameter λ(1,1)\lambda \in (-1, 1) neben ν\nu:

f(z;ν,λ)={bc(1+1ν2(bz+a1λ)2)ν+12z<a/bbc(1+1ν2(bz+a1+λ)2)ν+12za/bf(z;\nu,\lambda) = \begin{cases} b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1-\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z < -a/b \\[2mm] b\,c\left(1 + \dfrac{1}{\nu-2}\left(\dfrac{bz+a}{1+\lambda}\right)^2\right)^{-\frac{\nu+1}{2}} & z \geq -a/b \end{cases}

wobei die Konstanten a=4λcν2ν1a = 4\lambda c\,\frac{\nu-2}{\nu-1}, b2=1+3λ2a2b^2 = 1 + 3\lambda^2 - a^2 und c=Γ(ν+12)π(ν2)Γ(ν2)c = \frac{\Gamma(\frac{\nu+1}{2})}{\sqrt{\pi(\nu-2)}\,\Gamma(\frac{\nu}{2})} so gewählt sind, dass zz für jedes gültige (ν,λ)(\nu,\lambda) Mittelwert null und Einheitsvarianz hat. Die Verteilung teilt sich bei z=a/bz = -a/b auf und verwendet in jedem Stück eine andere Skalierung, um mehr Masse in einen Rand zu biegen.

Interpretation: λ<0\lambda < 0 ergibt eine linksschiefe Verteilung (schwererer Downside), was der übliche Befund bei Krypto ist und was Sie mit einem Leverage-Effekt gepaart erwarten würden. λ=0\lambda = 0 stellt das symmetrische Student-tt wieder her, sodass ein Test auf λ=0\lambda = 0 Ihnen sagt, ob der Schiefe-Term etwas einbringt. In arch ist dies dist='skewt', das sowohl ν\nu als auch λ\lambda schätzt. Die Belohnung ist ein VaR, dessen Linksrand-Quantil ehrlich schwerer ist als sein Rechtsrand-Quantil — genau das, was Sie wollen, wenn die Verluste, die Sie zu überstehen versuchen, asymmetrisch sind. Dies verbindet sich unmittelbar mit der Asymmetrie von Verlust versus Gewinn bei Positionsergebnissen: Ein Drawdown von x%x\% erfordert mehr als x%x\% zur Erholung, sodass die Fehlmodellierung des linken Rands teurer ist als die des rechten.

Python-Implementierung

Wir schätzen dies nun alles mit der arch-Bibliothek. Das Setup spiegelt Teil 1: tägliche Renditen ziehen, zur numerischen Konditionierung mit 100 skalieren (GARCH-Optimierer verhalten sich schlecht, wenn Renditen O(0.01)O(0.01) sind) und mit einem konstanten Mittelwert schätzen. Wenn Sie Intraday-Daten oder ein anderes Mittelwertmodell wollen, ist die Maschinerie identisch.

Setup und Daten

import numpy as np
import pandas as pd
from arch import arch_model
from arch.univariate import GARCH, EGARCH, ConstantMean, StudentsT, SkewStudent
from scipy import stats

def fetch_returns(symbol="BTC-USD", start="2019-01-01", end="2025-12-31"):
    """Daily log returns, in percent (scaled x100 for the optimizer)."""
    import yfinance as yf
    px = yf.download(symbol, start=start, end=end)["Close"].dropna()
    ret = 100.0 * np.log(px / px.shift(1)).dropna()
    ret.name = symbol
    return ret

r = fetch_returns("BTC-USD")
print(f"{len(r)} daily observations, "
      f"annualized vol ~ {r.std() * np.sqrt(365):.0f}%")

Krypto handelt rund um die Uhr, daher annualisieren wir mit 365, nicht mit 252 — eine kleine, aber wiederkehrende Quelle der Verwirrung, wenn Sie eine Krypto-Sharpe oder -Volatilität mit den Zahlen eines Aktien-Desks vergleichen.

Vier Modelle schätzen

Das Muster in arch: vol='Garch' mit p=1, q=1 ist symmetrisches GARCH; das Hinzufügen von o=1 schaltet den GJR-Schwellenwert-Term ein; vol='EGARCH' wechselt zum Log-Varianz-Modell. Die Innovationsverteilung wird mit dist gesetzt: 'normal', 't', 'skewt'.

def fit(returns, vol="Garch", p=1, o=0, q=1, dist="normal"):
    am = arch_model(returns, mean="Constant",
                    vol=vol, p=p, o=o, q=q, dist=dist)
    res = am.fit(disp="off")
    return res

models = {
    "GARCH-N":    fit(r, vol="Garch",  o=0, dist="normal"),  # Part 1 baseline
    "GJR-t":      fit(r, vol="Garch",  o=1, dist="t"),        # asymmetry + fat tails
    "EGARCH-t":   fit(r, vol="EGARCH", o=1, dist="t"),        # log-variance asymmetry
    "GJR-skewt":  fit(r, vol="Garch",  o=1, dist="skewt"),    # + skew
}

for name, res in models.items():
    print(f"\n===== {name} =====")
    print(res.summary().tables[1])   # parameter table

Für vol='EGARCH' steuert das Argument o den asymmetrischen (γz\gamma z)-Term, und p/q steuern die Magnituden- und Lag-Terme; o=1, p=1, q=1 ist das Standard-EGARCH(1,1). Eine Falle: Die Parameternamen von EGARCH in arch sind dieselben Buchstaben, aber die Vorzeichenkonvention des Asymmetrie-Terms ist Nelsons, sodass eine negative Schätzung der Leverage-Effekt ist. Wir verifizieren dies aus der News-Impact-Kurve statt aus dem Gedächtnis.

Die GJR-Anpassung lesen

Eine GJR-tt-Parametertabelle sieht ungefähr so aus (illustrative Werte, kein berichtetes Experiment — schätzen Sie auf Ihren eigenen Daten neu):

                  coef    std err       t      P>|t|
omega           0.0480     0.017     2.82     0.005
alpha[1]        0.0620     0.018     3.44     0.001
gamma[1]        0.0910     0.028     3.25     0.001
beta[1]         0.8850     0.021    42.1      0.000
nu              4.30       0.55      7.82     0.000

So lesen Sie sie:

  • gamma[1] = 0.091 mit einer tt-Statistik über 3 ist ein statistisch signifikanter Leverage-Effekt. Nach einem negativen Schock beträgt der Einfluss des quadrierten Schocks α+γ=0.062+0.091=0.153\alpha + \gamma = 0.062 + 0.091 = 0.153; nach einem positiven Schock ist er bloß α=0.062\alpha = 0.062. Schlechte Nachrichten bewegen die Volatilität dieses Modells rund 2.5×2.5\times so stark wie gute Nachrichten gleicher Größe.
  • nu = 4.3 bestätigt fette Ränder — weit entfernt vom Gaußschen (ν\nu \to \infty) und niedrig genug, dass das vierte Moment kaum endlich ist. Ein gaußscher VaR auf dieser Reihe wäre stark zu optimistisch.
  • Die Persistenz beträgt α+β+12γ=0.062+0.885+0.04550.993\alpha + \beta + \tfrac{1}{2}\gamma = 0.062 + 0.885 + 0.0455 \approx 0.993 — sehr hoch, wie üblich für tägliche Krypto-Daten: Schocks klingen langsam ab, und die Volatilität ist stark geclustert.

Die einzelne wichtigste zu prüfende Zeile ist die γ\gamma-Zeile. Ist ihr pp-Wert groß, verdient sich der asymmetrische Term auf diesem Asset und Fenster seinen Platz nicht, und Sie sollten das einfachere symmetrische Modell vorziehen. Das ist Modellselektionsdisziplin, keine Dekoration — mehr dazu unten.

Modelle über Informationskriterien vergleichen

Die Log-Likelihood verbessert sich immer, wenn Sie Parameter hinzufügen, sodass Sie nicht allein über die Log-Likelihood selektieren können. Verwenden Sie AIC/BIC, die die Parameteranzahl bestrafen (BIC aggressiver):

def compare(models: dict) -> pd.DataFrame:
    rows = []
    for name, res in models.items():
        rows.append({
            "model": name,
            "n_params": len(res.params),
            "loglik": res.loglikelihood,
            "AIC": res.aic,
            "BIC": res.bic,
        })
    df = pd.DataFrame(rows).set_index("model")
    return df.sort_values("BIC")

print(compare(models))

Faustregeln zur Interpretation: Eine BIC-Verbesserung von mehr als ~6 gegenüber der Baseline ist starke Evidenz, dass die zusätzliche Struktur real ist; ein Unterschied von 1–2 ist Rauschen. Schlägt GJR-t GARCH-N um 30+ BIC-Punkte, aber GJR-skewt schlägt GJR-t nur um 1, behalten Sie das tt und verwerfen Sie die Schiefe — der Schiefeparameter zahlt sich auf diesen Daten nicht aus. Lesen Sie AIC/BIC nicht als Ersatz für Out-of-Sample-Validierung; sie belohnen die In-Sample-Anpassung, um Komplexität bereinigt, was notwendig, aber nicht hinreichend ist. Der eigentliche Test ist der VaR-Backtest und letztlich die Walk-Forward-Evaluierung.

Die News-Impact-Kurve auftragen

Das ist der Belohnungsplot — er macht Asymmetrie sichtbar und verifiziert die EGARCH-Vorzeichenkonvention.

import matplotlib.pyplot as plt

def news_impact_curve(res, shock_grid):
    """
    Next-period conditional variance as a function of the last shock,
    holding sigma_{t-1} at the model's unconditional level.
    Works for symmetric GARCH, GJR (o=1), and EGARCH.
    """
    p = res.params
    vol_name = res.model.volatility.__class__.__name__
    sigma2_bar = np.mean(res.conditional_volatility ** 2)

    omega = p["omega"]
    alpha = p.get("alpha[1]", 0.0)
    gamma = p.get("gamma[1]", 0.0)
    beta  = p.get("beta[1]", 0.0)

    if vol_name == "EGARCH":
        sig_prev = np.sqrt(sigma2_bar)
        z = shock_grid / sig_prev
        E_abs = np.sqrt(2 / np.pi)   # approx; arch uses the fitted dist's E|z|
        log_s2 = (omega + beta * np.log(sigma2_bar)
                  + alpha * (np.abs(z) - E_abs) + gamma * z)
        return np.exp(log_s2)
    else:
        ind = (shock_grid < 0).astype(float)
        return omega + (alpha + gamma * ind) * shock_grid**2 + beta * sigma2_bar

shocks = np.linspace(-8, 8, 401)   # daily % shocks
plt.figure(figsize=(8, 5))
for name in ["GARCH-N", "GJR-t", "EGARCH-t"]:
    nic = news_impact_curve(models[name], shocks)
    plt.plot(shocks, nic, label=name, lw=2)
plt.axvline(0, color="gray", lw=0.8, ls="--")
plt.xlabel("Last shock  $\\varepsilon_{t-1}$  (daily %)")
plt.ylabel("Next-period conditional variance  $\\sigma_t^2$")
plt.title("News impact curve: symmetric vs GJR vs EGARCH (BTC)")
plt.legend()
plt.tight_layout()

Wenn Sie dies ausführen, ist die symmetrische GARCH-N-Kurve eine saubere, bei null zentrierte Parabel — ein 6%-6\%- und ein +6%+6\%-Schock ergeben dieselbe Varianz. GJR-t ist eine Parabel mit einem Knick im Ursprung, höher auf dem linken Arm. EGARCH-t ist das exponentielle V, und wenn dessen linker Arm über seinem rechten liegt, haben Sie den Leverage-Effekt und die Vorzeichenkonvention auf einen Blick bestätigt. Liegt der linke EGARCH-Arm unter dem rechten, wurde entweder γ\gamma positiv geschätzt (ein Aufwärts-Vol-Regime) oder Sie haben das Vorzeichen verkehrt herum — der Plot sagt Ihnen ohne Raten, welches von beiden zutrifft.

Ein direkter Vergleich der vier Modelle

Bevor wir uns dem Risiko zuwenden, hilft es, die vier Modelle nebeneinander zu halten. Jede Zeile ist eine Designentscheidung, und die Spalten zeigen, was diese Entscheidung kostet und einbringt.

Eigenschaft GARCH-N GJR-t EGARCH-t GJR-skewt
Asymmetrie (Vorzeichen des Schocks) keine Schwellenwert γIε2\gamma I\varepsilon^2 vorzeichenbehaftet γz\gamma z Schwellenwert γIε2\gamma I\varepsilon^2
Randform der Innovation Gauß Student-tt Student-tt Skew-tt
Schiefe der Innovation nein nein nein ja (λ\lambda)
Positivitätsrestriktionen ja ja (α+γ0\alpha+\gamma\ge0) keine (Log-Form) ja
Stationaritätsbedingung α+β<1\alpha+\beta<1 α+β+12γ<1\alpha+\beta+\tfrac12\gamma<1 β<1\lvert\beta\rvert<1 α+β+P(z<0)γ<1\alpha+\beta+P(z<0)\gamma<1
Zusatzparameter vs. Baseline 0 γ,ν\gamma,\nu γ,ν\gamma,\nu γ,ν,λ\gamma,\nu,\lambda
Typisches Krypto-Urteil scheitert im VaR-Backtest stark, robust stark, robust marginal ggü. GJR-t

Das zu verinnerlichende Muster: Der Sprung von Spalte 1 zu Spalte 2 — das gleichzeitige Hinzufügen von Asymmetrie und fetten Rändern — ist der Ort, an dem nahezu die gesamte Verbesserung der Risikokalibrierung liegt. Die folgenden Verfeinerungen (EGARCHs funktionale Form, der Schiefe-Term) sind real, aber zweitrangig, und auf vielen Krypto-Reihen liegen sie im Rauschen. Investieren Sie Ihr Modellierungsbudget in den ersten Sprung und seien Sie beim Rest skeptisch.

Risikoanwendung: VaR und Expected Shortfall

Ein raffinierteres Volatilitätsmodell zu schätzen lohnt sich nur, wenn es eine Entscheidung verbessert. Die sauberste zu verbessernde Entscheidung ist die Ein-Schritt-Prognose des Tail-Risikos: Wie schlimm kann morgen werden? Wir erzeugen einen Value-at-Risk und einen Expected Shortfall für einen Tag im Voraus (auch bekannt als Conditional VaR, den die HRP/CVaR-Portfolio-Pipeline als Zielgröße verwendet) direkt aus der geschätzten GARCH-tt-/Skew-tt-Prognose.

Von der bedingten Verteilung zum VaR

Die GARCH-Maschinerie liefert eine Ein-Schritt-Prognose des bedingten Mittelwerts μt+1\mu_{t+1} und der bedingten Standardabweichung σt+1\sigma_{t+1}. Die Rendite wird als rt+1=μt+1+σt+1zt+1r_{t+1} = \mu_{t+1} + \sigma_{t+1} z_{t+1} modelliert, wobei zt+1z_{t+1} aus der geschätzten standardisierten Verteilung (Gauß, tt oder Skew-tt) gezogen wird. Das α\alpha-Quantil der Rendite ist also bloß eine affine Transformation des α\alpha-Quantils der standardisierten Verteilung:

VaRα(t+1)=(μt+1+σt+1Fz1(1α))\text{VaR}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, F_z^{-1}(1-\alpha)\Bigr)

wobei Fz1F_z^{-1} das Quantil (inverse CDF) der standardisierten Innovation ist und das führende Minuszeichen der Konvention folgt, dass VaR eine positive Verlustzahl ist. Für einen 99%-VaR ist α=0.99\alpha = 0.99, und Sie setzen Fz1(0.01)F_z^{-1}(0.01) ein. Der gesamte Nutzen des tt/Skew-tt zeigt sich hier: Fz1(0.01)F_z^{-1}(0.01) ist negativer als das gaußsche 2.326-2.326, sodass der VaR ehrlich größer ausfällt.

Expected Shortfall

VaR nennt Ihnen die Schwelle; er sagt nichts darüber, wie schlimm der Durchbruch ist, wenn er eintritt. Der Expected Shortfall — der durchschnittliche Verlust bedingt darauf, dass der VaR überschritten wird — tut dies, und er ist kohärent (subadditiv), weshalb er das Risikomaß hinter der CVaR-Optimierung ist und weshalb Basel dazu übergegangen ist. Für ein Location-Scale-Modell gilt

ESα(t+1)=(μt+1+σt+1E ⁣[zzFz1(1α)]).\text{ES}_{\alpha}(t+1) = -\Bigl(\mu_{t+1} + \sigma_{t+1}\, \mathbb{E}\!\left[z \mid z \leq F_z^{-1}(1-\alpha)\right]\Bigr).

Der Term der bedingten Tail-Erwartung E[zzq]\mathbb{E}[z \mid z \le q] hat für die Standardverteilungen geschlossene Formen. Für die Gaußverteilung, mit q=Φ1(1α)q = \Phi^{-1}(1-\alpha),

E[zzq]=ϕ(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\phi(q)}{1-\alpha},

wobei ϕ\phi die Dichte der Standardnormalverteilung ist. Für das standardisierte Student-tt mit ν\nu Freiheitsgraden und q=tν1(1α)q = t_\nu^{-1}(1-\alpha) (auf der standardisierten Skala) ist die Tail-Erwartung

E[zzq]=ν+q2ν1gν(q)1α,\mathbb{E}[z \mid z \le q] = -\frac{\nu + q^2}{\nu - 1}\cdot\frac{g_\nu(q)}{1-\alpha},

wobei gνg_\nu die standardisierte tt-Dichte ist. Der tt-Expected-Shortfall übersteigt den gaußschen um mehr, als es der VaR tut, weil der tt-Rand nicht nur weiter draußen ist — er ist auch fetter, sodass der durchschnittliche Verlust jenseits der Schwelle überproportional groß ist. Diese zusätzliche Lücke ist die Zahl, die ein gaußsches Modell vor Ihnen verbirgt.

VaR und ES aus einem geschätzten arch-Modell berechnen

arch-Verteilungen stellen eine Methode ppf (Quantil) bereit, sodass wir das standardisierte Quantil direkt erhalten und nichts neu herleiten müssen. Für den ES integrieren wir numerisch, was robust ist und über normal/t/skewt hinweg einheitlich funktioniert.

from scipy import integrate

def var_es_forecast(res, alpha=0.99):
    """
    One-step-ahead VaR and ES at level alpha, on the same (x100) scale
    as the returns fed to the model. Divide by 100 for fractional units.
    """
    fc = res.forecast(horizon=1, reindex=False)
    mu = fc.mean.iloc[-1, 0]
    sigma = np.sqrt(fc.variance.iloc[-1, 0])

    dist = res.model.distribution          # StudentsT / SkewStudent / Normal
    dp = [res.params[k] for k in res.params.index
          if k in ("nu", "eta", "lambda", "lam")]

    z_q = dist.ppf(1 - alpha, dp) if dp else dist.ppf(1 - alpha)
    z_q = float(np.atleast_1d(z_q)[0])

    def pdf(z):
        arr = np.atleast_1d(z).astype(float)
        lp = dist.loglikelihood(dp, arr, np.ones_like(arr), individual=True) \
             if dp else dist.loglikelihood([], arr, np.ones_like(arr),
                                           individual=True)
        return np.exp(lp)

    num, _ = integrate.quad(lambda z: z * pdf(z), -30, z_q, limit=200)
    es_z = num / (1 - alpha)               # E[z | z <= z_q]

    var = -(mu + sigma * z_q)
    es  = -(mu + sigma * es_z)
    return {"mu": mu, "sigma": sigma, "z_q": z_q,
            "VaR": var, "ES": es}

for name in ["GARCH-N", "GJR-t", "GJR-skewt"]:
    out = var_es_forecast(models[name], alpha=0.99)
    print(f"{name:11s}  sigma={out['sigma']:.2f}%  "
          f"z_q={out['z_q']:+.2f}  "
          f"VaR99={out['VaR']:.2f}%  ES99={out['ES']:.2f}%")

Die Spalte z_q ist die ganze Geschichte in einer Zahl. Das gaußsche Modell verwendet zq2.33z_q \approx -2.33; das tt mit ν4.3\nu \approx 4.3 verwendet etwas nahe 3.3-3.3; das Skew-tt schiebt das linke Quantil noch weiter hinaus, während es das rechte hereinzieht. Gleiches σt+1\sigma_{t+1}, wesentlich größerer VaR. Wenn Sie bislang gaußschen VaR auf Krypto gefahren haben, ist dies die Lücke, die Sie stillschweigend aufgesogen haben.

Ein Schritt vs. mehrere Schritte: Eine Warnung

Alles oben ist eine Prognose für einen Tag im Voraus, und dort ist GARCH-VaR am saubersten. Zwei Dinge verkomplizieren längere Horizonte, und Sie sollten sie kennen, bevor Sie extrapolieren.

Erstens kehren Varianzprognosen zum Mittel zurück. Die bedingte Varianz hh Schritte im Voraus aus einem stationären GARCH konvergiert mit wachsendem hh gegen das unbedingte Niveau σˉ2\bar\sigma^2, und die kumulierte hh-Tages-Varianz ist die Summe der Ein-Schritt-Prognosen — sie ist nicht h×σt+12h\times\sigma_{t+1}^2, es sei denn, die Volatilität liegt auf ihrem langfristigen Mittel. Die naive „Wurzel-aus-der-Zeit“-Skalierung VaR(h)=hVaR(1)\text{VaR}(h) = \sqrt{h}\,\text{VaR}(1) ignoriert diese Mittelrückkehr und ist gerade nach einem Schock falsch, wenn Sie die Zahl am dringendsten brauchen. Verwenden Sie den modelleigenen mehrstufigen Varianzpfad.

Zweitens hat die Verteilung einer Mehrtagesrendite nicht dieselbe Form wie die Ein-Tages-Innovation. Das Summieren mehrerer tt-verteilter Tagesschocks (durch die nichtlineare GARCH-Rekursion) ergibt am hh-Tages-Horizont keine tt-Verteilung; es gibt keine saubere geschlossene Form. Für Mehrtages-VaR ist der ehrliche Weg die Simulation: Innovationspfade aus der geschätzten standardisierten Verteilung ziehen, sie durch die GARCH-Rekursion laufen lassen, um simulierte Renditepfade zu erhalten, auf hh-Tages-Renditen aggregieren und das empirische Quantil ablesen. Das behandelt auch natürlich den Skew-tt-Fall, in dem überhaupt kein analytisches Mehr-Horizont-Quantil existiert. Die Ein-Schritt-Analyseformeln in diesem Beitrag sind exakt; behandeln Sie jede mehrstufige Abkürzung als eine zu validierende Näherung.

VaR backtesten: Kupiec und Christoffersen

Eine VaR-Prognose ist eine probabilistische Behauptung: „Der Verlust wird diese Schwelle nur an (1α)(1-\alpha) der Tage überschreiten.“ Sie testen sie, indem Sie die Verletzungen zählen (Tage, an denen der realisierte Verlust den prognostizierten VaR überstieg) über eine Walk-Forward-Evaluierung und zwei Dinge prüfen. Erstens: Ist die Verletzungsrate korrekt? Zweitens: Sind die Verletzungen unabhängig, oder clustern sie (was bedeutet, dass das Modell genau dann versagt, wenn es darauf ankommt, während Volatilitätsspitzen)?

Sei It=1{losst>VaRt}I_t = \mathbf{1}\{\text{loss}_t > \text{VaR}_t\} die Verletzungsfolge, N=ItN = \sum I_t die Anzahl der Verletzungen über TT Tage und π^=N/T\hat{\pi} = N/T die beobachtete Rate. Zielrate p=1αp = 1-\alpha.

Kupiecs Test der unbedingten Abdeckung (1995) prüft π^p\hat\pi \approx p über einen Likelihood-Ratio:

LRuc=2log ⁣[pN(1p)TNπ^N(1π^)TN]    χ12.LR_{uc} = -2\log\!\left[\frac{p^{N}(1-p)^{T-N}}{\hat\pi^{N}(1-\hat\pi)^{T-N}}\right] \;\sim\; \chi^2_1.

Christoffersens Unabhängigkeitstest (1998) prüft, dass eine Verletzung heute nicht durch eine Verletzung gestern vorhergesagt wird. Sei nijn_{ij} die Anzahl der Übergänge von Zustand ii zu Zustand jj in der Verletzungsfolge, π01=n01/(n00+n01)\pi_{01} = n_{01}/(n_{00}+n_{01}), π11=n11/(n10+n11)\pi_{11} = n_{11}/(n_{10}+n_{11}) und π=(n01+n11)/T\pi = (n_{01}+n_{11})/T. Dann

LRind=2log ⁣[(1π)n00+n10πn01+n11(1π01)n00π01n01(1π11)n10π11n11]    χ12.LR_{ind} = -2\log\!\left[\frac{(1-\pi)^{n_{00}+n_{10}}\,\pi^{\,n_{01}+n_{11}}}{(1-\pi_{01})^{n_{00}}\pi_{01}^{n_{01}}(1-\pi_{11})^{n_{10}}\pi_{11}^{n_{11}}}\right] \;\sim\; \chi^2_1.

Die beiden kombinieren sich zum Test der bedingten Abdeckung LRcc=LRuc+LRindχ22LR_{cc} = LR_{uc} + LR_{ind} \sim \chi^2_2, der gleichzeitig die korrekte Rate und die Unabhängigkeit prüft. Ein Modell kann Kupiec bestehen (richtige Anzahl von Verletzungen), aber Christoffersen nicht bestehen (sie ballten sich alle in einer Crash-Woche) — das ist der Versagensmodus, den Sie am dringendsten aufdecken wollen, denn geclusterte Verletzungen sind diejenigen, die ein Konto sprengen.

from scipy.stats import chi2

def var_backtest(losses, var, p):
    """
    losses, var: 1D arrays, same length; loss>0 is a loss, var>0 threshold.
    p = 1 - alpha (target violation rate, e.g. 0.01 for 99% VaR).
    Returns Kupiec, Christoffersen-independence, and conditional-coverage LR.
    """
    losses = np.asarray(losses)
    var = np.asarray(var)
    I = (losses > var).astype(int)          # violation indicators
    T = len(I)
    N = int(I.sum())
    pi_hat = N / T

    eps = 1e-12
    ll_null = N * np.log(p + eps) + (T - N) * np.log(1 - p + eps)
    ll_alt  = N * np.log(pi_hat + eps) + (T - N) * np.log(1 - pi_hat + eps)
    LR_uc = -2 * (ll_null - ll_alt)
    p_uc = 1 - chi2.cdf(LR_uc, df=1)

    n00 = np.sum((I[:-1] == 0) & (I[1:] == 0))
    n01 = np.sum((I[:-1] == 0) & (I[1:] == 1))
    n10 = np.sum((I[:-1] == 1) & (I[1:] == 0))
    n11 = np.sum((I[:-1] == 1) & (I[1:] == 1))
    pi01 = n01 / (n00 + n01) if (n00 + n01) else 0.0
    pi11 = n11 / (n10 + n11) if (n10 + n11) else 0.0
    pi   = (n01 + n11) / (n00 + n01 + n10 + n11)

    def _ll(pi01, pi11, pi_pooled, use_pooled):
        if use_pooled:
            a = (n00 + n10) * np.log(1 - pi_pooled + eps)
            b = (n01 + n11) * np.log(pi_pooled + eps)
            return a + b
        return (n00 * np.log(1 - pi01 + eps) + n01 * np.log(pi01 + eps)
                + n10 * np.log(1 - pi11 + eps) + n11 * np.log(pi11 + eps))

    LR_ind = -2 * (_ll(pi01, pi11, pi, True) - _ll(pi01, pi11, pi, False))
    p_ind = 1 - chi2.cdf(LR_ind, df=1)

    LR_cc = LR_uc + LR_ind
    p_cc = 1 - chi2.cdf(LR_cc, df=2)

    return {
        "T": T, "violations": N,
        "obs_rate": pi_hat, "target_rate": p,
        "LR_uc": LR_uc, "p_uc": p_uc,
        "LR_ind": LR_ind, "p_ind": p_ind,
        "LR_cc": LR_cc, "p_cc": p_cc,
    }

Um die Eingaben losses/var ehrlich zu erzeugen, schätzen Sie neu (oder prognostizieren zumindest neu) auf einem expandierenden oder rollierenden Fenster und zeichnen den Ein-Schritt-VaR für jeden Out-of-Sample-Tag auf, um ihn dann mit dem realisierten Verlust dieses Tages zu vergleichen. Backtesten Sie VaR niemals In-Sample — ein Modell, das auf demselben Crash geschätzt wurde, den es vorhersagen soll, wird weit besser aussehen, als es ist. Das ist dieselbe Disziplin wie die Backtest-Live-Parität: Die Evaluierung darf nur Information nutzen, die zum Entscheidungszeitpunkt verfügbar war.

def walk_forward_var(returns, alpha=0.99, start=750, refit_every=25,
                     vol="Garch", o=1, dist="t"):
    """
    Expanding-window one-step VaR. Refit every `refit_every` days
    (refitting daily is correct but slow; every ~25 days is a common
    compromise -- validate the shortcut on your data).
    """
    losses, vars_ = [], []
    res = None
    for t in range(start, len(returns)):
        if res is None or (t - start) % refit_every == 0:
            am = arch_model(returns.iloc[:t], mean="Constant",
                            vol=vol, p=1, o=o, q=1, dist=dist)
            res = am.fit(disp="off")
        fc = res.forecast(horizon=1, reindex=False)
        mu = fc.mean.iloc[-1, 0]
        sig = np.sqrt(fc.variance.iloc[-1, 0])
        dp = [res.params[k] for k in res.params.index
              if k in ("nu", "eta", "lambda", "lam")]
        z_q = float(np.atleast_1d(
            res.model.distribution.ppf(1 - alpha, dp) if dp
            else res.model.distribution.ppf(1 - alpha))[0])
        var_t = -(mu + sig * z_q)
        vars_.append(var_t)
        losses.append(-returns.iloc[t])     # realized loss for that day
    return np.array(losses), np.array(vars_)

losses, vars_ = walk_forward_var(r, alpha=0.99, dist="t")
print(var_backtest(losses, vars_, p=0.01))

Die Lesart: Ein gut kalibrierter 99%-VaR zeigt eine beobachtete Rate nahe 1%, ein nicht signifikantes Kupiec (großes p_uc) und ein nicht signifikantes Christoffersen (großes p_ind) — kein Clustering. In der Praxis ist das ehrliche Ergebnis bei Krypto, dass GARCH-Normal Kupiec nicht besteht (zu viele Verletzungen, p_uc winzig), während GJR-tt oder EGARCH-tt besteht oder nahe dran ist. Dieser Kontrast ist das gesamte Argument dieses Beitrags, wiedergegeben als Hypothesentest. Zeigt selbst das tt-Modell geclusterte Verletzungen (kleines p_ind), ist Ihre Volatilitätsdynamik immer noch fehlspezifiziert — oft ein Zeichen, dass Sie ein längeres Gedächtnis (Component/FIGARCH) oder eine Regime-Ebene brauchen, was an die Regime-Erkennung mit HMMs anknüpft.

Modelle nach Tail-Verlust ranken, nicht bloß nach Bestehen/Nichtbestehen

Kupiec und Christoffersen geben Ihnen ein binäres Urteil — das Modell wird verworfen oder nicht. Das ist notwendig, aber grob: Zwei Modelle können beide „bestehen“, während eines bedeutend schärfer ist. Um konkurrierende VaR-Prognosen zu ranken, bewerten Sie sie mit einer strikt konsistenten Verlustfunktion für das Quantil, dem Pinball- (Quantils-) Verlust:

Lτ(r,q)=(τ1{r<q})(rq),τ=1α,L_\tau(r, q) = \bigl(\tau - \mathbf{1}\{r < q\}\bigr)\,(r - q), \qquad \tau = 1-\alpha,

wobei qq das (vorzeichenbehaftete) VaR-Quantil und rr die realisierte Rendite ist. Gemittelt über die Out-of-Sample-Tage bedeutet ein niedrigerer mittlerer Pinball-Verlust ein besser kalibriertes und schärferes Quantil; da der Verlust konsistent für das τ\tau-Quantil ist, belohnt seine Minimierung ein Modell nicht dafür, faul breit zu sein. Um zwei Modelle formal zu vergleichen, geben Sie ihre tagesweisen Verlustdifferenzen in einen Diebold-Mariano-Test.

def pinball_loss(returns, var, alpha=0.99):
    tau = 1 - alpha
    q = -np.asarray(var)               # VaR is a positive loss; quantile is negative
    r = np.asarray(returns)
    hit = (r < q).astype(float)
    return np.mean((tau - hit) * (r - q))

Speziell für den Expected Shortfall ist zu beachten, dass ES für sich genommen nicht elicitierbar ist (es gibt keine Verlustfunktion, deren Minimierer ES allein ist), was eine echte theoretische Feinheit ist: Sie evaluieren ES gemeinsam mit VaR über die Fissler-Ziggel-Scoring-Regeln, oder Sie greifen auf die einfachere Praxis zurück, zu prüfen, dass die durchschnittliche Durchbruchsgröße dem vom Modell prognostizierten ES entspricht. Ein grober, aber nützlicher ES-Check: Vergleichen Sie unter den VaR-Verletzungstagen den mittleren realisierten Verlust mit dem mittleren prognostizierten ES an diesen Tagen — sie sollten nahe beieinanderliegen.

Der regulatorische Rahmen ist der Basel-Ampel-Ansatz: Über 250 Handelstage sind 0–4 Verletzungen eines 99%-VaR „grün“ (akzeptabel), 5–9 sind „gelb“ (Prüfung), 10+ sind „rot“ (das Modell wird verworfen, und die Kapitalmultiplikatoren steigen). Er ist ein gröberer Vetter von Kupiec, aber er ist die Sprache, die Risikokomitees tatsächlich sprechen, und es lohnt sich, ihn neben den LR-Statistiken zu berichten.

Praktische Überlegungen

Wenn sich die zusätzlichen Parameter nicht auszahlen

Die ehrliche Voreinstellung ist Skepsis gegenüber Komplexität. Jeder Parameter, den Sie hinzufügen, ist ein Regler, an dem der Optimierer überanpassen kann, und asymmetrisches, fat-tailed GARCH hat mehrere. Konkrete Leitlinien:

  • Illiquide oder kurze Stichproben. Bei ein paar hundert täglichen Beobachtungen wird der Standardfehler auf γ\gamma und λ\lambda groß sein, und Sie werden Asymmetrien „entdecken“, die Stichprobenrauschen sind. Bei einem neuen oder dünnen Altcoin ist ein symmetrisches GARCH-tt oft das komplexeste Modell, das die Daten tragen können. Ein Skew-tt-EGARCH an 200 Tage anzupassen, führt Sie in die Irre.
  • Der Schiefe-Term deckt häufig nicht seine Kosten. In der Praxis ist der Übergang Normal → tt eine große, verlässliche Verbesserung (fette Ränder sind real und stark). Der Übergang tt → Skew-tt ist oft marginal — ein BIC-Gewinn von 1 oder 2, mitunter negativ. Fügen Sie Schiefe nur hinzu, wenn die Daten es klar verlangen.
  • EGARCH vs. GJR ist bei Tagesdaten meist ein Patt. Sie kodieren dieselbe qualitative Geschichte mit unterschiedlichen funktionalen Formen. Wählen Sie über den Out-of-Sample-VaR-Backtest, nicht danach, welches die schönere In-Sample-Log-Likelihood hat.
  • Höhere Frequenz verändert die Antwort. Auf Stunden- oder Minuten-Bars dominieren Intraday-Saisonalität und Mikrostruktur, und ein einfaches Tages-GARCH ist unabhängig von der Asymmetrie fehlspezifiziert. Anderes Problem, anderes Werkzeug.

Dies ist dieselbe Lektion wie bei der ehrlichen Evaluierung ohne robusten Edge: Ein komplexeres Modell, das den Out-of-Sample-Test nicht übersteht, ist schlechter als das einfache, das es ersetzte, weil es die Illusion von Präzision mit sich trägt. Berichten Sie das negative Ergebnis — „Schiefe half bei ETH nicht“ — als echten Befund, und nutzen Sie die Walk-Forward-Optimierung als Schiedsrichter, nicht das In-Sample-AIC.

Dies sind die Randverteilungen, auf denen alle anderen aufbauen

Die Modelle hier sind kein Endpunkt; sie sind der univariate Baustein für die Maschinerie des gemeinsamen Risikos. Der Beitrag zu den Copula-Modellen für gemeinsames Krypto-Risiko verwendet genau EGARCH/GJR-tt als GARCH-EVT-Randverteilungen, bevor eine Vine-Copula geschätzt wird — Sie schätzen ein asymmetrisches, fat-tailed GARCH pro Asset, extrahieren standardisierte Residuen und modellieren erst dann die Abhängigkeit zwischen den Assets. Ist Ihre Randverteilung ein symmetrisches gaußsches GARCH, erbt die Copula deren Tail-Fehler, egal wie gut das Abhängigkeitsmodell ist. Schrott-Randverteilungen, Schrott-Gesamt-VaR.

Für das multivariate Volatilitätsproblem — zeitvariable Korrelationen statt asset-weiser Varianzen — siehe Teil 3, DCC-GARCH, der ein Modell dynamischer Korrelation auf diese univariaten Anpassungen aufsetzt. Und um eine Volatilitätsprognose in Positionsgrößen und einen Trading-Backtest zu verwandeln, verwendet Teil 4 zum Volatility Targeting die σt+1\sigma_{t+1}-Prognosen aus genau diesen Modellen, um das Exposure invers zum prognostizierten Risiko zu skalieren.

Eine verteilungsfreie Alternative

Alles im Risikoabschnitt beruht auf einer parametrischen Annahme: dass standardisierte Residuen einem tt oder Skew-tt folgen. Diese Annahme ist testbar und meist vernünftig, kann aber scheitern. Wenn Sie sich lieber überhaupt nicht auf eine Randform festlegen, liefert die konforme Vorhersage (Conformal Prediction) verteilungsfreie Vorhersageintervalle mit Endstichproben-Abdeckungsgarantien — eine tatsächlich andere Philosophie, die keine Behauptung über die Innovationsverteilung aufstellt. Die beiden Ansätze sind komplementär: Parametrisches GARCH-tt gibt Ihnen eine vollständige bedingte Dichte (und damit ES, den konforme Intervalle nicht direkt liefern), während Conformal Ihnen eine Abdeckung gibt, die auch dann hält, wenn Ihre Dichte falsch ist. In der Produktion ist der Einsatz beider als Gegenprobe eine billige Versicherung.

Numerische Hygiene und Workflow-Hygiene

  • Renditen mit 100 skalieren. GARCH-Optimierer konvergieren weit zuverlässiger auf Prozent-Renditen als auf rohen fraktionalen Renditen. Denken Sie daran, VaR/ES zurückzuskalieren, falls Sie in fraktionalen Einheiten berichten.
  • Auf die Persistenz achten. Schätzt α+β+12γ\alpha + \beta + \tfrac12\gamma über ~0.999, ist das Modell nahezu integriert (IGARCH-ähnlich); Prognosen kehren extrem langsam zum Mittel zurück, und Langhorizont-Varianzprognosen werden unzuverlässig. Nicht notwendigerweise falsch, aber markieren Sie es.
  • Konvergenzfehler auf rollierenden Fenstern. EGARCHs Log-Form vermeidet Positivitätsrestriktionen, kann aber dennoch auf einem pathologischen Fenster nicht konvergieren. Umgeben Sie fit() mit einem try/except und greifen Sie auf die Parameter des vorherigen Fensters zurück, statt einen Live-Backtest abstürzen zu lassen.
  • Mittelwertmodell. Wir haben durchgehend einen konstanten Mittelwert verwendet. Für die meisten täglichen Krypto-Daten liegt der bedingte Mittelwert nahe null und wird von der Volatilität überlagert; verschwenden Sie keine Modellkomplexität darauf, ihn zu prognostizieren, sofern Sie keinen echten Grund haben.

Zusammenfassung

  • Einfaches GARCH(1,1) hat zwei strukturelle Mängel: Es ist symmetrisch (reagiert auf +x%+x\% und x%-x\% identisch, weil Schocks als ε2\varepsilon^2 eingehen) und es unterstellt gaußsche Innovationen (die fetten Ränder von Krypto zu niedrig bepreisend). Beides kostet über einen optimistischen VaR echtes Geld.
  • GJR-GARCH fügt einen Schwellenwert-Term γI(εt1<0)εt12\gamma\,I(\varepsilon_{t-1}<0)\,\varepsilon_{t-1}^2 hinzu. Ein signifikantes γ>0\gamma > 0 ist der Leverage-Effekt: Schlechte Nachrichten erhöhen die Volatilität stärker. Positivität erfordert α+γ0\alpha+\gamma\ge0; die Persistenz ist α+β+12γ\alpha+\beta+\tfrac12\gamma.
  • EGARCH modelliert logσt2\log\sigma_t^2, sodass keine Positivitätsrestriktionen gelten und die Stationarität bloß β<1|\beta|<1 lautet. Asymmetrie geht über einen vorzeichenbehafteten Term γzt1\gamma z_{t-1} ein (Leverage ist γ<0\gamma<0 in dieser Konvention), getrennt von einem Magnituden-Term zt1|z_{t-1}|.
  • Die News-Impact-Kurve — Varianz der nächsten Periode gegen den letzten Schock — macht die Asymmetrie sichtbar und verifiziert die EGARCH-Vorzeichenkonvention auf einen Blick.
  • Student-tt-Innovationen (dist='t') beheben die Ränder über einen Freiheitsgrad ν\nu (typischerweise 3–6 für Krypto); Hansens Skew-tt (dist='skewt') fügt eine Schiefe λ\lambda für einen schwereren linken Rand hinzu. Der Übergang Normal → tt ist ein großer, verlässlicher Gewinn; tt → Skew-tt ist oft marginal.
  • VaR und ES folgen aus der geschätzten bedingten Verteilung: VaRα=(μt+1+σt+1Fz1(1α))\text{VaR}_\alpha = -(\mu_{t+1} + \sigma_{t+1}F_z^{-1}(1-\alpha)), wobei das fat-tailed Quantil das Risiko ehrlich größer macht als gaußsch. ES (kohärent, \approx CVaR) erfasst den durchschnittlichen Verlust jenseits des VaR.
  • Backtesten mit Kupiec und Christoffersen. Kupiec prüft die Verletzungsrate; Christoffersen prüft, dass Verletzungen nicht geclustert sind. Ein Modell kann das eine bestehen und das andere nicht — geclusterte Verletzungen sind der gefährliche Versagensmodus. Backtesten Sie strikt out-of-sample.
  • Disziplin vor Komplexität. Fügen Sie Asymmetrie/Schiefe nur hinzu, wenn sie den BIC und einen Out-of-Sample-VaR-Backtest übersteht. Auf kurzen oder illiquiden Reihen gewinnt meist das einfachere Modell.

References:

  • Nelson, D. B. (1991). Conditional heteroskedasticity in asset returns: A new approach. Econometrica, 59(2), 347-370. DOI
  • Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). On the relation between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance, 48(5), 1779-1801. DOI
  • Bollerslev, T. (1987). A conditionally heteroskedastic time series model for speculative prices and rates of return. Review of Economics and Statistics, 69(3), 542-547. DOI
  • Hansen, B. E. (1994). Autoregressive conditional density estimation. International Economic Review, 35(3), 705-730. DOI
  • Engle, R. F., & Ng, V. K. (1993). Measuring and testing the impact of news on volatility. Journal of Finance, 48(5), 1749-1778. DOI
  • Christoffersen, P. F. (1998). Evaluating interval forecasts. International Economic Review, 39(4), 841-862. DOI
  • Kupiec, P. H. (1995). Techniques for verifying the accuracy of risk measurement models. Journal of Derivatives, 3(2), 73-84. DOI
  • Black, F. (1976). Studies of stock price volatility changes. Proceedings of the American Statistical Association, Business and Economic Statistics Section, 177-181.
  • McNeil, A. J., Frey, R., & Embrechts, P. (2015). Quantitative Risk Management: Concepts, Techniques and Tools (2nd ed.). Princeton University Press.
  • Sheppard, K. (2023). arch: Autoregressive conditional heteroskedasticity models in Python. GitHub.
blog.disclaimer

MarketMaker.cc Team

Quantitative Research & Strategy

Discuss in Telegram
Newsletter

Dem Markt einen Schritt voraus

Abonniere unseren Newsletter für exklusive KI-Trading-Einblicke, Marktanalysen und Plattform-Updates.

Wir respektieren deine Privatsphäre. Jederzeit abbestellbar.