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

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

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

حد للخسارة بمستوى ثقة

تجيب القيمة المعرضة للخطر عن: كم قد أخسر في يوم سيئ، لا في الأسوأ؟ ومعنى قيمة معرضة للخطر ليوم واحد بثقة 95% قدرها 2% أن الخسارة لا ينبغي أن تتجاوز 2% في 95 يومًا من كل 100. والطريقة التاريخية لا تحتاج نموذجًا. نأخذ العوائد السابقة ونرتبها ونقرأ الخسارة عند المئين الخامس: القيمة هي سالب ذلك الكمّي. وتستخدمها الجهات الرقابية وحدود المخاطر في كل مكان لأنها رقم واحد يقارنه المدير بحد.

import numpy as np

rng = np.random.default_rng(3)
returns = rng.normal(0.0004, 0.012, size=500)           # two years of daily returns

var_95 = -np.quantile(returns, 0.05)                    # minus the 5th percentile
var_99 = -np.quantile(returns, 0.01)
print(round(float(var_95), 5), round(float(var_99), 5))  # 0.01928 0.027  the 99% loss limit is larger

اختبار القيمة المعرضة للخطر: التجاوزات

القيمة المعرضة للخطر تنبؤ، لذا يمكن فحصها. والتجاوز هو يوم تجاوزت فيه الخسارة القيمة، return < -VaR. ومع ثقة 95% يُتوقع أن يكون نحو 5% من الأيام تجاوزات: أكثر بكثير يعني أن النموذج يقلل المخاطر، وأقل بكثير يعني أنه حذر جدًا. وتعدّ الجهات الرقابية التجاوزات على 250 يومًا لهذا السبب بالذات. لاحظ المتراجحة الصارمة: الخسارة المساوية للقيمة ليست تجاوزًا.

import numpy as np

rng = np.random.default_rng(3)
returns = rng.normal(0.0004, 0.012, size=500)
var_95 = -np.quantile(returns, 0.05)

exceptions = int(np.sum(returns < -var_95))
print(exceptions, "exceptions in", len(returns), "days; expected about", int(0.05 * len(returns)))     # 25 25

آفاق أطول، وكما حدث

كثيرًا ما يُطلب ما يقيس 10 أيام. ومع عوائد يومية مستقلة يزداد التقلب بجذر الزمن، فتحجِّم قاعدة جذر الزمن: VaR_T = VaR_1 * sqrt(T). وهي تقريب أضعف مع الذيول السميكة والعوائد المترابطة ذاتيًا. وتحترم الاختبارات الأمينة الزمن أيضًا: فالقيمة المستخدمة في اليوم t لا تستخدم إلا عوائد ما قبل اليوم t، وهو الانضباط نفسه لتجنب النظر إلى المستقبل. والقيمة المتحركة تفعل ذلك بنافذة من آخر n يوم.

# The square-root-of-time rule for several horizons
import math

one_day = 0.0186
for days in (1, 5, 10, 20):
    print(days, round(one_day * math.sqrt(days), 4))        # 1: 0.0186, 5: 0.0416, 10: 0.0588, 20: 0.0832
import numpy as np

def historical_var(returns, confidence):
    return float(-np.quantile(returns, 1 - confidence))

def rolling_var(returns, window, confidence):
    out = np.full(len(returns), np.nan)
    for t in range(window, len(returns)):
        out[t] = historical_var(returns[t - window:t], confidence)      # the days BEFORE day t
    return out

rng = np.random.default_rng(3)
returns = rng.normal(0.0004, 0.012, size=500)
rolling = rolling_var(returns, 250, 0.99)
print(np.isnan(rolling[:250]).all(), round(float(rolling[250]), 5), round(float(rolling[-1]), 5))
exceptions = int(np.sum(returns[250:] < -rolling[250:]))
print(exceptions, "exceptions in", len(returns) - 250, "days (about 2 expected at 99%)")
print(round(historical_var(returns, 0.99) * np.sqrt(10), 5))                 # a 10-day figure by the square-root rule
ما لا تخبرك به القيمة المعرضة للخطرالقيمة المعرضة للخطر عتبة لا أسوأ حالة: فهي لا تقول شيئًا عن مدى سوء الخسائر بعدها، ولهذا تتناول المواضيع التالية العجز المتوقع واختبارات الضغط. والطريقة التاريخية بقدر جودة نافذتها: فسنتان هادئتان تعطيان قيمة صغيرة قبيل أزمة، ورقم 99% يقوم على حفنة من المشاهدات فقط.
  • القيمة المعرضة التاريخية هي سالب الكمّي (1 - confidence) من العوائد السابقة (np.quantile): نسبة خسارة موجبة بلا نموذج.
  • اختبر بعدّ التجاوزات (return < -VaR): نحو 1 - confidence من الأيام؛ والأكثر يعني أن القيمة أدنى من اللازم.
  • حجِّم إلى أفق بـ var * sqrt(days)؛ والنافذة المتحركة لا تستخدم إلا الأيام السابقة؛ والقيمة تعطي عتبة لا حجم الخسائر بعدها.

التالي: القيمة المعرضة المعلمية، حساب العتبة نفسها من توزيع طبيعي بدل التاريخ الخام.

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

  • اقرأ الخسارة من التاريخ باستخدام historical_var25 نقطة
  • عُد حالات التجاوز باستخدام var_exceptions25 نقطة
  • مدّد الأفق باستخدام scale_var25 نقطة
  • قدّرها كما حدثت باستخدام rolling_var25 نقطة
المستكشف · lab-96-1
▾ lab-96-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-96-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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