σμ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 AcademyParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Parcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Parcours Python›Module 3 · Probabilités et simulation Monte-Carlo›Sujet 3.5·~55 minIntermédiaire

Régression linéaire (MCO)

Position dans le parcoursModule 3 sur 11 · Sujet 5 sur 12
3.5 Régression linéaire (MCO)
—Score du lab— / 100XP total—Série—

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.

beta = sum((x - mean_x) * (y - mean_y)) / sum((x - mean_x)^2) alpha = mean_y - beta * mean_x
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 market

Ré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 correlation

CAPM : 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
Une droite n'est pas une causeUne régression décrit comment deux séries ont évolué ensemble dans l'échantillon ; elle ne prouve pas que l'une entraîne l'autre, et ses chiffres sont des estimations avec leur propre incertitude. Avec 10 jours, le bêta est grossier et l'alpha se perd dans le bruit. Le bêta change aussi avec le temps et le régime de marché : réestimez-le sur une fenêtre glissante plutôt que de croire un seul chiffre pour toujours.
  • Les MCO minimisent les résidus au carré : beta = cov(x, y) / var(x) (sommes de produits centrés) et alpha = mean_y - beta * mean_x.
  • Les résidus y - (alpha + beta * x) s'additionnent à zéro ; le R carré 1 - ss_res / ss_tot est 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
Explorateur · lab-58-1
▾ lab-58-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-58-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-58-1 revient aux fichiers de départ et le terminal est vidé. Votre solution actuelle sera perdue : cette action est irréversible.

Sera réinitialisé
  • main.py → code de départ
  • Historique du terminal et sortie des tests
  • Modifications non soumises
Sera conservé
  • Meilleur score du lab
  • Votre XP et votre série
  • Progression du cours et notes

Connectez-vous pour exécuter votre code.

Tous les cours sont gratuits à lire. Créez un compte ou connectez-vous pour exécuter du code, lancer les tests et soumettre ce lab.

  • IDE dans le navigateur avec terminal bash — rien à installer
  • Correction instantanée, XP et votre place dans le parcours
Créer un compteSe connecter
OU
Continuer avec GitHub