σμ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 AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 7 · Alpha-Forschung und Risiko›Thema 7.1·~55 Min.Fortgeschritten

CAPM und Beta

Position in der SkillModul 7 von 11 · Thema 1 von 9
7.1 CAPM und Beta
—Lab-Punkte— / 100XP gesamt—Serie—

Eine Zahl für das Marktrisiko

Die meisten Aktien steigen, wenn der Markt steigt, und fallen, wenn er fällt. Das Beta eines Assets misst, wie stark: Ein Beta von 1,5 heißt, dass einer Marktbewegung von 1 % im Schnitt 1,5 % beim Asset entsprechen. Es ist die Steigung der Asset-Renditen gegen die Marktrenditen, covariance(asset, market) / variance(market). Beta ist der Teil des Risikos, den man nicht wegdiversifizieren kann, weil jedes Asset im Markt ihn trägt.

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

Das Capital Asset Pricing Model

CAPM macht daraus einen Preis des Risikos. Anleger werden für das Tragen von Marktrisiko bezahlt und für nichts sonst; die erwartete Rendite eines Assets ist daher der risikolose Zins plus Beta mal die Marktrisikoprämie (Marktrendite minus risikoloser Zins): E[R] = rf + beta * (E[R_m] - rf). Ein Beta von 0 verdient den risikolosen Zins, ein Beta von 1 die Marktrendite, ein Beta von 2 den risikolosen Zins plus die doppelte Prämie.

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: was übrig bleibt

Stimmt CAPM, verdient ein Asset genau die Rendite, die sein Beta rechtfertigt. Die Differenz zwischen Verdientem und CAPM-Erwartung ist das Jensen-Alpha: mean(asset) - (rf + beta * (mean(market) - rf)). Ein positives Alpha heißt, es war besser, als sein Marktrisiko erklärt; das verkaufen aktive Manager, und es ist am schwersten zu finden. Der Teil der Bewegung, den der Markt nicht erklärt, ist das Residualrisiko, gemessen an der Standardabweichung der Regressionsresiduen, das sich wegdiversifizieren lässt.

# 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 ist eine Statistik, keine KonstanteEin auf 60 Tagen geschätztes Beta hat eine große Fehlerspanne und ändert sich mit dem Marktregime und der Indexwahl. Tägliche oder monatliche Renditen liefern unterschiedliche Zahlen. CAPM selbst ist eine Vereinfachung: Spätere Arbeiten fanden weitere Faktoren, die Renditen erklären, das Thema des nächsten Themas. Behandeln Sie ein Beta als gemessene, unsichere Eingabe.
  • Beta = covariance(asset, market) / variance(market), die Steigung gegen den Markt; der nicht diversifizierbare Teil des Risikos.
  • CAPM: rf + beta * (market - rf); Jensens Alpha ist die Durchschnittsrendite minus dies, das Können (oder Glück) jenseits des Marktrisikos.
  • Das Residualrisiko ist die Standardabweichung von asset - (a + b * market) mit n - 2; es lässt sich diversifizieren; Beta selbst ist verrauscht.

Als Nächstes: Mehrfaktormodelle (Fama–French), Renditen mit mehr als dem Markt erklären.

Lab: Was bewertet wird

  • Mit beta die Marktsensitivität messen25 Pkt.
  • Mit capm_expected_return das Risiko bepreisen25 Pkt.
  • Mit jensen_alpha das Können finden, falls vorhanden25 Pkt.
  • Mit residual_vol das Restrisiko beziffern25 Pkt.
Explorer · lab-93-1
▾ lab-93-1
…
bash · im Browser
learner@quantcraft:~/lab-93-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-93-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub