σμ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 7 · Investigación de alfa y riesgo›Tema 7.1·~55 minAvanzado

CAPM y beta

Posición en la rutaMódulo 7 de 11 · Tema 1 de 9
7.1 CAPM y beta
—Puntuación del lab— / 100XP total—Racha—

Un número para el riesgo de mercado

La mayoría de las acciones suben cuando sube el mercado y bajan cuando baja. La beta de un activo mide cuánto: una beta de 1,5 significa que, de media, un movimiento del 1 % del mercado viene con un 1,5 % en el activo. Es la pendiente de los rendimientos del activo frente a los del mercado, covariance(asset, market) / variance(market). La beta es la parte del riesgo que no se puede diversificar, porque todo activo del mercado la lleva.

import numpy as np

market = np.array([0.01, -0.02, 0.015, 0.005, -0.01, 0.02])
asset = 1.5 * market + np.array([0.002, -0.001, 0.003, 0.0, -0.002, 0.001])      # moves 1.5x the market, plus noise

market_dev = market - market.mean()
covariance = np.sum((asset - asset.mean()) * market_dev) / (len(market) - 1)
variance = np.sum(market_dev ** 2) / (len(market) - 1)
print(round(float(covariance / variance), 4))                 # 1.5972: about 1.5, the noise moves it a little
print(round(float(np.polyfit(market, asset, 1)[0]), 4))       # the regression slope gives the same number
# Beta does not care about a constant, and scales with the asset
import numpy as np

def beta(asset, market):
    market_dev = market - market.mean()
    return float(np.sum((asset - asset.mean()) * market_dev) / np.sum(market_dev ** 2))

rng = np.random.default_rng(4)
market = rng.normal(0, 0.01, size=100)
print(round(beta(2.5 * market, market), 4))               # 2.5   an asset that moves 2.5x the market
print(round(beta(market + 0.01, market), 4))              # 1.0   adding a constant changes nothing
print(round(beta(-market, market), 4))                    # -1.0  a perfect hedge

El modelo de valoración de activos de capital

El CAPM convierte eso en un precio del riesgo. A los inversores se les paga por soportar riesgo de mercado, y por nada más; el rendimiento esperado de un activo es el tipo libre de riesgo más su beta por la prima de riesgo de mercado (rendimiento del mercado menos tipo libre de riesgo): E[R] = rf + beta * (E[R_m] - rf). Una beta de 0 gana el tipo libre de riesgo, una beta de 1 el rendimiento del mercado, y una beta de 2 el tipo libre de riesgo más el doble de la prima.

def capm_expected_return(rf, beta_value, market_return):
    return rf + beta_value * (market_return - rf)

rf, market_return = 0.01, 0.06
for b in (0.0, 0.5, 1.0, 1.5, 2.0):
    print(b, round(capm_expected_return(rf, b, market_return), 4))     # 0.01, 0.035, 0.06, 0.085, 0.11

Alfa: lo que sobra

Si el CAPM es correcto, un activo gana exactamente el rendimiento que justifica su beta. La diferencia entre lo que ganó y lo que el CAPM esperaba es el alfa de Jensen: mean(asset) - (rf + beta * (mean(market) - rf)). Un alfa positivo significa que lo hizo mejor de lo que explica su riesgo de mercado; eso venden los gestores activos y es lo más difícil de encontrar. La parte del movimiento que el mercado no explica es el riesgo residual, medido por la desviación típica de los residuos de la regresión, que se puede diversificar.

# Alpha and residual risk of an asset with a little skill in it
import numpy as np

rng = np.random.default_rng(2)
market = rng.normal(0.0004, 0.01, size=500)
asset = 0.0003 + 1.2 * market + rng.normal(0, 0.005, size=500)       # true alpha 3 bps a day, beta 1.2, residual 0.5%
rf = 0.0001

market_dev = market - market.mean()
b = np.sum((asset - asset.mean()) * market_dev) / np.sum(market_dev ** 2)
alpha = asset.mean() - (rf + b * (market.mean() - rf))
a = asset.mean() - b * market.mean()
residual = asset - (a + b * market)
print(round(float(b), 3), round(float(alpha), 5), round(float(np.sqrt(np.sum(residual ** 2) / (len(asset) - 2))), 4))
La beta es un estadístico, no una constanteUna beta estimada con 60 días tiene un amplio margen de error, y cambia con el régimen de mercado y con la elección del índice. Rendimientos diarios o mensuales dan números distintos. El CAPM mismo es una simplificación: trabajos posteriores hallaron más factores que explican los rendimientos, tema del siguiente tema. Trata una beta como un dato medido e incierto.
  • Beta = covariance(asset, market) / variance(market), la pendiente frente al mercado; es la parte no diversificable del riesgo.
  • CAPM: rf + beta * (market - rf); el alfa de Jensen es el rendimiento medio menos eso, la habilidad (o suerte) más allá del riesgo de mercado.
  • El riesgo residual es la desviación típica de asset - (a + b * market) con n - 2; se puede diversificar; la beta misma es ruidosa.

A continuación: los modelos multifactoriales (Fama–French), explicar los rendimientos con más que el mercado.

Lab: qué se califica

  • Medir la sensibilidad al mercado con beta25 pts
  • Poner precio al riesgo con capm_expected_return25 pts
  • Hallar la habilidad, si la hay, con jensen_alpha25 pts
  • Medir el riesgo residual con residual_vol25 pts
Explorador · lab-93-1
▾ lab-93-1
…
bash · en el navegador
learner@quantcraft:~/lab-93-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

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