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 hedgeEl 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.11Alfa: 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))- 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)conn - 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