σμ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 3 · Wahrscheinlichkeit & Monte-Carlo-Simulation›Thema 3.6·~45 Min.Mittelstufe

Volatilität

Position in der SkillModul 3 von 11 · Thema 6 von 12
3.6 Volatilität
—Lab-Punkte— / 100XP gesamt—Serie—

Risiko in einer Zahl

Volatilität ist die Standardabweichung der Renditen, pro Jahr angegeben, damit sich Werte vergleichen lassen: etwa 15 bis 20 % bei einem Aktienindex, 30 bis 60 % bei einer Einzelaktie, nahe 0 bei Bargeld. Sie bestimmt Positionsgrößen, bepreist Optionen und setzt Risikolimits. Die einfachste Schätzung ist die realisierte Volatilität über ein Fenster: die Stichproben-Standardabweichung der Renditen mal sqrt(Perioden pro Jahr). Sie behandelt jeden Tag im Fenster gleich, was zugleich ihre Stärke (stabil) und ihre Schwäche (träge) ist.

import math
import numpy as np

# Eight quiet days, one -3% shock, three more days
returns = np.array([0.004, -0.002, 0.001, 0.003, -0.004, 0.002, 0.006, -0.001, -0.030, 0.004, 0.002, -0.003])

print(round(returns[:8].std(ddof=1) * math.sqrt(252), 4))    # 0.0526   before the shock: 5.3% a year
print(round(returns.std(ddof=1) * math.sqrt(252), 4))        # 0.1505   with the shock: 15.1% a year

Schneller reagieren: EWMA

Volatilität bildet Cluster: Ruhige und stürmische Phasen dauern jeweils eine Weile, daher sagt der Schock von gestern mehr über morgen als ein ruhiger Tag vor einem Monat. Der exponentiell gewichtete gleitende Durchschnitt (EWMA, durch RiskMetrics bekannt) aktualisiert die Varianz täglich: Varianz_t = lam * Varianz_(t-1) + (1 - lam) * Rendite_t². Bei lam = 0,94 trägt die neueste Rendite 6 % des Gewichts, alte verblassen geometrisch. Die Schätzung springt bei einem Schock und klingt allmählich ab, statt hoch zu bleiben, bis der Schock das Fenster verlässt, und dann auf einmal abzufallen.

lam = 0.94
variance = np.empty(len(returns))
variance[0] = returns[0] ** 2
for t in range(1, len(returns)):
    variance[t] = lam * variance[t - 1] + (1 - lam) * returns[t] ** 2    # the recursion needs the previous value

ewma = np.sqrt(variance)
print(ewma.round(5).tolist())
# [0.004, 0.00391, 0.0038, 0.00375, 0.00377, 0.00369, 0.00387, 0.00376, 0.0082, 0.00801, 0.00778, 0.00758]
#                                                                       ^ the shock doubles the estimate, then it fades
print(round(ewma[-1] * math.sqrt(252), 4))     # 0.1204   today's annualised estimate

Die Spanne nutzen und eine Volatilität anpeilen

Schlusskurse ignorieren, was tagsüber geschah. Tageshoch und -tief tragen mehr Information: Der Parkinson-Schätzer sqrt(mean(ln(high/low)²) / (4 ln 2)) ist um ein Mehrfaches effizienter als die Schluss-zu-Schluss-Schätzung, erreicht also dieselbe Genauigkeit mit weit weniger Tagen (er setzt keine großen Lücken zwischen den Tagen voraus). Eine praktische Anwendung jeder Volatilitätsschätzung ist das Volatilitäts-Targeting: Wollen Sie 10 % Risiko und die realisierte Volatilität beträgt 15 %, halten Sie 10 / 15 = 0,67 der Position. Der Hebel schrumpft im Sturm und wächst in der Ruhe.

high = np.array([101.5, 102.0, 103.2, 102.8, 104.0])
low = np.array([99.8, 100.9, 101.7, 101.1, 102.4])
parkinson = math.sqrt(np.mean(np.log(high / low) ** 2) / (4 * math.log(2)))
print(round(parkinson, 5))                      # 0.00905   per-day volatility from the daily ranges

target = 0.10
realized = returns.std(ddof=1) * math.sqrt(252)
print(round(target / realized, 3))              # 0.664   hold two thirds of the position to run at 10% risk
# Close-to-close versus range: the same five days
close = np.array([100.0, 101.2, 102.5, 101.9, 103.4])
print(round(float(np.diff(np.log(close)).std(ddof=1)), 5))     # 0.00955   from the closes only
print(round(parkinson, 5))                                      # 0.00905   from the high-low ranges of the same days
Volatilität ist keine Richtung, und sie bewegt sichVolatilität behandelt einen Tag mit +3 % und einen mit -3 % gleich, doch Anleger fürchten nur den zweiten. Sie ist auch nicht konstant: Jede Schätzung hängt von Fenster oder Abklingen ab, und 252 Handelstage sind eine Konvention. Nennen Sie bei jeder Volatilitätsangabe Schätzer, Fenster und Annualisierung.
  • Realisierte Volatilität: Stichproben-Standardabweichung mal sqrt(Perioden pro Jahr); stabil, aber träge.
  • EWMA: Varianz_t = lam * Varianz_(t-1) + (1 - lam) * Rendite_t²; jüngere Schocks wiegen mehr und verblassen geometrisch.
  • Parkinson nutzt die Tages-Hoch/Tief-Spanne; Volatilitäts-Targeting skaliert die Position mit Ziel / realisiert.

Als Nächstes: die Sharpe Ratio, der Ertrag je Risikoeinheit, und wie weit man ihr trauen kann.

Lab: Was bewertet wird

  • Mit realized_volatility die Jahresvolatilität messen25 Pkt.
  • Mit ewma_volatility jüngere Schocks stärker gewichten25 Pkt.
  • Mit parkinson_volatility die Tagesspanne nutzen25 Pkt.
  • Mit volatility_target_leverage eine Position an ein Risikobudget anpassen25 Pkt.
Explorer · lab-59-1
▾ lab-59-1
…
bash · im Browser
learner@quantcraft:~/lab-59-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-59-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