Jenseits von Mittelwert und Varianz
Zwei Renditereihen können denselben Mittelwert und dieselbe Volatilität haben und doch sehr unterschiedlich zu halten sein. Die eine steigt langsam und fällt hin und wieder an einem Tag um 6 %; die andere ist symmetrisch und ruhig. Mittelwert und Varianz sind die ersten beiden Momente einer Verteilung. Das zentrale Moment k-ter Ordnung ist der Durchschnitt von (x - mean) ** k. Die Momente 3 und 4 beschreiben die Form: Die Schiefe sagt, welcher Rand länger ist, die Kurtosis, wie schwer die Ränder sind.
import numpy as np
def central_moment(x, k):
return float(np.mean((x - x.mean()) ** k))
# Calm days of about +1%, and one crash of -6%
returns = np.array([0.010, 0.012, 0.008, 0.011, 0.009, 0.010, 0.012, -0.060, 0.010, 0.009])
print(round(central_moment(returns, 2), 8)) # 0.00044389 the variance with ddof=0
print(round(central_moment(returns, 3), 10)) # -2.47823e-05 odd powers keep the sign: the crash dominates
print(round(central_moment(returns, 4), 12)) # 1.587946e-06 even powers are always positiveSchiefe: welcher Rand ist länger
Das Kubieren behält das Vorzeichen jeder Abweichung und lässt große viel stärker zählen, daher wird das dritte Moment von den extremsten Werten dominiert. Die Division durch m2 ** 1.5 entfernt die Einheiten und liefert die Schiefe: 0 bei einer symmetrischen Verteilung, negativ, wenn der lange Rand links liegt (seltene große Verluste), positiv, wenn er rechts liegt (seltene große Gewinne). Aktienindizes haben meist negative Schiefe: langsame Anstiege, plötzliche Einbrüche. Die Schiefe einer Stichprobe von 100.000 Normalwerten liegt bei etwa 0.
m2 = central_moment(returns, 2)
m3 = central_moment(returns, 3)
print(round(m3 / m2 ** 1.5, 3)) # -2.65 strongly negative: one big loss among calm gains
mirror = -returns # flip every return: the long tail moves to the right
print(round(central_moment(mirror, 3) / central_moment(mirror, 2) ** 1.5, 3)) # 2.65Kurtosis: wie schwer sind die Ränder
Die vierte Potenz lässt Extremwerte enorm zählen, daher wächst m4 / m2 ** 2 mit den Rändern. Bei einer Normalverteilung ist es 3, weshalb man die Exzess-Kurtosis m4 / m2 ** 2 - 3 angibt: Sie ist 0 für die Normalverteilung, positiv bei schweren Rändern (Extremtage treten häufiger auf, als die Glocke vorhersagt) und negativ bei dünnen Rändern (das Dünnste überhaupt, zwei gleiche Spitzen, ergibt -2). Tägliche Renditen der meisten Anlagen haben eine klar positive Exzess-Kurtosis, oft 5 oder mehr. Beide Kennzahlen ändern sich nicht, wenn man die Renditen skaliert oder verschiebt, sie beschreiben also nur die Form.
m4 = central_moment(returns, 4)
print(round(m4 / m2 ** 2 - 3, 3)) # 5.059 fat tails: one crash dominates the fourth moment
calm = np.array([-0.02, -0.01, -0.005, 0.0, 0.005, 0.01, 0.02, -0.015, 0.015, 0.0])
c2, c3, c4 = (central_moment(calm, k) for k in (2, 3, 4))
print(round(c3 / c2 ** 1.5, 3), round(c4 / c2 ** 2 - 3, 3)) # 0.0 -1.033 symmetric, slightly thin tails# Shape does not depend on scale or shift: multiply the returns by 3 and add 1
rescaled = returns * 3 + 1
print(round(central_moment(rescaled, 3) / central_moment(rescaled, 2) ** 1.5, 3)) # -2.65
print(round(central_moment(rescaled, 4) / central_moment(rescaled, 2) ** 2 - 3, 3)) # 5.059 the same two numbers- Das zentrale Moment k-ter Ordnung ist
mean((x - mean) ** k): Die Momente 2, 3 und 4 ergeben Varianz, Schiefe und Kurtosis. - Schiefe
m3 / m2 ** 1.5: negativ = langer linker Rand (seltene große Verluste); Exzess-Kurtosism4 / m2 ** 2 - 3ist 0 bei einer Normalverteilung. - Positive Exzess-Kurtosis bedeutet schwere Ränder; beide Kennzahlen hängen von wenigen Extremtagen ab und brauchen viele Daten.
Als Nächstes: schwere Ränder und Normalitätstests, um formal zu prüfen, ob Renditen der Glockenkurve folgen.
Lab: Was bewertet wird
- Mit
central_momentden Baustein berechnen25 Pkt. - Mit
skewnessmessen, welcher Rand länger ist25 Pkt. - Mit
excess_kurtosismessen, wie schwer die Ränder sind25 Pkt. - Mit
shape_labeldie Form benennen25 Pkt.