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 yearSchneller 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 estimateDie 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- 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_volatilitydie Jahresvolatilität messen25 Pkt. - Mit
ewma_volatilityjüngere Schocks stärker gewichten25 Pkt. - Mit
parkinson_volatilitydie Tagesspanne nutzen25 Pkt. - Mit
volatility_target_leverageeine Position an ein Risikobudget anpassen25 Pkt.