σμ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.5·~50 دمتقدم

القيمة المعرّضة للخطر المعلمية

الموضع في المسارالوحدة 7 من 11 · الموضوع 5 من 9
7.5 القيمة المعرّضة للخطر المعلمية
—درجة المختبر— / 100إجمالي XP—التتابع—

صيغة بدل تاريخ

تقرأ القيمة التاريخية الخسارة من العوائد السابقة. أما القيمة المعلمية فتفترض أن العوائد تتبع توزيعًا طبيعيًا ولا تحتاج إلا رقمين، المتوسط والانحراف المعياري. فتكون الخسارة التي تُتجاوز باحتمال 1 - confidence هي z * sigma - mu حيث z كمّي التوزيع الطبيعي المعياري (1.645 عند 95% و2.326 عند 99%). وهي سريعة وملساء وتمتد بسهولة إلى محفظة كاملة، ولذلك كانت المعيار الصناعي لعقود.

from statistics import NormalDist

def normal_var(mu, sigma, confidence):
    z = NormalDist().inv_cdf(confidence)
    return z * sigma - mu

print(round(NormalDist().inv_cdf(0.95), 4), round(NormalDist().inv_cdf(0.99), 4))
print(round(normal_var(0.0005, 0.012, 0.95), 5))        # a 95% one-day loss limit
print(round(normal_var(0.0005, 0.012, 0.99), 5))        # a higher confidence, a larger limit
# The multiplier z for common confidence levels
from statistics import NormalDist

for confidence in (0.90, 0.95, 0.975, 0.99, 0.999):
    print(confidence, round(NormalDist().inv_cdf(confidence), 3))       # 1.282, 1.645, 1.96, 2.326, 3.09

من أصل إلى محفظة وإلى عشرة أيام

بالنسبة إلى محفظة، المتوسط هو weights @ mu والانحراف المعياري sqrt(weights @ cov @ weights)، وهما كميتا موضوع تباين المحفظة. ويظهر التنويع مباشرة: الارتباطات المنخفضة تقلص الانحراف والقيمة. ولأفق أطول ينمو المتوسط بعدد الأيام والانحراف بجذره، فتكون القيمة لعشرة أيام z * sigma * sqrt(10) - mu * 10.

import numpy as np
from statistics import NormalDist

def normal_var(mu, sigma, confidence):
    return NormalDist().inv_cdf(confidence) * sigma - mu

weights = np.array([0.6, 0.4])
mu = np.array([0.0005, 0.0003])
cov = np.array([[0.00016, 0.00004], [0.00004, 0.00009]])             # volatilities 1.26% and 0.95%, correlation 0.33

mean, std = float(weights @ mu), float(np.sqrt(weights @ cov @ weights))
print(round(mean, 5), round(std, 5))
print(round(normal_var(mean, std, 0.99), 5))
print(round(normal_var(mean * 10, std * np.sqrt(10), 0.99), 5))      # the 10-day figure

أين يفشل افتراض التوزيع الطبيعي

للعوائد الحقيقية ذيول سميكة: فالأيام المتطرفة أكثر تكرارًا بكثير مما يسمح به التوزيع الطبيعي. فتبدو القيمة المعلمية صغيرة جدًا، خصوصًا عند الثقة العالية. ومقارنتها بالقيمة التاريخية على البيانات نفسها تُظهر الفرق: الموجب يعني أن النموذج الطبيعي يقلل المخاطر. وعند 95% يتقارب الاثنان غالبًا، وعند 99% قد يختلفان كثيرًا.

# Fat-tailed returns: the normal model understates the 99% loss
import numpy as np
from statistics import NormalDist

rng = np.random.default_rng(2)
returns = rng.standard_t(3, size=5000) * 0.008           # a fat-tailed distribution (3 degrees of freedom)

for confidence in (0.95, 0.99):
    historical = -np.quantile(returns, 1 - confidence)
    parametric = NormalDist().inv_cdf(confidence) * returns.std(ddof=1) - returns.mean()
    print(confidence, round(float(historical), 5), round(float(parametric), 5), round(float(historical - parametric), 5))
اختر الطريقة بحسب السؤالالقيمة المعلمية مناسبة لرقم سريع أملس ولمحافظ المراكز الخطية. وهي دليل ضعيف للخيارات التي ليست عوائدها خطية في عوامل المخاطر وللذيول. وتحسب مكاتب كثيرة عدة قيم، معلمية وتاريخية ومونت كارلو، وتعدّ الخلاف الكبير تحذيرًا بشأن النموذج.
  • القيمة المعلمية = z * sigma - mu مع z = NormalDist().inv_cdf(confidence): يكفي المتوسط والانحراف المعياري.
  • تستخدم المحفظة weights @ mu وsqrt(weights @ cov @ weights)؛ والأفق يضرب المتوسط في days والتقلب في sqrt(days).
  • للعوائد الحقيقية ذيول سميكة: قارن بالقيمة التاريخية؛ والفرق الموجب يعني أن النموذج الطبيعي يقلل المخاطر.

التالي: العجز المتوقع، متوسط الخسارة في الأيام التي تُتجاوز فيها القيمة المعرضة للخطر.

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

  • حوّل رقمين إلى حد باستخدام normal_var25 نقطة
  • غطِّ محفظة كاملة باستخدام portfolio_normal_var25 نقطة
  • انظر أبعد باستخدام horizon_var25 نقطة
  • قِس الذيول السميكة باستخدام normality_gap25 نقطة
المستكشف · lab-97-1
▾ lab-97-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-97-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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