Zwei Zahlen für eine Verteilung
Eine Spalte von Renditen lässt sich schwer mit einer anderen vergleichen. Zwei Zahlen fassen das meiste zusammen: Der Mittelwert sagt, wo die Renditen zentriert sind, die Varianz, wie breit sie um dieses Zentrum streuen. Bei n Renditen ist der Mittelwert sum(x) / n; die Abweichungen x - mean summieren sich immer zu null, daher werden sie zum Messen der Streuung zuerst quadriert. Die Stichprobenvarianz ist die Summe der quadrierten Abweichungen geteilt durch n - 1, nicht n: Der Mittelwert wurde aus denselben Daten geschätzt, was die Abweichungen etwas zu klein macht, und die Division durch n - 1 korrigiert das.
import numpy as np
returns = np.array([0.004, -0.002, 0.001, 0.003, -0.004, 0.002, 0.006, -0.001])
mean = returns.mean()
deviations = returns - mean
print(round(mean, 5)) # 0.00113
print(abs(deviations.sum()) < 1e-12) # True the deviations always add up to zero
variance = (deviations ** 2).sum() / (len(returns) - 1)
print(round(variance, 8), round(returns.var(ddof=1), 8)) # 1.098e-05 1.098e-05 the same as numpy's var(ddof=1)Standardabweichung und Volatilität
Das Quadrieren hat die Einheiten verändert: Eine Renditevarianz liegt in „Prozent zum Quadrat“. Ihre Quadratwurzel, die Standardabweichung, ist wieder in der Einheit der Renditen und heißt in der Finanzwelt Volatilität. Sie ist das gebräuchlichste Risikomaß. Ein typischer Tag eines Großwerts bewegt sich um etwa 1 bis 2 %, also eine Volatilität von 0,01 bis 0,02 pro Tag. Sie wird relativ zum Mittelwert gelesen: Bei einer Volatilität von 1,2 % pro Tag liegt ein Tag mit -3,6 % drei Standardabweichungen entfernt.
std = np.sqrt(variance)
print(round(std, 6), round(returns.std(ddof=1), 6)) # 0.003314 0.003314 daily volatility of these returns
# How many standard deviations is the worst day from the mean?
print(round((returns.min() - mean) / std, 2)) # -1.55Annualisieren und die Sharpe Ratio
Tageszahlen sind klein und wenig aussagekräftig, daher gibt man sie pro Jahr an. Der Mittelwert wächst linear mit der Zeit (252 Handelstage im Jahr: mit 252 multiplizieren), die Volatilität aber mit der Quadratwurzel der Zeit: mit sqrt(252) multiplizieren, etwa 15,9. Der Grund: Zufällige Tagesbewegungen heben sich teilweise auf, die Unsicherheit wächst daher langsamer als der Mittelwert. Die Sharpe Ratio teilt die durchschnittliche Rendite über dem risikofreien Zins (die Überschussrendite) durch die Volatilität: Ertrag je Risikoeinheit, auf dieselbe Weise annualisiert. So lässt sich eine ruhige Strategie mit einer wilden vergleichen.
periods = 252
print(round(mean * periods, 4)) # 0.2835 annual mean: 28.35% (a made-up, very lucky sample)
print(round(std * np.sqrt(periods), 4)) # 0.0526 annual volatility: 5.26%
risk_free = 0.0001 # risk-free return of one day
excess = returns - risk_free
sharpe = excess.mean() / np.sqrt(((excess - excess.mean()) ** 2).sum() / (len(excess) - 1)) * np.sqrt(periods)
print(round(sharpe, 3)) # 4.91 absurdly good, because 8 lucky days prove nothing# How precisely do 8 days pin down the mean? The standard error is std / sqrt(n)
standard_error = std / np.sqrt(len(returns))
print(round(float(standard_error), 6)) # 0.001172 larger than the mean itself (0.00113)std / sqrt(n), hier 0,0012, mehr als der Mittelwert selbst (0,0011). Eine großartige Sharpe Ratio über wenige Wochen sagt wenig; je mehr Beobachtungen, desto mehr kann man einem Mittelwert trauen, und Risikokennzahlen sind weit stabiler als Durchschnittsrenditen.- Mittelwert:
x.mean(); Stichprobenvarianz:((x - mean) ** 2).sum() / (n - 1); die Volatilität ist ihre Quadratwurzel. - Annualisieren Sie den Mittelwert mit
* periodsund die Volatilität mit* sqrt(periods): Das Risiko wächst mit der Quadratwurzel der Zeit. - Sharpe = mittlere Überschussrendite / ihre Standardabweichung *
sqrt(periods): Ertrag je Risikoeinheit; kurze Stichproben machen sie unzuverlässig.
Als Nächstes: Schiefe und Kurtosis, die beiden Kennzahlen, die die Form der Verteilung jenseits von Zentrum und Streuung beschreiben.
Lab: Was bewertet wird
- Mit
sample_variancedie Streuung der Renditen messen25 Pkt. - Mit
sample_stddie Streuung in der Einheit der Renditen ausdrücken25 Pkt. - Mit
annualized_statsMittelwert und Volatilität annualisieren25 Pkt. - Mit
sharpe_ratiodie Rendite je Risikoeinheit bewerten25 Pkt.