Un nombre pour le risque de marché
La plupart des actions montent quand le marché monte et baissent quand il baisse. Le bêta d'un actif mesure de combien : un bêta de 1,5 signifie qu'en moyenne, une variation de 1 % du marché s'accompagne de 1,5 % pour l'actif. C'est la pente des rendements de l'actif tracés contre ceux du marché, covariance(asset, market) / variance(market). Le bêta est la part du risque que l'on ne peut pas diversifier, car tout actif du marché la porte.
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 hedgeLe modèle d'évaluation des actifs financiers
Le MEDAF transforme cela en prix du risque. Les investisseurs sont rémunérés pour le risque de marché, et pour rien d'autre ; le rendement attendu d'un actif est donc le taux sans risque plus son bêta multiplié par la prime de risque de marché (rendement du marché moins taux sans risque) : E[R] = rf + beta * (E[R_m] - rf). Un bêta de 0 rapporte le taux sans risque, un bêta de 1 le rendement du marché, et un bêta de 2 le taux sans risque plus deux fois la prime.
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.11Alpha : ce qui reste
Si le MEDAF est juste, un actif rapporte exactement le rendement que son bêta justifie. L'écart entre ce qu'il a rapporté et ce que prévoyait le MEDAF est l'alpha de Jensen : mean(asset) - (rf + beta * (mean(market) - rf)). Un alpha positif signifie qu'il a fait mieux que ne l'explique son risque de marché ; c'est ce que vendent les gérants actifs, et ce qui est le plus dur à trouver. La part du mouvement que le marché n'explique pas est le risque résiduel, mesuré par l'écart-type des résidus de la régression, qui peut être diversifié.
# 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))- Bêta =
covariance(asset, market) / variance(market), la pente par rapport au marché ; c'est la part non diversifiable du risque. - MEDAF :
rf + beta * (market - rf); l'alpha de Jensen est le rendement moyen moins cela, le talent (ou la chance) au-delà du risque de marché. - Le risque résiduel est l'écart-type de
asset - (a + b * market)avecn - 2; il peut être diversifié ; le bêta lui-même est bruité.
À suivre : les modèles multifactoriels (Fama–French), expliquer les rendements avec plus que le marché.
Lab : ce qui est noté
- Mesurer la sensibilité au marché avec
beta25 pts - Chiffrer le risque avec
capm_expected_return25 pts - Trouver le talent, s'il existe, avec
jensen_alpha25 pts - Mesurer le risque résiduel avec
residual_vol25 pts