σμ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.2·~1 Std.Fortgeschritten

Multifaktormodelle: Fama-French

Position in der SkillModul 7 von 11 · Thema 2 von 9
7.2 Multifaktormodelle: Fama-French
—Lab-Punkte— / 100XP gesamt—Serie—

Mehr als ein Grund, sich zu bewegen

CAPM hat einen Faktor, den Markt. 1992 zeigten Fama und French, dass zwei weitere einen großen Teil der Renditeunterschiede von Aktien erklären: die Größe (kleine Unternehmen verdienten mehr als große, Faktor SMB, small minus big) und der Wert (nach Buch-Markt-Verhältnis billige Aktien verdienten mehr als teure, Faktor HML, high minus low). Spätere Modelle fügten Momentum, Profitabilität und Investition hinzu. Jeder Faktor ist selbst eine Renditereihe, und die Ladung eines Assets darauf zeigt, wie stark es sich mit dieser Reihe bewegt.

import numpy as np

rng = np.random.default_rng(1)
n = 250
market = rng.normal(0.0004, 0.010, size=n)               # excess returns of three factors
smb = rng.normal(0.0001, 0.005, size=n)
hml = rng.normal(0.0001, 0.005, size=n)
factors = np.column_stack([market, smb, hml])             # shape (n, k) = (250, 3)

asset = 0.0002 + factors @ np.array([1.1, 0.5, -0.3]) + rng.normal(0, 0.004, size=n)
X = np.column_stack([np.ones(n), factors])                # design matrix: a column of ones for alpha
print(X.shape)                                            # (250, 4)
# The design matrix of three days and two factors
import numpy as np

factors = np.array([[0.010, -0.002], [-0.004, 0.001], [0.006, 0.003]])
X = np.column_stack([np.ones(len(factors)), factors])
print(X)                                           # a column of ones, then market and SMB

Kleinste Quadrate in Matrixform

Mit mehreren Faktoren lautet die Regression asset = alpha + b1 * f1 + ... + bk * fk + Fehler. Man legt die Faktoren neben eine Einserspalte in eine Matrix X, und die Kleinste-Quadrate-Koeffizienten lösen die Normalgleichungen (X'X) c = X'y. In NumPy: np.linalg.solve(X.T @ X, X.T @ y). Es ist dieselbe Mechanik wie bei der Ein-Faktor-Regression, nun mit k + 1 Unbekannten. Der erste Koeffizient ist Alpha, die übrigen sind die Ladungen.

import numpy as np

rng = np.random.default_rng(1)
n = 250
factors = np.column_stack([rng.normal(0.0004, 0.010, size=n), rng.normal(0.0001, 0.005, size=n), rng.normal(0.0001, 0.005, size=n)])
asset = 0.0002 + factors @ np.array([1.1, 0.5, -0.3]) + rng.normal(0, 0.004, size=n)

X = np.column_stack([np.ones(n), factors])
coef = np.linalg.solve(X.T @ X, X.T @ asset)
print(np.round(coef, 4))                                   # [alpha, market, SMB, HML]: the loadings come out near [1.1, 0.5, -0.3]

residual = asset - X @ coef
r2 = 1 - np.sum(residual ** 2) / np.sum((asset - asset.mean()) ** 2)
print(round(float(r2), 4))

Wie viel erklären die Faktoren?

Das Bestimmtheitsmaß R² antwortet: der Anteil der Schwankung des Assets, den die Faktoren erklären, 1 - SSres / SStot, zwischen 0 (nichts) und 1 (alles). Ein diversifiziertes Aktienportfolio hat auf den Fama-French-Faktoren oft ein R² über 0,9: Sein Risiko ist fast nur Faktorrisiko. Eine Einzelaktie hat ein niedrigeres, und der Rest, die residuale Schwankung, ist unternehmensspezifisch. Ein zusätzlicher Faktor senkt R² in der Stichprobe nie, eine höhere Zahl allein beweist also nicht, dass ein Faktor zählt.

# What the model implies: the expected return from the loadings and the factor premia
import numpy as np

betas = np.array([1.1, 0.5, -0.3])             # market, SMB, HML loadings
premia = np.array([0.0006, 0.0002, 0.0002])    # expected daily factor returns
rf = 0.0001

expected = rf + np.sum(betas * premia)
print(round(float(expected), 6))               # 0.0008 per day, about 20% a year on 250 days
Faktoren sind Wetten, keine GratismahlzeitenEine Faktorprämie ist die Belohnung für ein Risiko, das in schlechten Zeiten wehtut, und sie kann jahrelang verschwinden oder umkehren. Aus kurzen Stichproben geschätzte Ladungen sind verrauscht, und bei korrelierten Faktoren können einzelne Koeffizienten selbst bei guter Anpassung instabil sein. Ein Faktormodell dient vor allem dazu, Risiko und Performance zu zerlegen: wie viel kam vom Markt, von Größe, Wert, und wie viel, das Alpha, bleibt.
  • Ein Faktormodell regressiert Überrenditen auf mehrere Faktoren: X = [Einsen | Faktoren], Koeffizienten [alpha, beta_1..beta_k].
  • Lösen Sie die Normalgleichungen np.linalg.solve(X.T @ X, X.T @ y); R² ist 1 - SSres / SStot und sinkt nie, wenn man einen Faktor hinzufügt.
  • Das Modell impliziert rf + sum(betas * premia); Ladungen und Prämien sind Schätzungen, und eine Faktorprämie kann verschwinden.

Als Nächstes: der Informationskoeffizient, messen, ob ein Signal Renditen überhaupt vorhersagt.

Lab: Was bewertet wird

  • Mit design_matrix die Regression aufstellen25 Pkt.
  • Mit fit_factor_model die Ladungen schätzen25 Pkt.
  • Mit r_squared die Anpassung bewerten25 Pkt.
  • Mit factor_expected_return die Risikoexpositionen bepreisen25 Pkt.
Explorer · lab-94-1
▾ lab-94-1
…
bash · im Browser
learner@quantcraft:~/lab-94-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-94-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