σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 7 · Alpha-Forschung und Risiko›Thema 7.5·~50 Min.Fortgeschritten

Parametrischer VaR

Position in der SkillModul 7 von 11 · Thema 5 von 9
7.5 Parametrischer VaR
—Lab-Punkte— / 100XP gesamt—Serie—

Eine Formel statt einer Historie

Der historische VaR liest den Verlust aus vergangenen Renditen ab. Der parametrische VaR nimmt eine Normalverteilung der Renditen an und braucht nur zwei Zahlen, Mittelwert und Standardabweichung. Der mit Wahrscheinlichkeit 1 - confidence überschrittene Verlust ist dann z * sigma - mu, mit dem Standardnormal-Quantil z (1,645 bei 95 %, 2,326 bei 99 %). Er ist schnell, glatt und lässt sich leicht auf ein ganzes Portfolio ausdehnen, weshalb er jahrzehntelang Industriestandard war.

from statistics import NormalDist

def normal_var(mu, sigma, confidence):
    z = NormalDist().inv_cdf(confidence)
    return z * sigma - mu

print(round(NormalDist().inv_cdf(0.95), 4), round(NormalDist().inv_cdf(0.99), 4))
print(round(normal_var(0.0005, 0.012, 0.95), 5))        # a 95% one-day loss limit
print(round(normal_var(0.0005, 0.012, 0.99), 5))        # a higher confidence, a larger limit
# The multiplier z for common confidence levels
from statistics import NormalDist

for confidence in (0.90, 0.95, 0.975, 0.99, 0.999):
    print(confidence, round(NormalDist().inv_cdf(confidence), 3))       # 1.282, 1.645, 1.96, 2.326, 3.09

Vom Einzelwert zum Portfolio und auf zehn Tage

Für ein Portfolio ist der Mittelwert weights @ mu und die Standardabweichung sqrt(weights @ cov @ weights), die Größen aus dem Thema Portfoliovarianz. Diversifikation zeigt sich direkt: niedrige Korrelationen senken Standardabweichung und VaR. Für einen längeren Horizont wächst der Mittelwert mit der Tageszahl und die Standardabweichung mit ihrer Wurzel, ein 10-Tages-VaR ist also z * sigma * sqrt(10) - mu * 10.

import numpy as np
from statistics import NormalDist

def normal_var(mu, sigma, confidence):
    return NormalDist().inv_cdf(confidence) * sigma - mu

weights = np.array([0.6, 0.4])
mu = np.array([0.0005, 0.0003])
cov = np.array([[0.00016, 0.00004], [0.00004, 0.00009]])             # volatilities 1.26% and 0.95%, correlation 0.33

mean, std = float(weights @ mu), float(np.sqrt(weights @ cov @ weights))
print(round(mean, 5), round(std, 5))
print(round(normal_var(mean, std, 0.99), 5))
print(round(normal_var(mean * 10, std * np.sqrt(10), 0.99), 5))      # the 10-day figure

Wo die Normalverteilungsannahme versagt

Echte Renditen haben Fat Tails: Extremtage sind viel häufiger, als eine Normalverteilung erlaubt. Der parametrische VaR wirkt dann zu klein, am meisten bei hohem Konfidenzniveau. Der Vergleich mit dem historischen VaR auf denselben Daten zeigt die Lücke: positiv heißt, das Normalmodell unterschätzt das Risiko. Bei 95 % liegen beide oft nah beieinander, bei 99 % können sie stark abweichen.

# Fat-tailed returns: the normal model understates the 99% loss
import numpy as np
from statistics import NormalDist

rng = np.random.default_rng(2)
returns = rng.standard_t(3, size=5000) * 0.008           # a fat-tailed distribution (3 degrees of freedom)

for confidence in (0.95, 0.99):
    historical = -np.quantile(returns, 1 - confidence)
    parametric = NormalDist().inv_cdf(confidence) * returns.std(ddof=1) - returns.mean()
    print(confidence, round(float(historical), 5), round(float(parametric), 5), round(float(historical - parametric), 5))
Die Methode nach der Frage wählenDer parametrische VaR eignet sich für eine schnelle, glatte Zahl und für Portfolios linearer Positionen. Für Optionen, deren Renditen nicht linear in den Risikofaktoren sind, und für die Ränder ist er ein schlechter Ratgeber. Viele Desks berechnen mehrere VaRs, parametrisch, historisch und Monte Carlo, und werten starke Abweichungen als Warnung vor dem Modell.
  • Parametrischer VaR = z * sigma - mu mit z = NormalDist().inv_cdf(confidence): nur Mittelwert und Standardabweichung sind nötig.
  • Ein Portfolio nutzt weights @ mu und sqrt(weights @ cov @ weights); ein Horizont skaliert den Mittelwert mit days und die Volatilität mit sqrt(days).
  • Echte Renditen haben Fat Tails: Vergleichen Sie mit dem historischen VaR; eine positive Lücke heißt, das Normalmodell unterschätzt das Risiko.

Als Nächstes: Expected Shortfall, der durchschnittliche Verlust an den Tagen, an denen der VaR überschritten wird.

Lab: Was bewertet wird

  • Mit normal_var aus zwei Zahlen ein Limit machen25 Pkt.
  • Mit portfolio_normal_var ein ganzes Portfolio abdecken25 Pkt.
  • Mit horizon_var weiter vorausschauen25 Pkt.
  • Mit normality_gap die Fat Tails messen25 Pkt.
Explorer · lab-97-1
▾ lab-97-1
…
bash · im Browser
learner@quantcraft:~/lab-97-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-97-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub