σμ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›الوحدة 5 · تحسين المحافظ›الموضوع 5.2·~45 دمتوسط

عائد المحفظة وتباينها

الموضع في المسارالوحدة 5 من 11 · الموضوع 2 من 5
5.2 عائد المحفظة وتباينها
—درجة المختبر— / 100إجمالي XP—التتابع—

المحفظة متجه من الأوزان

توصف المحفظة بـوزن لكل أصل: الجزء من قيمتها المستثمر فيه. تجمع الأوزان إلى 1، والوزن السالب مركز بيع يموّل البقية. وعائدها خلال فترة هو المتوسط المرجّح لعوائد الأصول، فالعائد المتوقع حاصل ضرب نقطي w @ mu. والعائد هو النصف السهل: خطي بلا تفاعل بين الأصول. أما المخاطر فلا.

import numpy as np

weights = np.array([0.6, 0.4])             # 60% in asset A, 40% in asset B
mu = np.array([0.08, 0.05])                # expected annual returns

print(weights.sum())                       # 1.0
print(weights @ mu)                        # 0.068   = 0.6 * 0.08 + 0.4 * 0.05

التباين صيغة تربيعية

بالنسبة إلى أصلين فإن تباين w1 * A + w2 * B هو w1**2 * var(A) + w2**2 * var(B) + 2 * w1 * w2 * cov(A, B): تباين كل أصل بنفسه مضافًا إليه حد متقاطع. ومع n أصلًا توجد n * n حدًا هي w_i * w_j * cov[i, j]، والمجموع كله هو الصيغة التربيعية w @ cov @ w، سطر واحد في NumPy. والحدود المتقاطعة هي لب الموضوع: إذا لم يكن الأصلان مرتبطين تمامًا ألغى كل منهما بعض الآخر، فتكون المحفظة أقل خطرًا من المتوسط المرجّح للمخاطر.

# The variance two ways: the explicit formula and the matrix form
import numpy as np

weights = np.array([0.6, 0.4])
cov = np.array([[0.04, 0.006], [0.006, 0.01]])      # variances 0.04 and 0.01 (volatilities 20% and 10%), covariance 0.006

explicit = weights[0] ** 2 * cov[0, 0] + weights[1] ** 2 * cov[1, 1] + 2 * weights[0] * weights[1] * cov[0, 1]
matrix_form = weights @ cov @ weights
print(round(explicit, 6), round(matrix_form, 6))     # 0.01888 0.01888
print(round(float(np.sqrt(matrix_form)), 4))         # 0.1374   a 13.7% volatility, below 0.6*20% + 0.4*10% = 16%
# Diversification: 50/50 in two assets of 20% volatility, for several correlations
import numpy as np

weights = np.array([0.5, 0.5])
for rho in (1.0, 0.5, 0.0, -0.5):
    cov = 0.2 * 0.2 * np.array([[1.0, rho], [rho, 1.0]])
    print(rho, round(float(np.sqrt(weights @ cov @ weights)), 4))      # 1.0: 0.2, 0.5: 0.1732, 0.0: 0.1414, -0.5: 0.1

من أين تأتي المخاطر؟

يريد المدير معرفة المراكز التي تصنع المخاطر. ومساهمة المخاطر للأصل i هي w_i * (cov @ w)_i / sigma_p: وزنه مضروبًا في شدة تحركه مع المحفظة كلها، مقسومًا على تقلب المحفظة sigma_p. وتجمع المساهمات تمامًا إلى sigma_p فتقسم الإجمالي إلى أجزاء. وقد يساهم أصل قليل الوزن عالي التغاير مع الباقي أكثر بكثير مما يوحي وزنه، وقد تساهم التحوطات مساهمة سالبة.

# Risk contributions of a three-asset portfolio: they add up to the volatility
import numpy as np

weights = np.array([0.5, 0.3, 0.2])
cov = np.array([[0.0400, 0.0060, 0.0100],
                [0.0060, 0.0100, 0.0020],
                [0.0100, 0.0020, 0.0225]])

variance = weights @ cov @ weights
contributions = weights * (cov @ weights) / np.sqrt(variance)
print(np.round(contributions, 4), round(float(contributions.sum()), 4))
print(round(float(np.sqrt(variance)), 4))
المُدخلات أهم من الصيغةالصيغ دقيقة، لكن mu وcov تقديرات، والتباين أوثق الاثنين: فالعوائد المتوقعة كثيرة الضجيج والتغايرات أقل بكثير. ويجب أن تشترك الأوزان وmu وcov في الفترة نفسها: ومن الأخطاء الشائعة تغاير يومي مع عوائد سنوية؛ يُضرب التباين في عدد الفترات والتقلب في جذره.
  • عائد المحفظة خطي: w @ mu. والتباين هو الصيغة التربيعية w @ cov @ w بـn * n حدًا وحدود متقاطعة تجعل ارتباطًا أقل من 1 يخفض المخاطر.
  • التقلب هو sqrt(variance * periods)؛ ويجب أن تطابق السنوية فترة cov.
  • مساهمات المخاطر w_i * (cov @ w)_i / sigma_p توزع التقلب بالضبط على الأصول؛ وقد يساهم التحوط بقيمة سالبة.

التالي: محفظة التباين الأدنى، اختيار الأوزان التي تجعل هذه المخاطر أصغر ما يمكن.

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

  • اجمع العائد المتوقع باستخدام portfolio_return25 نقطة
  • قِس المخاطر باستخدام portfolio_variance25 نقطة
  • اذكر التقلب باستخدام portfolio_vol25 نقطة
  • وزّع المخاطر على الأصول باستخدام risk_contributions25 نقطة
المستكشف · lab-83-1
▾ lab-83-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-83-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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