Explicar un rendimiento con otro
Una acción rara vez se mueve sola: cuando el mercado sube, normalmente ella también. La regresión lineal cuantifica ese vínculo ajustando una recta y = alpha + beta * x por los pares de rendimientos (x: el mercado, y: la acción). Los mínimos cuadrados ordinarios (MCO) eligen la recta que hace lo más pequeña posible la suma de los cuadrados de las distancias verticales, los residuos. El resultado tiene forma cerrada: la pendiente beta es la covarianza de x e y dividida por la varianza de x, y la ordenada alpha hace pasar la recta por el punto de las medias.
import numpy as np
market = np.array([0.010, -0.005, 0.004, 0.012, -0.008, 0.003, -0.002, 0.007, 0.001, -0.004])
asset = np.array([0.013, -0.004, 0.007, 0.016, -0.011, 0.004, -0.001, 0.011, 0.002, -0.007])
dx = market - market.mean() # deviations of x from its mean
beta = (dx * (asset - asset.mean())).sum() / (dx ** 2).sum()
alpha = asset.mean() - beta * market.mean()
print(round(beta, 4), round(alpha, 5)) # 1.3271 0.00061 the asset moves 1.33 times as much as the marketResiduos y R cuadrado
Un residuo es lo que la recta no explica de una observación: y - (alpha + beta * x). Los residuos de MCO siempre suman cero y no están correlacionados con x, una comprobación útil de tu propio código. El R cuadrado dice qué parte de la variación de y explica la recta: 1 - sum(residuos²) / sum((y - mean_y)²). Va de 0 (la recta no mejora a la media) a 1 (todos los puntos están sobre la recta) y, en una regresión simple, es igual al cuadrado de la correlación de x e y.
residuals = asset - (alpha + beta * market)
print(abs(residuals.sum()) < 1e-12, abs((residuals * market).sum()) < 1e-12) # True True the OLS fingerprints
ss_res = (residuals ** 2).sum()
ss_tot = ((asset - asset.mean()) ** 2).sum()
print(round(1 - ss_res / ss_tot, 4)) # 0.9785
print(round(np.corrcoef(market, asset)[0, 1] ** 2, 4)) # 0.9785 the squared correlationCAPM: beta y alfa
En finanzas la regresión tiene nombre. La beta es la sensibilidad al mercado: una beta de 1,3 significa que la acción tiende a moverse un 30 % más que el mercado, al alza o a la baja. El alfa es el rendimiento medio que queda una vez descontada esa exposición al mercado, y es lo que un gestor reclama como habilidad. Para dejar fuera la tasa libre de riesgo, la regresión del CAPM usa rendimientos excedentes: el rendimiento menos la tasa libre de riesgo, tanto del activo como del mercado. Una estrategia con alfa cercano a cero es solo exposición al mercado disfrazada.
risk_free = 0.0001 # risk-free return of one day
x = market - risk_free # excess returns of the market
y = asset - risk_free # excess returns of the asset
beta = ((x - x.mean()) * (y - y.mean())).sum() / ((x - x.mean()) ** 2).sum()
alpha = y.mean() - beta * x.mean()
print(round(beta, 4), round(alpha, 6)) # 1.3271 0.000644 a daily alpha of 0.064%, on 10 days of data# Points exactly on y = 1 + 2x: the fit recovers the line
x = np.array([1.0, 2.0, 3.0, 4.0])
y = 1 + 2 * x
dx = x - x.mean()
slope = (dx * (y - y.mean())).sum() / (dx ** 2).sum()
print(y.mean() - slope * x.mean(), slope) # 1.0 2.0- MCO minimiza los residuos al cuadrado:
beta = cov(x, y) / var(x)(sumas de productos centrados) yalpha = mean_y - beta * mean_x. - Los residuos
y - (alpha + beta * x)suman cero; el R cuadrado1 - ss_res / ss_totes la parte de varianza explicada. - CAPM: regresa los rendimientos excedentes del activo sobre los del mercado; la beta es la exposición al mercado, el alfa lo que queda.
A continuación: la volatilidad, para medir y pronosticar cuánto fluctúan los rendimientos.
Lab: qué se califica
- Ajustar la recta por los puntos con
ols_fit25 pts - Medir lo que la recta no capta con
residuals25 pts - Valorar el ajuste con
r_squared25 pts - Separar un activo en exposición al mercado y habilidad con
capm_alpha_beta25 pts