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

Volatility Targeting und Trading mit GARCH-Prognosen

#volatility
#GARCH
#volatility-targeting
#backtesting
#risk
#crypto
#algorithmic-trading

Die ersten drei Teile dieser Serie haben Ihnen beigebracht, Volatilität zu prognostizieren. Wir haben in Teil 1 ein univariates GARCH(1,1) gebaut, in Teil 2 mit GJR und Student-t-Innovationen Leverage und fette Ränder ergänzt und in Teil 3 mit DCC-GARCH eine ganze Kovarianzmatrix über die Zeit modelliert. Am Ende jedes Teils haben wir eine Zahl ausgegeben: die erwartete Volatilität von morgen. Und dann haben wir, wenn wir ehrlich sind, aufgehört - als wäre das Erzeugen der Prognose der eigentliche Zweck.

Das ist es nicht. Eine Volatilitätsprognose ist kein P&L. Niemand wurde je für einen niedrigen QLIKE-Wert bezahlt. Eine Prognose wird erst in dem genauen Moment etwas wert, in dem sie eine Entscheidung ändert, die Sie sonst anders getroffen hätten - wie viel Sie kaufen, wann Sie reduzieren, wie viel Kapital Sie allokieren. Wenn Ihre Prognose keine Position bewegt, ist ihre statistische Genauigkeit ein privates Hobby.

Dieser letzte Teil dreht sich darum, diesen Kreis zu schließen. Wir nehmen die Prognosen aus den Teilen 1-3 und setzen sie in der saubersten möglichen Entscheidung ein: Volatility Targeting - das Dimensionieren einer Position, sodass die realisierte Volatilität des Portfolios ein konstantes Ziel trifft. Dann tun wir das, was diesem Blog wichtiger ist als jedes einzelne Modell: Wir bewerten ehrlich. Wir vergleichen GARCH gegen dumme-aber-starke Baselines (rollierende Realized Vol, EWMA), wir verwenden Verlustfunktionen, die robust gegen die Tatsache sind, dass wir wahre Volatilität nie beobachten können, wir führen einen Walk-Forward-Backtest mit Kosten und ohne Look-Ahead durch, und wir sagen klar, was Vol Targeting Ihnen bringt und was nicht. Spoiler: Es verbessert die risikoadjustierten Renditen und bändigt Drawdowns weit zuverlässiger, als es Alpha erzeugt.

Warum Volatility Targeting der richtige Test ist

Es gibt raffiniertere Wege, eine Volatilitätsprognose zu nutzen - Optionspreisbewertung, VaR-Limits, dynamisches Hedging - aber Volatility Targeting ist derjenige, der den Wert der Prognose mit der geringsten Verunreinigung durch andere Wetten isoliert. Die Idee ist eine einzige Gleichung.

Halten Sie einen risikobehafteten Vermögenswert mit einer vom Signal implizierten Richtung (vorerst einfach "long"). Statt einer festen Position skalieren Sie das Exposure invers zur prognostizierten Volatilität:

wt=σtargetσ^t(then capped)w_t = \frac{\sigma_{\text{target}}}{\hat{\sigma}_{t}} \quad \text{(then capped)}

wobei σ^t\hat{\sigma}_t Ihre Prognose der Volatilität der nächsten Periode ist (erstellt nur mit Daten bis tt), und σtarget\sigma_{\text{target}} die annualisierte Volatilität ist, mit der die Strategie laufen soll - sagen wir 15% oder 20%. Wenn das Modell einen ruhigen Markt prognostiziert, hebeln Sie hoch in Richtung (oder über) 1,0; wenn es einen Sturm prognostiziert, verkleinern Sie. Die realisierte Volatilität der skalierten Position ist in erster Näherung

Vol(wtrt+1)=wtσt+1=σtargetσ^tσt+1σtarget\text{Vol}(w_t r_{t+1}) = w_t \, \sigma_{t+1} = \frac{\sigma_{\text{target}}}{\hat\sigma_t}\, \sigma_{t+1} \approx \sigma_{\text{target}}

sofern σ^tσt+1\hat\sigma_t \approx \sigma_{t+1}. Die gesamte Qualität der Übung ruht also auf einer Sache: wie nah Ihre Prognose σ^t\hat\sigma_t an der tatsächlichen Volatilität der nächsten Periode σt+1\sigma_{t+1} liegt. Eine bessere Prognose erzeugt ein flacheres Realized-Volatility-Profil und - wie wir sehen werden - ein besseres Sharpe Ratio. Deshalb ist dies der richtige Test. Die Prognose ist keine Dekoration; sie ist der Nenner.

Warum das den Sharpe erhöht und Drawdowns kontrolliert

Zwei empirische Fakten leisten hier die Arbeit.

Volatilität ist weit besser prognostizierbar als Renditen. Die Richtung der BTC-Rendite von morgen kommt bei täglicher Frequenz einem Münzwurf nahe; die Größe nicht. Volatilität clustert - große Bewegungen folgen auf große Bewegungen - was der ganze Grund dafür ist, dass GARCH existiert (Teil 1 hat die AR(1)-in-Varianz-Struktur hergeleitet, die dies kodiert). Ein R2R^2 von 0,4-0,6 für die Ein-Tages-Varianz ist Routine; dieselbe Zahl für Renditen wäre ein Signal von Renaissance-Niveau. Vol Targeting nutzt die prognostizierbare Größe aus und bleibt agnostisch gegenüber der unprognostizierbaren.

Sharpe Ratios sind nicht konstant über die Zeit; sie fallen, wenn die Volatilität hochschnellt. Hochvolatile Regime in Krypto - Deleveraging-Kaskaden, Börsenausfälle, die Tage, an denen alles um 30% aufreißt - haben tendenziell eine schlechtere Rendite pro Risikoeinheit, nicht eine bessere. Indem Sie das Exposure mechanisch genau dann reduzieren, wenn die prognostizierte Vol hoch ist, untergewichten Sie die Perioden, die am meisten zu Drawdowns und am wenigsten zur kumulierten Rendite beitragen. Moreira und Muir (2017) zeigten für Aktien, dass volatilitätsgemanagte Portfolios - genau diese 1/σ21/\sigma^2-Skalierung - Sharpe Ratios erhöhen und positive Alphas gegenüber dem ungemanagten Faktor erzeugen. Der Mechanismus ist keine Magie; er besteht darin, sich zu weigern, in vorhersehbar turbulenten Fenstern eine konstante Dollar-Position zu halten.

Der Drawdown-Nutzen ist sogar noch direkter. Der maximale Drawdown wird vom Rand der Positionsrendite-Verteilung dominiert. Da wtrt+1w_t r_{t+1} eine Volatilität nahe σtarget\sigma_{\text{target}} festgeklemmt hat, wird der fette linke Rand, unter dem eine Strategie mit festem Nominalvolumen während einer Vol-Explosion leidet, komprimiert: Sie waren bereits klein, als Sie hineingingen. Vol Targeting sagt keine Crashs voraus, aber es ist systematisch unterexponiert, wenn der Markt aufgewühlt ist, und Aufgewühltheit ist der Zustand, in dem Crashs passieren.

Beziehung zu Kelly und fraktionaler Dimensionierung

Volatility Targeting ist ein Cousin ersten Grades des Kelly-Kriteriums. Für einen einzelnen Vermögenswert mit erwarteter Überschussrendite μ\mu und Varianz σ2\sigma^2 ist der wachstumsoptimale (Full-Kelly-)Anteil

f=μσ2.f^\star = \frac{\mu}{\sigma^2}.

Wenn Sie annehmen, dass das Sharpe Ratio μ/σ\mu/\sigma ungefähr konstant ist - eine starke Annahme, aber die, die in "der Markt zahlt einen stabilen Preis für Risiko" implizit steckt - dann ist μ=Sσ\mu = S\sigma und f=S/σf^\star = S/\sigma, was genau Volatility Targeting mit σtarget=S(Kelly fraction)\sigma_{\text{target}} = S \cdot (\text{Kelly fraction}) ist. Mit anderen Worten: Volatility Targeting ist Kelly-Dimensionierung unter der Annahme, dass die erwartete Rendite mit der Volatilität skaliert. Wir arbeiten Full- und Fractional-Kelly durch und den Grund, warum niemand bei Verstand Full Kelly handelt, in Kelly-Kriterium und Strategie-Dimensionierung. Die praktische Lehre von dort überträgt sich: Verwenden Sie einen Bruchteil der theoretischen Größe, denn der Schätzfehler im Nenner (Ihre Vol-Prognose) und besonders im Zähler (erwartete Rendite) macht die volle Dimensionierung gefährlich aggressiv.

Zwei weitere Zusammenhänge, die man im Kopf behalten sollte. Erstens dimensioniert Vol Targeting auf der symmetrischen Streuung der Renditen, aber Krypto-Auszahlungen sind nicht symmetrisch - die Kosten eines Tages mit 20% Verlust sind nicht das Spiegelbild eines Tages mit 20% Gewinn, sobald Leverage und Liquidation im Spiel sind. Wir behandeln diese Asymmetrie direkt in Verlust-Gewinn-Asymmetrie, und eine GJR/EGARCH-Prognose (Teil 2) backt bereits etwas davon in σ^t\hat\sigma_t ein, indem sie stärker auf negative Schocks reagiert. Zweitens ist eine Vol-Prognose eine Punktschätzung; eine vollständigere Risikosicht hängt ihr ein Intervall an. Conformal Prediction für Trading zeigt, wie man Modellausgaben in verteilungsfreie Intervalle verwandelt, gegen die man dimensionieren kann, was natürlich zum Thema der ehrlichen Bewertung dieses Artikels passt.

Die Konkurrenten: Was GARCH schlagen muss

Hier ist die Disziplin, die eine echte Bewertung von einer Demo unterscheidet. Bevor Sie GARCH krönen, müssen Sie ihm Gegner geben, die billig, offensichtlich und überraschend schwer zu schlagen sind. Wenn Ihr aufwändiges GJR-t-Modell ein fünfzeiliges EWMA nicht übertreffen kann, haben Sie etwas Wertvolles gelernt und sich viel Produktionskomplexität erspart.

Wir vergleichen vier Prognosemodelle für die Volatilität der nächsten Periode.

(a) Nachlaufende realisierte Volatilität (rollierende Standardabweichung)

Die naivste Prognose: Die Volatilität von morgen entspricht der Stichproben-Standardabweichung der letzten nn Tagesrenditen.

σ^tRV=1n1i=1n(rti+1rˉ)2\hat\sigma_{t}^{\text{RV}} = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}\bigl(r_{t-i+1}-\bar r\bigr)^2}

Sie hat einen Hyperparameter (das Fenster nn, typisch 20-60 Tage) und kein Modell. Ihr Fehler ist, dass jede Beobachtung im Fenster gleiches Gewicht bekommt und dann abrupt von einer Klippe fällt, wenn sie herausfällt - der "Ghosting"- oder "Echo"-Effekt, bei dem ein einziger Crash-Tag die Prognose für genau nn Tage aufbläht und dann über Nacht verschwindet, unabhängig davon, ob sich der Markt tatsächlich beruhigt hat.

(b) EWMA / RiskMetrics (λ=0.94\lambda = 0.94)

Der exponentiell gewichtete gleitende Durchschnitt behebt das Echo-Problem, indem er älteren quadrierten Renditen geometrisch abfallendes Gewicht gibt:

σ^t2=λσ^t12+(1λ)rt2\hat\sigma_{t}^{2} = \lambda\,\hat\sigma_{t-1}^{2} + (1-\lambda)\,r_{t}^{2}

Dies ist der RiskMetrics-Schätzer (J.P. Morgan, 1996). Mit dem kanonischen λ=0.94\lambda = 0.94 für Tagesdaten beträgt das effektive Gedächtnis ungefähr 1/(1λ)171/(1-\lambda) \approx 17 Tage, aber der Abfall ist glatt - keine Klippe. Beachten Sie, was EWMA tatsächlich ist: Es ist ein integriertes GARCH(1,1) mit ω=0\omega = 0 und α+β=1\alpha + \beta = 1, d.h. GARCH ohne Mean Reversion und ohne langfristige Varianz. Es hat null freie Parameter, wenn Sie λ=0.94\lambda = 0.94 akzeptieren, und es ist die einzelne härteste Baseline in diesem ganzen Artikel. Ein großer Teil der "GARCH schlägt X"-Paper scheitert stillschweigend daran, EWMA out of sample zu schlagen.

import numpy as np
import pandas as pd

def ewma_vol(returns: pd.Series, lam: float = 0.94, sigma0: float | None = None) -> pd.Series:
    """RiskMetrics EWMA conditional volatility (returns in decimal, e.g. 0.03).

    sigma2_t = lam * sigma2_{t-1} + (1 - lam) * r_t^2
    Returns a series aligned to `returns` where value at t uses info up to t.
    """
    r2 = np.square(returns.values)
    var = np.empty_like(r2)
    var[0] = sigma0**2 if sigma0 is not None else r2[0]
    for t in range(1, len(r2)):
        var[t] = lam * var[t - 1] + (1.0 - lam) * r2[t - 1]  # note: r_{t-1}, no look-ahead
    return pd.Series(np.sqrt(var), index=returns.index, name="ewma_vol")

Die eine Feinheit, über die Leute stolpern: Die Prognose für Periode tt (nutzbar zur Dimensionierung einer über tt gehaltenen Position) muss aus Renditen gebaut werden, die vor tt beobachtet wurden. In der obigen Rekursion nutzt var[t] r2[t-1], sodass die Reihe eine echte Ein-Schritt-Vorausprognose ist. Diesen Index richtig hinzubekommen ist der Unterschied zwischen einem Backtest und einer Fantasie - mehr dazu im Walk-Forward-Abschnitt.

(c) GARCH(1,1) und GJR-t (Teile 1-2)

Unsere Protagonisten. Standard-GARCH(1,1):

σt2=ω+αϵt12+βσt12,ω>0, α,β0, α+β<1\sigma_t^2 = \omega + \alpha\, \epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2, \qquad \omega>0,\ \alpha,\beta\ge0,\ \alpha+\beta<1

mit langfristiger Varianz σˉ2=ω/(1αβ)\bar\sigma^2 = \omega/(1-\alpha-\beta) und der Ein-Schritt-Prognose, die direkt aus der Rekursion fällt (Teil 1). Die GJR-GARCH-Erweiterung fügt einen Leverage-Term hinzu, sodass negative Schocks die Varianz stärker erhöhen als positive:

σt2=ω+(α+γ1[ϵt1<0])ϵt12+βσt12\sigma_t^2 = \omega + (\alpha + \gamma\, \mathbb{1}[\epsilon_{t-1}<0])\,\epsilon_{t-1}^2 + \beta\,\sigma_{t-1}^2

und gepaart mit Student-t-Innovationen, um die fetten Ränder von Krypto zu behandeln, ist dies das GJR-t aus Teil 2. Der Grund, warum GARCH EWMA schlagen kann, ist Mean Reversion: Nach einem Schock zieht GARCH die Prognose mit einer durch α+β\alpha+\beta bestimmten Rate zurück in Richtung σˉ2\bar\sigma^2, während EWMA (da integriert) nie zurückkehrt. Wenn die Volatilität hochschnellt und sich dann normalisiert - der häufige Fall - klingt die GARCH-Prognose schneller und genauer ab. Wenn die Volatilität wirklich persistent ist, sind die beiden nahezu ununterscheidbar.

(d) HAR-RV auf realisierter Varianz (falls Sie Intraday-Daten haben)

Wenn Sie Intraday-Bars haben - und in 24/7-Krypto-Märkten haben Sie das fast immer - können Sie einen weit weniger verrauschten Volatilitäts-Proxy konstruieren als tägliche quadrierte Renditen: realisierte Varianz, die Summe der quadrierten Intraday-Renditen über den Tag.

RVt=i=1Mrt,i2(e.g. M=288 five-minute bars)RV_t = \sum_{i=1}^{M} r_{t,i}^2 \qquad (\text{e.g. } M = 288 \text{ five-minute bars})

Das Heterogeneous-Autoregressive-Modell von Corsi (2009) prognostiziert die realisierte Varianz von morgen aus täglichen, wöchentlichen und monatlichen Durchschnitten der vergangenen RVRV - ein grober, aber bemerkenswert wirksamer Weg, Long-Memory-Persistenz mit drei Regressoren zu erfassen:

RVt+1=β0+βdRVt+βwRVt(5)+βmRVt(22)+ut+1RV_{t+1} = \beta_0 + \beta_d\, RV_t + \beta_w\, \overline{RV}_t^{(5)} + \beta_m\, \overline{RV}_t^{(22)} + u_{t+1}

wobei RVt(5)\overline{RV}_t^{(5)} und RVt(22)\overline{RV}_t^{(22)} die nachlaufenden 5-Tages- und 22-Tages-Durchschnitte der täglichen RVRV sind. Es ist eine einfache OLS-Regression, sie nutzt den höherwertigen Intraday-Proxy, und sie ist häufig das beste Tages-Vol-Prognosemodell der vier - oft schlägt sie GARCH gerade deshalb, weil RVRV ein saubereres Ziel ist als r2r^2.

import numpy as np
import pandas as pd

def realized_variance(intraday_returns: pd.Series, day_index) -> pd.Series:
    """Daily realized variance = sum of squared intraday (log) returns per day.
    `intraday_returns` indexed by timestamp; `day_index` maps to calendar day.
    """
    return intraday_returns.pow(2).groupby(day_index).sum()

def har_features(rv: pd.Series) -> pd.DataFrame:
    """Build HAR regressors from a daily realized-variance series."""
    df = pd.DataFrame({"rv": rv})
    df["rv_d"] = df["rv"].shift(1)                          # yesterday
    df["rv_w"] = df["rv"].shift(1).rolling(5).mean()        # trailing week
    df["rv_m"] = df["rv"].shift(1).rolling(22).mean()       # trailing month
    df["target"] = df["rv"]                                 # predict today's RV
    return df.dropna()

def fit_har(rv: pd.Series):
    """Fit HAR-RV by OLS. Returns (coef_dict, predict_fn)."""
    df = har_features(rv)
    X = np.column_stack([np.ones(len(df)), df["rv_d"], df["rv_w"], df["rv_m"]])
    y = df["target"].values
    beta, *_ = np.linalg.lstsq(X, y, rcond=None)
    names = ["const", "rv_d", "rv_w", "rv_m"]

    def predict(rv_d, rv_w, rv_m):
        return float(beta @ np.array([1.0, rv_d, rv_w, rv_m]))

    return dict(zip(names, beta)), predict

Eine Anmerkung zu Log-HAR: Da RVRV rechtsschief und strikt positiv ist, regressieren viele Praktiker logRVt+1\log RV_{t+1} auf Log-HAR-Merkmale, was die Anpassung verbessert und positive Prognosen garantiert. Wenn Sie zurück exponenzieren, sollten Sie eine Halb-Varianz-Jensen-Korrektur hinzufügen, RV^=exp(y^+12σ^u2)\widehat{RV} = \exp(\hat{y} + \tfrac{1}{2}\hat\sigma_u^2), sonst werden Sie systematisch unterprognostizieren.

Mit vier Prognosemodellen zur Hand - RV, EWMA, GARCH/GJR-t, HAR - wird die Frage: Wie entscheiden wir, welches am besten ist, wenn wir das, was sie alle vorherzusagen versuchen, nie sehen können?

Eine Volatilitätsprognose ehrlich bewerten

Dies ist die Kernlehre des Artikels, also verlangsamen Sie hier.

Sie wollen Prognosen σ^t2\hat\sigma_t^2 gegen die wahre bedingte Varianz σt2\sigma_t^2 vergleichen. Aber σt2\sigma_t^2 ist eine latente Größe - sie ist ein Parameter des datenerzeugenden Prozesses, niemals direkt beobachtet. Alles, was Sie bekommen, ist eine realisierte Rendite pro Tag. Also ist jede Volatilitätsbewertung in Wirklichkeit ein Vergleich Ihrer Prognose gegen einen verrauschten Proxy für die Wahrheit. Die zwei Standard-Proxies:

  • Quadrierte Renditen rt2r_t^2. Erwartungstreu für σt2\sigma_t^2 unter einem Nullmittelwert-Modell (E[rt2Ft1]=σt2\mathbb{E}[r_t^2 \mid \mathcal{F}_{t-1}] = \sigma_t^2), aber extrem verrauscht: Eine einzelne Tagesrendite ist eine Ein-Beobachtungs-Schätzung einer Standardabweichung. Der Proxy rt2r_t^2 kann 0 sein (ein flacher Tag), selbst wenn die wahre Vol hoch ist, oder riesig an einem glückstrachtigen Rand-Tag.
  • Realisierte Varianz RVtRV_t aus Intraday-Daten. Viel weniger verrauscht - die Intraday-Stichprobenziehung mittelt das idiosynkratische Einzelrendite-Rauschen heraus - was genau der Grund ist, warum HAR-RV funktioniert und warum Sie RVRV als Ihren Proxy verwenden sollten, wenn Sie überhaupt Intraday-Daten haben.

Die Feinheit, die fast jeden erwischt: Weil der Proxy verrauscht ist, ist die Wahl der Verlustfunktion nicht unschuldig. Ordnen Sie zwei Prognosen mit der falschen Verlustfunktion, und der verrauschte Proxy kann die Rangfolge umdrehen und Ihnen sagen, die schlechtere Prognose sei besser. Patton (2011) arbeitete genau heraus, welche Verlustfunktionen "robust" in dem Sinne sind, dass die Rangordnung von Prognosen nach erwartetem Verlust auf dem verrauschten Proxy dieselbe Rangfolge ergibt, die Sie auf der wahren (unbeobachtbaren) Varianz erhalten würden. Nur eine bestimmte Familie qualifiziert sich. Zwei Mitglieder sind in der Praxis wichtig.

MSE vs QLIKE

Der mittlere quadratische Fehler auf der Varianz:

LMSE(σ2,h)=(σ2h)2L_{\text{MSE}}(\sigma^2, h) = (\sigma^2 - h)^2

wobei h=σ^2h = \hat\sigma^2 die Prognose ist und σ2\sigma^2 durch r2r^2 oder RVRV approximiert wird. MSE ist robust in Pattons Sinne (seine Rangfolge ist Proxy-konsistent), aber er ist symmetrisch und skalenabhängig: Er bestraft eine Überprognose und eine Unterprognose derselben absoluten Größe gleich, und er gewichtet Fehler während hochvolatiler Perioden enorm stärker als Fehler während ruhiger Perioden. Ein Modell, das die ruhigen 95% der Tage trifft, aber an den drei Krisentagen bei den Varianzprognosen explodiert, wird unter MSE furchtbar aussehen, selbst wenn sein Krisenverhalten genau das ist, was Sie eigentlich wollen.

Der QLIKE-Verlust (Quasi-Likelihood) ist das Arbeitspferd:

LQLIKE(σ2,h)=σ2hlogσ2h1L_{\text{QLIKE}}(\sigma^2, h) = \frac{\sigma^2}{h} - \log\frac{\sigma^2}{h} - 1

Es ist der Verlust, der von einer Gauß'schen Likelihood auf der Varianz impliziert wird, es ist ebenfalls robust in Pattons Sinne, und es hat zwei Eigenschaften, die es zur bevorzugten Wahl für Volatilität machen. Erstens ist es asymmetrisch in die richtige Richtung: Es bestraft Unter-Vorhersage der Varianz stärker als Überprognose. Für einen Risikomanager oder einen Vol-Targeter ist das die korrekte Asymmetrie - Unterprognose der Vol bedeutet, dass Sie zu viel Größe übernommen haben, kurz bevor es darauf ankam, was der teure Fehler ist. Zweitens ist es (annähernd) skaleninvariant: Da es vom Verhältnis σ2/h\sigma^2/h abhängt, kostet ein 10%-Prognosefehler ungefähr gleich viel, egal ob er an einem ruhigen Tag oder einem Krisentag passiert, sodass die Bewertung nicht von einer Handvoll hochvarianter Beobachtungen gekapert wird, wie es bei MSE der Fall ist. Diese Robustheit gegenüber der Heteroskedastizität des Proxys ist genau das, was Sie wollen, wenn der ganze Punkt ist, dass die Volatilität wild schwankt.

Beachten Sie LQLIKE0L_{\text{QLIKE}} \ge 0, mit Gleichheit genau dann, wenn h=σ2h = \sigma^2. Niedriger ist besser, genau wie bei MSE.

import numpy as np

def qlike(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
    """Per-observation QLIKE loss. `proxy` is r^2 or RV (a variance proxy),
    `forecast_var` is h = sigma_hat^2. Both strictly positive, same units.
    """
    ratio = proxy / forecast_var
    return ratio - np.log(ratio) - 1.0

def mse_var(proxy: np.ndarray, forecast_var: np.ndarray) -> np.ndarray:
    """Per-observation MSE on the variance scale."""
    return np.square(proxy - forecast_var)

Zwei operative Warnungen. Halten Sie Proxy und Prognose in identischen Einheiten (beide tägliche Varianzen oder beide annualisiert), sonst ist das Verhältnis bedeutungslos. Und lassen Sie forecast_var niemals null erreichen - clippen Sie es auf einen kleinen Boden, denn log0\log 0 wird den ganzen Durchschnitt vergiften.

Mincer-Zarnowitz-Regression

Eine einzelne Verlustzahl sagt Ihnen, welche Prognose besser ist; sie sagt Ihnen nicht, wie eine Prognose falsch ist. Die Mincer-Zarnowitz-Regression (1969) tut das. Regressieren Sie den Proxy auf die Prognose:

rt2  =  a+bσ^t2+ut.r_t^2 \;=\; a + b\,\hat\sigma_t^2 + u_t.

Unter einer optimalen, erwartungstreuen Prognose gilt a=0a = 0 und b=1b = 1: Im Durchschnitt entspricht die realisierte Varianz der Prognose. Abweichungen diagnostizieren die Pathologie:

  • b<1b < 1 mit a>0a > 0: die klassische Signatur einer Prognose, die zu volatil ist - sie überreagiert und sagt Extreme voraus, die sich nicht voll materialisieren. Sehr häufig bei Modellen, die roh von quadrierten Renditen getrieben werden.
  • b>1b > 1: Die Prognose unterreagiert und skaliert zu wenig mit der wahren Varianz.
  • Niedriges Regressions-R2R^2: Selbst wenn a,ba,b im Durchschnitt gut aussehen, verfolgt die Prognose die Varianz von Tag zu Tag schlecht. Weil der Proxy so verrauscht ist, seien Sie nicht beunruhigt, dass das MZ-R2R^2 gegen r2r^2 oft nur 0,05-0,20 beträgt; gegen RVRV wird es viel höher sein. Das R2R^2 gegen r2r^2 ist weit unter 1 begrenzt, egal wie gut die Prognose ist, rein wegen des Proxy-Rauschens.

Ein gemeinsamer FF-Test von H0:(a,b)=(0,1)H_0: (a,b) = (0,1) liefert eine formale Kalibrierungsprüfung. In der Praxis verwenden Sie MZ als Diagnostik, um eine Prognose zu verstehen, und QLIKE, um Prognosen zu ordnen.

Diebold-Mariano: Ist der Unterschied echt?

Angenommen, GARCHs mittlerer QLIKE ist 0,183 und der von EWMA ist 0,191. GARCH "gewinnt". Aber sind 0,008 ein echter Vorsprung oder Stichprobenrauschen? Der Diebold-Mariano-Test (1995) beantwortet genau das. Definieren Sie das Verlust-Differenzial pro Periode

dt=L(proxyt,htA)L(proxyt,htB)d_t = L(\text{proxy}_t, h^A_t) - L(\text{proxy}_t, h^B_t)

für zwei Prognosen AA und BB (hier LL = QLIKE). Die Nullhypothese ist gleiche Prognosegenauigkeit, H0:E[dt]=0H_0: \mathbb{E}[d_t] = 0. Die Statistik ist das mittlere Differenzial, standardisiert durch seinen langfristigen (HAC-)Standardfehler, weil dtd_t seriell korreliert ist:

DM=dˉLRV^(dt)/T  d  N(0,1)\text{DM} = \frac{\bar d}{\sqrt{\widehat{\mathrm{LRV}}(d_t)/T}} \;\xrightarrow{d}\; \mathcal{N}(0,1)

wobei LRV^\widehat{\mathrm{LRV}} eine langfristige Varianzschätzung vom Newey-West-Typ ist. Eine DM-Statistik jenseits von ±1.96\pm 1.96 lehnt gleiche Genauigkeit auf dem 5%-Niveau ab. Entscheidend ist, dass DM ein Test über Prognosen ist, nicht über verschachtelte Modelle, und dass er die serielle Abhängigkeit in der Verlustreihe behandelt, die ein naiver tt-Test auf dtd_t ignorieren würde.

import numpy as np
from scipy import stats

def diebold_mariano(loss_a: np.ndarray, loss_b: np.ndarray, h: int = 1):
    """Diebold-Mariano test of equal predictive accuracy.
    loss_a, loss_b: per-period losses (e.g. QLIKE) for forecasts A and B.
    h: forecast horizon; Newey-West lag = h - 1 (>=0), plus a small-sample buffer.
    Returns (DM_stat, p_value). Negative DM => A has lower loss (A better).
    """
    d = np.asarray(loss_a) - np.asarray(loss_b)
    T = len(d)
    d_bar = d.mean()

    lag = max(h - 1, 0)
    gamma0 = np.mean((d - d_bar) ** 2)
    lrv = gamma0
    for k in range(1, lag + 1):
        w = 1.0 - k / (lag + 1)
        cov = np.mean((d[k:] - d_bar) * (d[:-k] - d_bar))
        lrv += 2.0 * w * cov

    dm = d_bar / np.sqrt(lrv / T)

    adj = np.sqrt((T + 1 - 2 * h + h * (h - 1) / T) / T)
    dm *= adj
    p = 2.0 * (1.0 - stats.t.cdf(abs(dm), df=T - 1))
    return float(dm), float(p)

Das illustrative Ergebnis in diesem Kommentar ist das ehrliche und häufige Resultat, und es ist der ganze Grund, warum dieser Abschnitt existiert: GARCH weist oft einen etwas niedrigeren durchschnittlichen Verlust aus als EWMA, und ebenso oft schafft dieser Vorsprung die DM-Signifikanzhürde nicht. Wenn Sie nur je den mittleren QLIKE berichten, werden Sie sich von Vorsprüngen überzeugen, die ein DM-Test verworfen hätte. Berichten Sie die DM-Statistik. Dies ist dieselbe Disziplin, die wir auf Strategie-Renditen anwenden in ehrliche Bewertung ohne robusten Vorsprung - eine Punktschätzung, die eine Benchmark schlägt, ist kein Vorsprung, bis Sie ausgeschlossen haben, dass es Rauschen ist.

Der Backtest: Eine Walk-Forward-Vol-Targeted-Strategie

Nun kombinieren wir die beiden Hälften - ein Prognosemodell und eine Dimensionierungsregel - zu einer Strategie und bewerten sie auf die einzige Weise, die etwas bedeutet: Walk-Forward, out of sample, mit Kosten.

Die Strategie ist bewusst einfach, denn Einfachheit ist das, was uns erlaubt, das Ergebnis der Vol-Prognose zuzuschreiben statt einem cleveren Signal. Long-only, vol-targeted BTC. Jeden Tag prognostizieren Sie die Volatilität des nächsten Tages, setzen die Position auf wt=min(σtarget/σ^t, wmax)w_t = \min(\sigma_{\text{target}}/\hat\sigma_t,\ w_{\max}), halten über Nacht und wiederholen. Eine Long/Flat-Variante schaltet die Position ab, wenn ein Trendfilter negativ ist; eine Klein-Portfolio-Variante dimensioniert auf der DCC-Kovarianzmatrix aus Teil 3 statt auf der Varianz eines einzelnen Vermögenswerts. Wir beschreiben den Long-only-Fall vollständig und weisen auf die Erweiterungen hin.

Walk-Forward-Mechanik und der No-Look-Ahead-Vertrag

Die einzelne wichtigste Eigenschaft dieses Backtests ist, dass jede zur Dimensionierung der Position an Tag t+1t+1 verwendete Größe allein mit Daten berechenbar ist, die zum Schluss von Tag tt verfügbar sind. Die GARCH-Parameter werden auf einem rollierenden, bei tt endenden Fenster neu geschätzt; die Prognose ist die Ein-Schritt-Vorausprognose σ^t+1\hat\sigma_{t+1} aus dieser Anpassung; die Position wird aus dieser Prognose gesetzt; und die verdiente Rendite ist wt+1rt+1w_{t+1} r_{t+1}, wobei rt+1r_{t+1} die Rendite des nächsten Tages ist, die das Modell nie gesehen hat. GARCH auf der vollen Stichprobe neu anzupassen und dann die Vergangenheit zu "prognostizieren" ist die häufigste Art, wie Leute versehentlich einen großartigen Backtest fabrizieren. Wir behandeln diese Look-Ahead-Falle und die allgemeine Methodik in Walk-Forward-Optimierung.

import numpy as np
import pandas as pd
from arch import arch_model

def walk_forward_voltarget(
    returns: pd.Series,          # daily log returns in decimal (e.g. 0.021)
    proxy_var: pd.Series,        # variance proxy aligned to returns (RV or r^2)
    target_vol_annual: float = 0.20,
    window: int = 750,           # rolling estimation window (days)
    refit_every: int = 5,        # refit GARCH weekly, forecast daily (cost saver)
    w_max: float = 3.0,          # leverage cap
    cost_bps: float = 5.0,       # per-unit-turnover cost in basis points
    ann: int = 365,              # crypto trades 365 days/yr
):
    """Long-only vol-targeted BTC, GARCH(1,1)-t forecasts, strictly walk-forward.
    Returns a DataFrame with position, forecast vol, net returns, and turnover.
    """
    idx = returns.index
    target_daily = target_vol_annual / np.sqrt(ann)

    fcast_vol = pd.Series(index=idx, dtype=float, name="fcast_vol")
    last_res = None

    for i in range(window, len(returns) - 1):
        if (i - window) % refit_every == 0 or last_res is None:
            train = returns.iloc[i - window:i + 1] * 100.0   # scale for the optimizer
            am = arch_model(train, mean="Constant", vol="GARCH",
                            p=1, o=1, q=1, dist="t")           # GJR-t, Part 2
            last_res = am.fit(disp="off")

        f = last_res.forecast(horizon=1, reindex=False)
        var_next = f.variance.values[-1, 0] / (100.0 ** 2)    # unscale
        fcast_vol.iloc[i + 1] = np.sqrt(var_next)

    raw_w = (target_daily / fcast_vol).clip(upper=w_max)
    position = raw_w.shift(0)                                  # w_{i+1} known at close i
    gross_ret = position * returns                            # earned on day i+1

    turnover = position.diff().abs().fillna(0.0)
    cost = turnover * (cost_bps / 1e4)
    net_ret = (gross_ret - cost).dropna()

    out = pd.DataFrame({
        "position": position,
        "fcast_vol": fcast_vol,
        "gross_ret": gross_ret,
        "turnover": turnover,
        "net_ret": net_ret,
    }).dropna()
    return out

def performance_stats(net_ret: pd.Series, ann: int = 365) -> dict:
    """Sharpe, realized vol, max drawdown, CAGR, annual turnover."""
    mu = net_ret.mean() * ann
    sigma = net_ret.std() * np.sqrt(ann)
    sharpe = mu / sigma if sigma > 0 else np.nan
    equity = (1.0 + net_ret).cumprod()
    peak = equity.cummax()
    max_dd = (equity / peak - 1.0).min()
    cagr = equity.iloc[-1] ** (ann / len(net_ret)) - 1.0
    return {
        "sharpe": round(sharpe, 2),
        "realized_vol": round(sigma, 3),
        "max_drawdown": round(max_dd, 3),
        "cagr": round(cagr, 3),
    }

Ein paar Implementierungshinweise, die mehr bedeuten, als sie aussehen:

  • Skalierung für den Optimierer. arch-Anpassungen sind numerisch zufriedener, wenn Renditen in Prozent vorliegen, daher das * 100 und das passende / 100**2 beim Zurückskalieren der Varianz. Vergessen Sie das Zurückskalieren, und Ihre Ziel-Vol ist um den Faktor 10.000 daneben.
  • Refit-Kadenz. Die GARCH-Parameter jeden einzelnen Tag neu zu schätzen ist teuer und fügt fast nichts hinzu - die Parameter sind von Woche zu Woche stabil. Wöchentliches Neuanpassen (refit_every=5) bei täglicher Prognose (die Rekursion aktualisiert σt2\sigma_t^2 aus neuen Renditen auch ohne Neuanpassung) ist der Standardkompromiss. Dies spiegelt den Caching-Rat aus der Copula-Pipeline in Copula-Modelle für gemeinsames Risiko.
  • Der Cap wmaxw_{\max} ist nicht kosmetisch. Wenn die prognostizierte Vol in einem totenstill-ruhigen Regime kollabiert, kann σtarget/σ^t\sigma_{\text{target}}/\hat\sigma_t auf 5x, 10x Leverage explodieren. Ungecapptes Vol Targeting wird Ihnen bereitwillig katastrophalen Leverage kurz vor einem Volatilitätsregimewechsel in die Hand drücken - genau in dem Moment, in dem die Prognose gleich am falschesten sein wird. Cappen Sie es (hier 3x) und erkennen Sie, dass der Cap genau in den ruhigsten, rückblickend gefährlichsten Perioden binden wird.
  • Kosten skalieren mit dem Umschlag, und Vol Targeting ist eine Umschlagmaschine. Jedes Wackeln in der Prognose dimensioniert die Position neu. Bei einem niedrigvolatilen Vermögenswert mit sprunghafter Prognose können Sie das Buch täglich umschichten. Der cost_bps-Term ist kein Rundungsdetail; für ein umschlagintensives Vol-Target kann er einen bedeutenden Bruchteil der Brutto-Sharpe-Verbesserung auffressen.

Wie die Ausgabe aussieht (illustrativ)

Dies auf täglichen BTC-Daten über ein mehrjähriges Fenster laufen zu lassen und die vier Prognosemodelle als Dimensionierungsnenner zu vergleichen, tendiert dazu, eine Tabelle mit folgender Form zu erzeugen. Die Zahlen unten sind illustrativ - handgewählt, um das typische Muster zu zeigen, nicht die Ausgabe eines echten Backtests - aber die Rangfolge und Größenordnungen sind repräsentativ für das, was Praktiker berichten.

Dimensionierungs-Prognose Sharpe Realized Vol Ziel-Vol Max Drawdown Ann. Umschlag
Festes Nominalvolumen (kein Targeting) 0.71 0.68 -0.78 0.1x
Rollierende RV (60d) 0.94 0.24 0.20 -0.41 12x
EWMA (λ=0.94\lambda=0.94) 1.02 0.21 0.20 -0.35 19x
GARCH(1,1)-t 1.05 0.21 0.20 -0.33 22x
HAR-RV (Intraday-Proxy) 1.09 0.20 0.20 -0.31 20x

Zwei Varianten, die es sich zu bauen lohnt

Der Long-only-Fall isoliert die Prognose, aber zwei Erweiterungen sind häufig genug, um sie explizit zu zeigen.

Long/Flat mit einem Trend-Gate. Vol Targeting dimensioniert die Position, nimmt aber keine Richtungssicht ein - es ist immer long. Eine billige, ehrliche Verbesserung ist es, die Position abzuschalten, wenn ein langsamer Trendfilter negativ wird, sodass Sie den vol-targeted Long nur in Aufwärtstrends halten und sonst flach sitzen. Das hält die Dimensionierungslogik identisch und legt einen groben Regimefilter obendrauf; es gibt nicht vor, Einstiege zu timen, nur zu vermeiden, durch offensichtliche Abwärtstrends zu halten.

def apply_trend_gate(position: pd.Series, price: pd.Series, fast: int = 20, slow: int = 100):
    """Zero out the (already vol-targeted) position when the fast SMA is below
    the slow SMA. Both SMAs use only past prices, so no look-ahead is introduced.
    """
    fast_ma = price.rolling(fast).mean().shift(1)   # shift: known at prior close
    slow_ma = price.rolling(slow).mean().shift(1)
    gate = (fast_ma > slow_ma).astype(float)        # 1.0 in uptrend, 0.0 otherwise
    return position * gate.reindex(position.index).fillna(0.0)

Das Trend-Gate senkt den Umschlag auf der Abwärtsseite (Sie hören auf, eine schrumpfende Position in einem Bärenmarkt umzuschichten), fügt aber sein eigenes Regimerisiko hinzu - es wird in choppy Seitwärtsmärkten hin- und hergeschüttelt und hinkt an Wendepunkten hinterher. Ob es hilft, ist eine empirische Frage, die Sie mit derselben Walk-Forward-, DM-getesteten Strenge beantworten müssen wie die Dimensionierungsregel selbst; ein Trendfilter ist genau die Art von Zusatz, der in-sample großartig aussieht und out of sample verdampft.

Portfolio-Vol-Targeting auf der DCC-Kovarianz. Für ein Buch aus mehreren Vermögenswerten wird die skalare Prognose σ^t\hat\sigma_t zur Portfolio-Volatilität wΣtw\sqrt{w^\top \Sigma_t w}, wobei Σt\Sigma_t die zeitvariable Kovarianzmatrix aus dem DCC-GARCH von Teil 3 ist. Sie wählen Basisgewichte w0w_0 (Gleichgewichtung, Marktkapitalisierung oder einen Mean-Variance-Tilt), berechnen die prognostizierte Vol des Portfolios unter Σt\Sigma_t und skalieren den gesamten Gewichtsvektor, um das Portfolio-Ziel zu treffen.

def portfolio_voltarget_weights(base_w, cov_forecast, target_vol_daily, w_gross_max=3.0):
    """Scale a base weight vector so forecast portfolio vol hits the target.
    base_w:        (n,) base allocation (need not sum to 1).
    cov_forecast:  (n, n) one-step-ahead covariance from DCC-GARCH (daily units).
    """
    base_w = np.asarray(base_w, dtype=float)
    port_var = float(base_w @ cov_forecast @ base_w)
    port_vol = np.sqrt(max(port_var, 1e-12))
    scale = min(target_vol_daily / port_vol, w_gross_max / np.abs(base_w).sum())
    return scale * base_w

Dies ist die natürliche Brücke zur Literatur über Portfoliokonstruktion: Die Basisgewichte w0w_0 können aus Markowitz Mean-Variance oder einer risikobasierten Methode wie HRP/CVaR kommen, und Vol Targeting sitzt dann obendrauf als Overlay, das das Gesamtrisiko auf eine Konstante skaliert. Die DCC-Matrix ist wichtig, weil Korrelationen in Crashs hochschnellen (Teil 3) - ein Portfolio, das in ruhigen Märkten diversifiziert aussieht, kann eine viel höhere prognostizierte Vol haben, als eine statische Kovarianz impliziert, genau dann, wenn es darauf ankommt, und das Overlay reduziert das Brutto-Exposure als Reaktion.

Diagnostiken, die Sie immer plotten sollten

Vertrauen Sie niemals der Zusammenfassungstabelle allein. Für jedes Vol-Target plotten Sie drei Dinge und begutachten sie, bevor Sie irgendeiner Sharpe-Zahl glauben. Erstens die realisierte rollierende Vol der Strategie gegen die Ziellinie - sie sollte sich an das Ziel schmiegen; systematische Drift darunter oder darüber bedeutet, dass Ihre Prognose nach unten verzerrt ist (die teure Richtung). Zweitens die Positions-/Leverage-Reihe - achten Sie auf das Binden des Caps und auf Leverage-Spitzen kurz vor Drawdowns, die Signatur einer Prognose, die von einem Regimewechsel überrascht wurde. Drittens den Prognose-vs-Proxy-Scatter (das Mincer-Zarnowitz-Bild) - eine Wolke mit einer Steigung weit von 1 sagt Ihnen, dass die Prognose in einer Weise fehlskaliert ist, die der QLIKE-Durchschnitt verbergen kann. Diese drei Plots fangen mehr Bugs und mehr Selbsttäuschung als jede einzelne Statistik.

Lesen Sie diese Tabelle so, wie Sie jede Backtest-Tabelle lesen sollten: Schauen Sie, was robust und was marginal ist. Die robusten Fakten springen ins Auge. Jede vol-targeted Variante zerschmettert das feste Nominalvolumen beim Sharpe und, noch dramatischer, beim Drawdown und der Realized-Vol-Stabilität - die Strategie mit festem Nominalvolumen läuft bei 68% annualisierter Vol mit einem 78%-Drawdown, was schlicht uninvestierbar ist. Und jede Targeting-Methode liefert eine realisierte Vol nahe dem 20%-Ziel, was das ganze Versprechen des funktionierenden Mechanismus ist. Die marginalen Fakten sind die Unterschiede zwischen den Prognosemodellen: HAR schlägt GARCH schlägt EWMA schlägt rollierende RV, aber die Lücken sind klein - ein Zehntel Sharpe-Punkt - und würden, mit Diebold-Mariano auf den Prognosen oder einem Bootstrap auf den Renditen getestet, häufig die Signifikanz nicht erreichen. Diese kleine, fragile, regimeabhängige Lücke zwischen dem raffinierten und dem naiven Prognosemodell ist die ehrliche Schlagzeile dieser ganzen Serie.

Ehrlich sein darüber, was Ihnen das bringt

Dieser Blog hat eine ganze Sammlung über Backtesting, ohne sich selbst zu täuschen, also lassen Sie uns sie auf unser eigenes Ergebnis anwenden, statt still zu hoffen, dass Sie es nicht tun.

Volatility Targeting verbessert die risikoadjustierte Rendite und die Drawdowns. Es erzeugt kein Alpha aus dem Nichts. Schauen Sie noch einmal auf die Tabelle. Die Sharpe-Verbesserung durch Targeting ist echt und lohnenswert - aber zerlegen Sie sie, und das meiste davon kommt daher, keine konstante Position in hochvolatile Regime zu halten, was mechanisch die schlimmsten Drawdowns vermeidet und den Aufzinsungspfad stabilisiert. Die Strategie ist immer noch long BTC; sie hat keine Sicht, die der Markt ihr nicht in die Hand gibt. Wenn BTC über Ihre Stichprobe einen negativen Sharpe hat, wird Vol Targeting Ihnen einen weniger schlechten negativen Sharpe in die Hand geben, nicht einen positiven. Es formt die Renditeverteilung um - dünnere Ränder, stetigere Vol, bessere geometrische Aufzinsung - aber der rohe Richtungsvorsprung ist, was auch immer der zugrunde liegende Long ist. Lassen Sie sich von einer schönen Equity-Kurve nicht dazu verleiten zu glauben, Sie hätten Alpha gefunden, wenn Sie Risikomanagement gefunden haben. Moreira-Muir fanden echtes Alpha in Aktienfaktoren aus Vol-Management, aber dieses Ergebnis handelt vom zeitvariablen Risiko-Rendite-Tradeoff des Faktors, und es überträgt sich nicht automatisch auf einen einzelnen Krypto-Vermögenswert über eine andere Stichprobe.

Der Vorsprung von GARCH gegenüber EWMA in der Prognosequalität ist oft klein und regimeabhängig. Dies ist die unbequeme Auszahlung der Teile 1-3. Sie haben zunehmend raffinierte Modelle gebaut - Leverage-Terme, Student-t-Ränder, dynamische Korrelationen - und der marginale Beitrag jedes einzelnen zu einem Vol-Targeting-P&L, gegenüber einem naiven EWMA, liegt häufig innerhalb des Rauschbandes. GARCHs Vorteil (Mean Reversion nach Schocks) zeigt sich hauptsächlich in spezifischen Regimen: scharfen Spitzen, die sich dann normalisieren. In zähen Trends oder persistenten hochvolatilen Regimen unterscheidet es sich kaum von EWMA. Das macht GARCH nicht nutzlos - die Mean-Reversion-Struktur, die interpretierbaren Parameter, die Fähigkeit, Vorwärtspfade zu simulieren und Optionen gegen die Prognose zu bepreisen, haben alle einen Wert, den EWMA nicht hat - aber wenn Ihre einzige Nutzung Dimensionierung ist, führen Sie den DM-Test durch, bevor Sie die Komplexitätskosten bezahlen, und wissen Sie, dass Regimeerkennung Ihnen dasselbe aus einem anderen Blickwinkel sagt: Das gewinnende Modell hängt vom Regime ab.

Der Backtest-Sharpe ist eine obere Schranke für den Live-Sharpe, und Vol Targeting vergrößert die Lücke. Weil die Strategie umschlagintensiv und leverage-skaliert ist, ist sie ungewöhnlich empfindlich gegenüber den Reibungen, die ein naiver Backtest auslässt: Ihre Fills sind schlechter als der Schluss, auf dem Sie dimensioniert haben, Fundingkosten auf gehebelten Perp-Positionen fallen kontinuierlich an, und der Leverage-Cap interagiert mit Margin- und Liquidationsmechaniken, die ein einfaches w * return ignoriert. Jede einzelne davon macht Live schlechter als Backtest. Wir behandeln diese Lücke systematisch in Backtest-Live-Parität; für Vol Targeting speziell budgetieren Sie dafür, indem Sie konservative Kosten, einen realistischen (niedrigen) Leverage-Cap verwenden und auf der Eröffnung des nächsten Bars ausführen statt auf dem Schluss, aus dem Sie das Signal berechnet haben.

Eine Nebenbemerkung zur Volatilitätsrisikoprämie. Alles oben prognostiziert realisierte Volatilität. Es gibt ein paralleles, handelbares Objekt: implizite Volatilität, in Optionen eingepreist, die im Durchschnitt über der nachfolgenden realisierten Vol liegt - die Volatilitätsrisikoprämie, die Kompensation für das Tragen des Risikos einer Vol-Spitze. Diese Lücke ist selbst eine Renditequelle (der Verkauf von Varianz erntet sie, der Kauf hedged Tail-Risiko), und sie ist ein wirklich anderes Spiel als Vol Targeting: Sie ist eine Wette auf den Preis der Volatilität statt eine Nutzung einer Prognose der Volatilität. Wir verfolgen sie hier nicht, aber die Maschinerie beginnt mit dem Preismodell in Black-Scholes-Optionspreisbewertung, und eine gute Realized-Vol-Prognose (Teile 1-2) ist genau der Input, den Sie brauchen, um zu beurteilen, ob die implizite Vol teuer oder billig ist. Ihre GARCH-Prognose mit der implizierten Vol des Optionsmarktes zu vergleichen, ist eine der ehrlicheren Nutzungen von allem, was Sie in dieser Serie gebaut haben.

Praktische Überlegungen

Ein Sammelsurium von Dingen, die ein funktionierendes Vol-Target von einem fragilen unterscheiden.

  • Schätzen Sie auf dem richtigen Horizont. Wenn Sie eine für einen Tag gehaltene Position dimensionieren, prognostizieren Sie die Ein-Tages-Vol. Wenn Sie wöchentlich rebalancieren, prognostizieren (und zielen) Sie die wöchentliche Vol, oder aggregieren Sie die tägliche GARCH-Prognose über den Horizont - die Mehrschritt-GARCH-Prognose kehrt zu σˉ2\bar\sigma^2 zurück, was die naive "hta¨glich\sqrt{h}\cdot\text{täglich}"-Skalierung ignoriert. Teil 1 behandelt die Mehrschritt-GARCH-Prognose.
  • Annualisierung in 24/7-Märkten. Krypto handelt 365 Tage im Jahr ohne Wochenenden oder Feiertage, also annualisieren Sie die tägliche Vol mit 365\sqrt{365}, nicht mit dem 252\sqrt{252} aus Aktien. Wenn man das falsch macht, wird das Ziel still um ~20% fehlskaliert.
  • Der Nenner kann eine Kovarianzmatrix sein. Für ein Multi-Asset-Buch ersetzen Sie die skalare σ^t\hat\sigma_t durch die Portfolio-Vol wΣtw\sqrt{w^\top \Sigma_t w} aus dem DCC-GARCH von Teil 3 und skalieren Sie den gesamten Gewichtsvektor, um die Portfolio-Ziel-Vol zu treffen. Dies verbindet Vol Targeting mit Mean-Variance-Dimensionierung (Markowitz für Krypto) und risikobasierter Allokation (HRP- und CVaR-Pipelines) - Vol Targeting ist der Einzel-Asset-Spezialfall des Skalierens auf ein Portfolio-Risikobudget.
  • Vol Targeting ist auf subtile Weise prozyklisch. Wenn alle dieselbe 1/σ1/\sigma-Regel fahren, erzwingt eine Vol-Spitze ein synchronisiertes Deleveraging, das die Preise nach unten drückt, was die realisierte Vol erhöht, was mehr Deleveraging erzwingt. Diese Rückkopplung (gut dokumentiert im "Volmageddon" von 2018 und diversen Krypto-Deleveraging-Kaskaden) bedeutet, dass die Regel genau dann weniger gut funktioniert, wenn viele Akteure sie nutzen. Das ist kein Grund, sie aufzugeben, aber es ist ein Grund, den Leverage zu cappen und nicht anzunehmen, dass Ihre Fills während einer Vol-Spitze den Fills in ruhigen Märkten ähneln werden.
  • Floor und Clip für die Prognose. Eine Prognose-Vol von null oder nahe null erzeugt unendlichen Leverage. Legen Sie immer einen Boden für σ^t\hat\sigma_t auf einem vernünftigen Minimum fest und cappen Sie die Position, und loggen Sie, wie oft jedes bindet - wenn der Cap die meiste Zeit bindet, ist Ihr Ziel zu aggressiv für den Vermögenswert.

Zusammenfassung

  • Eine Volatilitätsprognose hat keinen Wert, bis sie eine Entscheidung ändert. Volatility Targeting - das Dimensionieren des Exposure als wt=σtarget/σ^tw_t = \sigma_{\text{target}}/\hat\sigma_t (gecappt) - ist der sauberste Test des Werts einer Prognose, weil die Prognosequalität direkt auf ein flacheres Realized-Vol-Profil und einen höheren Sharpe abbildet.
  • Vol Targeting erhöht die risikoadjustierte Rendite und kontrolliert insbesondere Drawdowns, weil Volatilität prognostizierbar ist (sie clustert), während die Richtung es nicht ist, und weil Sharpe Ratios in hochvolatilen Regimen fallen, die die Regel automatisch untergewichtet. Es ist Kelly-Dimensionierung unter der Annahme, dass die erwartete Rendite mit der Volatilität skaliert.
  • Vergleichen Sie GARCH ehrlich gegen starke Baselines: rollierende Realized Vol, EWMA/RiskMetrics (λ=0.94\lambda=0.94, ein IGARCH mit null freien Parametern) und HAR-RV auf einem Intraday-Realized-Variance-Proxy. EWMA und HAR sind schwer zu schlagen.
  • Sie können die wahre Volatilität nicht beobachten, also bewerten Sie gegen einen Proxy (r2r^2 oder, weit besser, RVRV) mit Verlustfunktionen, die robust gegen Proxy-Rauschen sind. Bevorzugen Sie QLIKE gegenüber MSE: Es bestraft Unterprognose stärker (den teuren Fehler) und ist skaleninvariant, sodass es nicht von ein paar hochvolatilen Tagen gekapert wird. Verwenden Sie Mincer-Zarnowitz, um Verzerrung zu diagnostizieren, und den Diebold-Mariano-Test, um zu entscheiden, ob der Vorsprung einer Prognose echt oder Rauschen ist.
  • In einem Walk-Forward-, kostenbewussten Backtest schlägt Vol Targeting zuverlässig das feste Nominalvolumen beim Sharpe und Drawdown, und die vier Prognosemodelle liegen dicht beieinander - der Vorsprung von GARCH gegenüber EWMA ist klein, regimeabhängig und oft nicht statistisch signifikant. Berichten Sie den DM-Test, nicht nur den mittleren Verlust.
  • Seien Sie ehrlich: Vol Targeting ist Risikomanagement, nicht Alpha. Es formt die Renditeverteilung der Richtungswette um, die Sie ohnehin schon hatten; es erzeugt keinen Vorsprung aus dem Nichts. Und es ist umschlagintensiv und leverage-skaliert, sodass Live-Ergebnisse dem Backtest stärker hinterherhinken als üblich.

Referenzen:

  • Patton, A. J. (2011). Volatility forecast comparison using imperfect volatility proxies. Journal of Econometrics, 160(1), 246-256. DOI
  • Corsi, F. (2009). A simple approximate long-memory model of realized volatility. Journal of Financial Econometrics, 7(2), 174-196. DOI
  • Diebold, F. X., & Mariano, R. S. (1995). Comparing predictive accuracy. Journal of Business & Economic Statistics, 13(3), 253-263. DOI
  • Mincer, J., & Zarnowitz, V. (1969). The evaluation of economic forecasts. In Economic Forecasts and Expectations, NBER.
  • Moreira, A., & Muir, T. (2017). Volatility-managed portfolios. Journal of Finance, 72(4), 1611-1644. DOI
  • J.P. Morgan / Reuters (1996). RiskMetrics Technical Document, 4th ed.
  • Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307-327. 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
  • Harvey, D., Leybourne, S., & Newbold, P. (1997). Testing the equality of prediction mean squared errors. International Journal of Forecasting, 13(2), 281-291. DOI
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.