Expliquer un rendement par un autre
Une action bouge rarement seule : quand le marché monte, elle monte généralement aussi. La régression linéaire quantifie ce lien en ajustant une droite y = alpha + beta * x à travers les paires de rendements (x : le marché, y : l'action). Les moindres carrés ordinaires (MCO) choisissent la droite qui rend la somme des carrés des écarts verticaux, les résidus, aussi petite que possible. Le résultat a une forme explicite : la pente beta est la covariance de x et y divisée par la variance de x, et l'ordonnée alpha fait passer la droite par le point des moyennes.
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 marketRésidus et R carré
Un résidu est ce que la droite n'explique pas pour une observation : y - (alpha + beta * x). Les résidus des MCO s'additionnent toujours à zéro et sont non corrélés avec x, ce qui est un contrôle pratique de votre propre code. Le R carré dit quelle part de la variation de y la droite explique : 1 - sum(résidus²) / sum((y - mean_y)²). Il va de 0 (la droite ne fait pas mieux que la moyenne) à 1 (tous les points sont sur la droite) et, dans une régression simple, il est égal au carré de la corrélation de x et 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 : bêta et alpha
En finance, la régression a un nom. Le bêta est la sensibilité au marché : un bêta de 1,3 signifie que l'action tend à bouger de 30 % de plus que le marché, à la hausse comme à la baisse. L'alpha est le rendement moyen restant une fois cette exposition au marché prise en compte, et c'est ce qu'un gérant revendique comme talent. Pour écarter le taux sans risque, la régression du MEDAF (CAPM) utilise des rendements excédentaires : le rendement moins le taux sans risque, pour l'actif comme pour le marché. Une stratégie dont l'alpha est proche de zéro n'est qu'une exposition au marché déguisée.
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- Les MCO minimisent les résidus au carré :
beta = cov(x, y) / var(x)(sommes de produits centrés) etalpha = mean_y - beta * mean_x. - Les résidus
y - (alpha + beta * x)s'additionnent à zéro ; le R carré1 - ss_res / ss_totest la part de variance expliquée. - MEDAF : régressez les rendements excédentaires de l'actif sur ceux du marché ; le bêta est l'exposition au marché, l'alpha ce qui reste.
À suivre : la volatilité, pour mesurer et prévoir l'ampleur des fluctuations des rendements.
Lab : ce qui est noté
- Ajuster la droite à travers les points avec
ols_fit25 pts - Mesurer ce que la droite ne capte pas avec
residuals25 pts - Évaluer l'ajustement avec
r_squared25 pts - Séparer un actif en exposition au marché et talent avec
capm_alpha_beta25 pts