σμ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.1·~40 minIntermedio

Media y varianza de los rendimientos

Posición en la rutaMódulo 3 de 11 · Tema 1 de 12
3.1 Media y varianza de los rendimientos
—Puntuación del lab— / 100XP total—Racha—

Dos números para una distribución

Una columna de rendimientos es difícil de comparar con otra. Dos números resumen la mayor parte: la media dice dónde están centrados los rendimientos y la varianza cuánto se dispersan alrededor de ese centro. Para n rendimientos, la media es sum(x) / n; las desviaciones x - mean siempre suman cero, así que para medir la dispersión primero se elevan al cuadrado. La varianza muestral es la suma de las desviaciones al cuadrado dividida por n - 1, no n: la media se estimó con los mismos datos, lo que hace las desviaciones algo demasiado pequeñas, y dividir por n - 1 lo corrige.

variance = sum((x - mean)^2) / (n - 1) std = sqrt(variance)
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)

Desviación típica y volatilidad

Elevar al cuadrado cambió las unidades: una varianza de rendimientos está en «porcentaje al cuadrado». Su raíz cuadrada, la desviación típica, vuelve a la unidad de los rendimientos, y en finanzas se llama volatilidad. Es la medida de riesgo más común. Un día típico de una gran empresa se mueve alrededor de un 1 a 2 %, es decir, una volatilidad de 0,01 a 0,02 diaria. Se lee respecto a la media: con una volatilidad del 1,2 % diario, un día de -3,6 % está a tres desviaciones típicas.

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.55

Anualizar y el ratio de Sharpe

Las cifras diarias son pequeñas y poco expresivas, así que se dan por año. La media crece linealmente con el tiempo (252 días bursátiles al año: se multiplica por 252), pero la volatilidad crece con la raíz cuadrada del tiempo: se multiplica por sqrt(252), alrededor de 15,9. La razón es que los movimientos diarios aleatorios se compensan en parte, así que la incertidumbre se acumula más despacio que la media. El ratio de Sharpe divide el rendimiento medio por encima de la tasa libre de riesgo (el rendimiento excedente) entre la volatilidad: recompensa por unidad de riesgo, anualizada del mismo modo. Permite comparar una estrategia tranquila con una agitada.

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)
Un estadístico viene de una muestraLa media de 8 días es una estimación muy ruidosa: su error estándar es aproximadamente std / sqrt(n), aquí 0,0012, mayor que la propia media (0,0011). Un gran ratio de Sharpe en pocas semanas dice poco; cuantas más observaciones, más se puede confiar en una media, y las cifras de riesgo son mucho más estables que los rendimientos medios.
  • Media: x.mean(); varianza muestral: ((x - mean) ** 2).sum() / (n - 1); la volatilidad es su raíz cuadrada.
  • Anualiza la media con * periods y la volatilidad con * sqrt(periods): el riesgo crece con la raíz cuadrada del tiempo.
  • Sharpe = rendimiento excedente medio / su desviación típica * sqrt(periods): recompensa por unidad de riesgo; una muestra corta la hace poco fiable.

A continuación: la asimetría y la curtosis, los dos estadísticos que describen la forma de la distribución más allá de su centro y su dispersión.

Lab: qué se califica

  • Medir la dispersión de los rendimientos con sample_variance25 pts
  • Expresar la dispersión en las unidades de los rendimientos con sample_std25 pts
  • Anualizar la media y la volatilidad con annualized_stats25 pts
  • Valorar el rendimiento por unidad de riesgo con sharpe_ratio25 pts
Explorador · lab-54-1
▾ lab-54-1
…
bash · en el navegador
learner@quantcraft:~/lab-54-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

Todo lo que hay en lab-54-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