σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyRutas
Ctrl K
AO
+1,2 k estudiantes
Iniciar sesiónUnirse ↗
Rutas
AO
+1,2 k estudiantes
Iniciar sesión
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Ruta de Python›Módulo 3 · Probabilidad y simulación Monte Carlo›Tema 3.2·~40 minIntermedio

Asimetría y curtosis

Posición en la rutaMódulo 3 de 11 · Tema 2 de 12
3.2 Asimetría y curtosis
—Puntuación del lab— / 100XP total—Racha—

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.

m_k = mean((x - mean)^k) skewness = m3 / m2^1.5 excess kurtosis = m4 / m2^2 - 3
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 positive

Asimetrí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.65

Curtosis: 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
Un solo desplome puede cambiarlo todoLa asimetría y la curtosis dependen de los pocos valores más extremos, así que son mucho menos estables que la media o la volatilidad: añade o quita un día y saltan. Calcúlalas con suficientes datos (al menos cientos de días) y mira también el histograma antes de fiarte de una cifra.
  • 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 exceso m4 / m2 ** 2 - 3 vale 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
Explorador · lab-55-1
▾ lab-55-1
…
bash · en el navegador
learner@quantcraft:~/lab-55-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

Todo lo que hay en lab-55-1 vuelve a los archivos iniciales y se limpia el terminal. Tu solución actual se perderá: no se puede deshacer.

Se restablecerá
  • main.py → código inicial
  • Historial del terminal y salida de pruebas
  • Cambios sin enviar
Se conservará
  • Mejor puntuación del lab
  • Tu XP y tu racha
  • Progreso de la lección y notas

Inicia sesión para ejecutar tu código.

Todas las clases se pueden leer gratis. Crea una cuenta o inicia sesión para ejecutar código, lanzar las pruebas y enviar este lab.

  • IDE en el navegador con terminal bash — sin instalar nada
  • Corrección instantánea, XP y tu lugar en la ruta
Crear una cuentaIniciar sesión
O
Continuar con GitHub