σμ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 Academyالمسارات
Ctrl K
AO
+1.2k متعلّم
تسجيل الدخولانضم ↗
المسارات
AO
+1.2k متعلّم
تسجيل الدخول
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
مسار Python›الوحدة 7 · بحث ألفا والمخاطر›الموضوع 7.2·~1 سمتقدم

النماذج متعددة العوامل: فاما-فرنش

الموضع في المسارالوحدة 7 من 11 · الموضوع 2 من 9
7.2 النماذج متعددة العوامل: فاما-فرنش
—درجة المختبر— / 100إجمالي XP—التتابع—

أكثر من سبب للحركة

لنموذج CAPM عامل واحد هو السوق. وفي 1992 بيّن فاما وفرينش أن عاملين آخرين يفسران جزءًا كبيرًا من فروق عوائد الأسهم: الحجم (ربحت الشركات الصغيرة أكثر من الكبيرة، عامل SMB أي الصغيرة ناقص الكبيرة) والقيمة (ربحت الأسهم الرخيصة بحسب نسبة القيمة الدفترية إلى السوقية أكثر من الغالية، عامل HML أي العالية ناقص المنخفضة). وأضافت نماذج لاحقة الزخم والربحية والاستثمار. وكل عامل هو نفسه سلسلة عوائد، وتعرّض الأصل له يقيس مدى حركته مع تلك السلسلة.

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

المربعات الصغرى بصيغة المصفوفات

مع عدة عوامل يكون الانحدار asset = alpha + b1 * f1 + ... + bk * fk + error. نضع العوامل بجانب عمود من الآحاد في مصفوفة X، وتحل معاملات المربعات الصغرى المعادلات الطبيعية (X'X) c = X'y. وفي NumPy: np.linalg.solve(X.T @ X, X.T @ y). وهي الآلية نفسها لانحدار العامل الواحد، لكن الآن بـ k + 1 مجهولًا. المعامل الأول هو ألفا والبقية هي التعرضات.

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))

كم تفسر العوامل؟

يجيب معامل التحديد R²: حصة تغير الأصل التي تفسرها العوامل، 1 - SSres / SStot، بين 0 (لا شيء) و1 (كل شيء). وللمحفظة الأسهم المنوعة غالبًا R² فوق 0.9 على عوامل فاما-فرينش: فمخاطرها شبه كلها مخاطر عوامل. وللسهم المنفرد قيمة أقل، والباقي، التغير المتبقي، خاص بالشركة. وإضافة عامل لا تخفض R² داخل العينة أبدًا، فلا يثبت رقم أعلى وحده أن عاملًا مهم.

# 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
العوامل رهانات لا وجبات مجانيةعلاوة العامل مكافأة على مخاطرة تؤلم في الأوقات السيئة، وقد تختفي أو تنعكس لسنوات. والتعرضات المقدرة من عينة قصيرة مضطربة، ومع عوامل مترابطة قد تكون المعاملات الفردية غير مستقرة حتى مع ملاءمة جيدة. واستخدام النموذج العاملي هو أساسًا تحليل المخاطر والأداء: كم جاء من السوق والحجم والقيمة، وكم بقي، أي ألفا.
  • يُجري النموذج العاملي انحدار العوائد الزائدة على عدة عوامل: X = [آحاد | عوامل] والمعاملات [alpha, beta_1..beta_k].
  • حلّ المعادلات الطبيعية np.linalg.solve(X.T @ X, X.T @ y)؛ و R² هو 1 - SSres / SStot ولا ينخفض أبدًا عند إضافة عامل.
  • يستلزم النموذج rf + sum(betas * premia)؛ والتعرضات والعلاوات تقديرات، وقد تختفي علاوة العامل.

التالي: معامل المعلومات، قياس ما إذا كانت الإشارة تتنبأ بالعوائد أصلًا.

المختبر: ما الذي يُقيَّم

  • جهّز الانحدار باستخدام design_matrix25 نقطة
  • قدّر المعاملات باستخدام fit_factor_model25 نقطة
  • قيّم جودة الملاءمة باستخدام r_squared25 نقطة
  • سعّر التعرضات باستخدام factor_expected_return25 نقطة
المستكشف · lab-94-1
▾ lab-94-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-94-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

هل تريد إعادة ضبط هذا الموضوع؟

سيعود كل ما في lab-94-1 إلى الملفات الابتدائية وستُمسح الطرفية. ستفقد حلّك الحالي ولا يمكن التراجع عن ذلك.

سيُعاد ضبطه
  • main.py ← الشيفرة الابتدائية
  • سجل الطرفية ومخرجات الاختبارات
  • التغييرات غير المُرسلة
سيُحتفظ به
  • أفضل درجة في المختبر
  • نقاط XP والتتابع
  • تقدّم المحاضرة والملاحظات

سجّل الدخول لتشغيل الكود الخاص بك.

قراءة كل المحاضرات مجانية. أنشئ حسابًا أو سجّل الدخول لتشغيل الكود وتنفيذ الاختبارات وتسليم هذا المختبر.

  • بيئة تطوير داخل المتصفح مع طرفية bash — لا حاجة لتثبيت أي شيء
  • تصحيح فوري ونقاط خبرة ومكانك في المسار
إنشاء حسابتسجيل الدخول
أو
المتابعة عبر GitHub