Au-delà de la moyenne et de la variance
Deux séries de rendements peuvent avoir la même moyenne et la même volatilité tout en étant très différentes à détenir. L'une monte lentement et chute de temps en temps de 6 % en une journée ; l'autre est symétrique et calme. La moyenne et la variance sont les deux premiers moments d'une distribution. Le moment centré d'ordre k est la moyenne de (x - mean) ** k. Les moments 3 et 4 décrivent la forme : l'asymétrie dit quelle queue est la plus longue, l'aplatissement (kurtosis) à quel point les queues sont épaisses.
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 positiveAsymétrie : quelle queue est la plus longue
Élever au cube conserve le signe de chaque écart et fait peser beaucoup plus les grands, si bien que le troisième moment est dominé par les valeurs les plus extrêmes. Diviser par m2 ** 1.5 supprime les unités et donne l'asymétrie : 0 pour une distribution symétrique, négative quand la longue queue est à gauche (rares grosses pertes), positive quand elle est à droite (rares gros gains). Les indices actions ont en général une asymétrie négative : hausses lentes, baisses soudaines. L'asymétrie d'un échantillon de 100 000 valeurs normales est d'environ 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.65Aplatissement : l'épaisseur des queues
La puissance quatre fait peser énormément les valeurs extrêmes, donc m4 / m2 ** 2 croît avec les queues. Pour une loi normale il vaut 3, c'est pourquoi on cite l'aplatissement en excès, m4 / m2 ** 2 - 3 : il vaut 0 pour une loi normale, il est positif pour des queues épaisses (les journées extrêmes surviennent plus souvent que ne le prévoit la cloche) et négatif pour des queues fines (le plus fin possible, deux pics égaux, donne -2). Les rendements quotidiens de la plupart des actifs ont un excès d'aplatissement nettement positif, souvent 5 ou plus. Les deux statistiques ne changent pas quand on met les rendements à l'échelle ou qu'on les décale : elles ne décrivent que la forme.
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- Le moment centré d'ordre k est
mean((x - mean) ** k): les moments 2, 3 et 4 donnent variance, asymétrie et aplatissement. - Asymétrie
m3 / m2 ** 1.5: négative = longue queue à gauche (rares grosses pertes) ; aplatissement en excèsm4 / m2 ** 2 - 3vaut 0 pour une normale. - Un aplatissement en excès positif signifie des queues épaisses ; les deux statistiques dépendent de quelques jours extrêmes, il leur faut beaucoup de données.
À suivre : les queues épaisses et les tests de normalité, pour vérifier formellement si les rendements suivent la courbe en cloche.
Lab : ce qui est noté
- Calculer la brique de base avec
central_moment25 pts - Mesurer quelle queue est la plus longue avec
skewness25 pts - Mesurer l'épaisseur des queues avec
excess_kurtosis25 pts - Nommer la forme avec
shape_label25 pts