σμ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›الوحدة 8 · النماذج العشوائية والتعلم الآلي›الموضوع 8.7·~50 دمتقدم

متغيرات التحكم

الموضع في المسارالوحدة 8 من 11 · الموضوع 7 من 10
8.7 متغيرات التحكم
—درجة المختبر— / 100إجمالي XP—التتابع—

استخدام ما تعرفه أصلًا

عند محاكاة كول تحاكي أيضًا سعر السهم عند الانتهاء S_T الذي تعرف متوسطه الحقيقي S0 * exp(r * T) تمامًا. وفي عينتك خرج متوسط S_T منحرفًا قليلًا، لنقل مرتفعًا جدًا. ولأن مدفوع الكول وS_T يتحركان معًا فمتوسط عينة الكول مرتفع على الأرجح أيضًا. والمتغير الضابط يستغل ذلك: يطرح من تقدير المطلوب مضاعفًا للخطأ المرصود في الكمية المعروفة.

import numpy as np

rng = np.random.default_rng(1)
z = rng.standard_normal(2000)
s_t = 100.0 * np.exp((0.05 - 0.5 * 0.2 ** 2) + 0.2 * z)             # terminal prices
call = np.maximum(s_t - 100.0, 0.0)                                  # the payoff we want

known = 100.0 * np.exp(0.05)                                         # E[S_T], exactly
print(round(float(s_t.mean()), 3), round(known, 3))                  # the sample mean of S_T vs its true mean
print(round(float(s_t.mean() - known), 3))                           # the observed error of the control

أفضل مضاعف

كم من خطأ الضابط ينبغي أن تطرح؟ المضاعف b الذي يصغّر تباين payoff - b * control هو b = cov(payoff, control) / var(control)، وهو بالضبط ميل انحدار المدفوع على الضابط (المجاميع نفسها في بيتا موضوع CAPM). والتقدير المضبوط هو mean(payoff) - b * (mean(control) - known_mean). وهو غير متحيز لأن الحد المطروح توقعه صفر.

import numpy as np

def control_coefficient(payoff, control):
    dev = control - control.mean()
    return float(np.sum(dev * (payoff - payoff.mean())) / np.sum(dev ** 2))

rng = np.random.default_rng(1)
z = rng.standard_normal(2000)
s_t = 100.0 * np.exp((0.05 - 0.5 * 0.2 ** 2) + 0.2 * z)
call = np.maximum(s_t - 100.0, 0.0)
known = 100.0 * np.exp(0.05)

b = control_coefficient(call, s_t)
controlled = call.mean() - b * (s_t.mean() - known)
print(round(b, 4), round(float(call.mean()), 4), round(float(controlled), 4))       # the plain mean and the corrected one
# A payoff that is exactly proportional to the control is estimated without any error
import numpy as np

x = np.random.default_rng(2).standard_normal(50) + 5.0          # the control, known mean 5.0
y = 2.0 * x                                                      # the payoff
dev = x - x.mean()
b = np.sum(dev * (y - y.mean())) / np.sum(dev ** 2)
print(round(float(b), 6), round(float(y.mean() - b * (x.mean() - 5.0)), 6))      # 2.0 and exactly 10.0

كم من الخطأ يُوفَّر

العينات المعدلة payoff - b * control هي التي تحمل الضجيج، فالخطأ المعياري للتقدير المضبوط هو انحرافها المعياري (ddof=1) على sqrt(n). ومع ارتباط rho بين المدفوع والضابط ينخفض التباين بعامل 1 - rho^2: ارتباط 0.9 يزيل 81% منه و0.99 يزيل 98%. ولا يكلف الضابط محاكاة إضافية بل بضعة أسطر.

import numpy as np

def control_variate_error(payoff, control):
    dev = control - control.mean()
    b = np.sum(dev * (payoff - payoff.mean())) / np.sum(dev ** 2)
    return float((payoff - b * control).std(ddof=1) / np.sqrt(len(payoff)))

rng = np.random.default_rng(1)
z = rng.standard_normal(20000)
s_t = 100.0 * np.exp((0.05 - 0.5 * 0.2 ** 2) + 0.2 * z)
for strike in (80.0, 100.0, 120.0):
    call = np.maximum(s_t - strike, 0.0)
    plain = float(call.std(ddof=1) / np.sqrt(len(call)))
    print(strike, round(plain, 4), round(control_variate_error(call, s_t), 4), round(plain / control_variate_error(call, s_t), 2))
الضابط الجيد مرتبط ومعروفالشرطان مهمان. يجب أن يتحرك الضابط مع المدفوع (وإلا كانت b قرب 0 ولا مكسب) وأن يكون متوسطه الدقيق معروفًا (وإلا كان التصحيح تخمينًا). ومن الضوابط الجيدة للمتوسط الحسابي في الخيار الآسيوي المتوسط الهندسي الذي لسعره صيغة، أو سعر الانتهاء نفسه. ويمكن استخدام عدة ضوابط معًا وتأتي المعاملات حينئذ من انحدار متعدد.
  • المتغير الضابط كمية محاكاة معروف متوسطها؛ يُطرح من التقدير مضاعف لخطئه المرصود: mean(Y) - b * (mean(X) - E[X]).
  • أفضل مضاعف هو ميل الانحدار b = cov(Y, X) / var(X)؛ والخطأ هو الانحراف المعياري لـY - b * X على sqrt(n).
  • ينخفض التباين بـ1 - rho^2؛ والضابط الجيد شديد الارتباط بالمدفوع ومتوسطه معروف تمامًا ولا يكلف محاكاة إضافية.

التالي: خطوط scikit-learn للعوائد، ملاءمة النماذج التنبؤية وتقييمها على بيانات العوائد.

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

  • اختر المضاعف الصحيح باستخدام control_coefficient25 نقطة
  • صحّح التقدير باستخدام control_variate_estimate25 نقطة
  • قلّص هامش الخطأ باستخدام control_variate_error25 نقطة
  • احسب المكسب باستخدام error_reduction25 نقطة
المستكشف · lab-108-1
▾ lab-108-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-108-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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