Más allá de la media y la varianza
Dos series de rendimientos pueden tener la misma media y la misma volatilidad y ser muy distintas de mantener. Una sube despacio y de vez en cuando cae un 6 % en un día; la otra es simétrica y tranquila. La media y la varianza son los dos primeros momentos de una distribución. El momento central de orden k es el promedio de (x - mean) ** k. Los momentos 3 y 4 describen la forma: la asimetría dice qué cola es más larga, la curtosis lo gruesas que son las colas.
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 positiveAsimetría: qué cola es más larga
Elevar al cubo conserva el signo de cada desviación y hace que las grandes pesen mucho más, así que el tercer momento está dominado por los valores más extremos. Dividir por m2 ** 1.5 elimina las unidades y da la asimetría: 0 en una distribución simétrica, negativa cuando la cola larga está a la izquierda (pocas pérdidas grandes), positiva cuando está a la derecha (pocas ganancias grandes). Los índices bursátiles suelen tener asimetría negativa: subidas lentas, caídas repentinas. La asimetría de una muestra de 100 000 valores normales es de alrededor de 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.65Curtosis: cuán gruesas son las colas
La cuarta potencia hace que los valores extremos pesen enormemente, así que m4 / m2 ** 2 crece con las colas. Para una normal vale 3, por eso se cita la curtosis en exceso, m4 / m2 ** 2 - 3: es 0 para una normal, positiva con colas gruesas (los días extremos ocurren más a menudo de lo que prevé la campana) y negativa con colas finas (lo más fino posible, dos picos iguales, da -2). Los rendimientos diarios de la mayoría de los activos tienen una curtosis en exceso claramente positiva, a menudo 5 o más. Ambos estadísticos no cambian si reescalas o desplazas los rendimientos, así que describen solo la forma.
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- El momento central de orden k es
mean((x - mean) ** k): los momentos 2, 3 y 4 dan varianza, asimetría y curtosis. - Asimetría
m3 / m2 ** 1.5: negativa = cola larga a la izquierda (pocas pérdidas grandes); curtosis en excesom4 / m2 ** 2 - 3vale 0 para una normal. - Una curtosis en exceso positiva significa colas gruesas; ambos estadísticos dependen de unos pocos días extremos, así que necesitan muchos datos.
A continuación: las colas gruesas y los tests de normalidad, para comprobar formalmente si los rendimientos siguen la curva de campana.
Lab: qué se califica
- Calcular el bloque básico con
central_moment25 pts - Medir qué cola es más larga con
skewness25 pts - Medir lo gruesas que son las colas con
excess_kurtosis25 pts - Poner nombre a la forma con
shape_label25 pts