σμ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›الوحدة 3 · الاحتمالات ومحاكاة مونت كارلو›الموضوع 3.5·~55 دمتوسط

الانحدار الخطي (OLS)

الموضع في المسارالوحدة 3 من 11 · الموضوع 5 من 12
3.5 الانحدار الخطي (OLS)
—درجة المختبر— / 100إجمالي XP—التتابع—

تفسير عائد بعائد آخر

نادرًا ما يتحرك السهم وحده: حين يرتفع السوق يرتفع عادةً معه. يُقدِّر الانحدار الخطي هذه الصلة بملاءمة خط مستقيم y = alpha + beta * x عبر أزواج العوائد (x: السوق وy: السهم). وتختار المربعات الصغرى العادية (OLS) الخط الذي يجعل مجموع مربعات الفجوات الرأسية، أي البواقي، أصغر ما يمكن. وللنتيجة صيغة مغلقة: الميل beta هو التغاير بين x وy مقسومًا على تباين x، ويجعل الحد الثابت alpha الخط يمر بنقطة المتوسطات.

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 التربيعي

الباقي هو ما يعجز الخط عن تفسيره في ملاحظة واحدة: y - (alpha + beta * x). وبواقي OLS تجمع دائمًا إلى الصفر وغير مرتبطة بـ x، وهذا فحص مفيد لشيفرتك. ويبيّن R التربيعي أي جزء من تباين y يفسّره الخط: 1 - sum(البواقي²) / sum((y - mean_y)²). يمتد من 0 (الخط لا يتفوق على المتوسط) إلى 1 (كل النقاط على الخط)، وفي الانحدار البسيط يساوي مربع الارتباط بين x و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: بيتا وألفا

في التمويل لهذا الانحدار اسم. بيتا هي الحساسية للسوق: بيتا 1.3 تعني أن السهم يميل إلى التحرك 30% أكثر من السوق صعودًا وهبوطًا. وألفا هو متوسط العائد المتبقي بعد احتساب هذا التعرّض للسوق، وهو ما يدّعيه المدير مهارة. ولإبعاد معدل الخالي من المخاطر يستخدم انحدار CAPM العوائد الزائدة: العائد ناقص معدل الخالي من المخاطر، للأصل وللسوق معًا. واستراتيجية ألفا فيها قريبة من الصفر ليست سوى تعرّض للسوق متنكّر.

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
الخط ليس سببًايصف الانحدار كيف تحركت سلسلتان معًا في العيّنة؛ ولا يثبت أن إحداهما تسوق الأخرى، وأرقامه تقديرات لها ريبتها. مع 10 أيام تكون بيتا تقريبية ويضيع ألفا في الضجيج. وتتغير بيتا أيضًا مع الزمن ونظام السوق، فأعد تقديرها على نافذة متحركة بدل الوثوق برقم واحد إلى الأبد.
  • تُصغّر OLS مربعات البواقي: beta = cov(x, y) / var(x) (مجاميع حواصل مركزة) وalpha = mean_y - beta * mean_x.
  • البواقي y - (alpha + beta * x) تجمع إلى صفر؛ وR التربيعي 1 - ss_res / ss_tot هو حصة التباين المفسَّرة.
  • CAPM: انحدر العوائد الزائدة للأصل على العوائد الزائدة للسوق؛ بيتا هي التعرّض للسوق وألفا ما تبقى.

التالي: التقلب، قياس مقدار تذبذب العوائد والتنبؤ به.

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

  • ارسم الخط الأنسب عبر النقاط باستخدام ols_fit25 نقطة
  • قِس ما يفوت الخط باستخدام residuals25 نقطة
  • قيّم جودة الملاءمة باستخدام r_squared25 نقطة
  • افصل الأصل إلى تعرّض للسوق ومهارة باستخدام capm_alpha_beta25 نقطة
المستكشف · lab-58-1
▾ lab-58-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-58-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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