σμ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 7 · Recherche d'alpha et risque›Sujet 7.1·~55 minAvancé

Le MEDAF et le bêta

Position dans le parcoursModule 7 sur 11 · Sujet 1 sur 9
7.1 Le MEDAF et le bêta
—Score du lab— / 100XP total—Série—

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 hedge

Le 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.11

Alpha : 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))
Le bêta est une statistique, pas une constanteUn bêta estimé sur 60 jours a une large marge d'erreur, et il change avec le régime de marché et le choix de l'indice. Des rendements quotidiens ou mensuels donnent des nombres différents. Le MEDAF lui-même est une simplification : des travaux ultérieurs ont trouvé d'autres facteurs expliquant les rendements, sujet du prochain thème. Traitez un bêta comme une donnée mesurée et incertaine.
  • 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) avec n - 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
Explorateur · lab-93-1
▾ lab-93-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-93-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-93-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