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

مبرهنة إيتو

الموضع في المسارالوحدة 8 من 11 · الموضوع 3 من 10
8.3 مبرهنة إيتو
—درجة المختبر— / 100إجمالي XP—التتابع—

قاعدة سلسلة فيها مأزق

لو كانت S دالة ملساء في الزمن لكان تغير f(S) هو f'(S) * dS أي قاعدة السلسلة العادية. لكن dS يحتوي dW، و(dW)^2 = dt لا يُهمل: فهو من رتبة dt نفسها. وبتفكيك f(S + dS) إلى الرتبة الثانية يبقى الحد 0.5 * f''(S) * (dS)^2 ويساوي (dS)^2 = sigma^2 * S^2 * dt. هذا الحد الإضافي هو مبرهنة إيتو، الأداة الرئيسة لاشتقاق أسعار الخيارات.

def ito_drift(s, mu, sigma, f_t, f_s, f_ss):
    return f_t + mu * s * f_s + 0.5 * sigma ** 2 * s ** 2 * f_ss

# f(S) = S: the drift is just mu * S (no curvature, no extra term)
print(ito_drift(100.0, 0.08, 0.2, 0.0, 1.0, 0.0))             # 8.0
# f(S) = S squared: f_S = 2 S and f_SS = 2, so the curvature term appears
print(ito_drift(100.0, 0.08, 0.2, 0.0, 2 * 100.0, 2.0))        # 1600 + 400 = 2000.0
# The drift for several functions of the price, S = 100, mu = 8%, sigma = 20%
def ito_drift(s, mu, sigma, f_t, f_s, f_ss):
    return f_t + mu * s * f_s + 0.5 * sigma ** 2 * s ** 2 * f_ss

s, mu, sigma = 100.0, 0.08, 0.2
print("S      ", ito_drift(s, mu, sigma, 0.0, 1.0, 0.0))                  # 8.0
print("S^2    ", ito_drift(s, mu, sigma, 0.0, 2 * s, 2.0))                # 2000.0
print("S^3    ", ito_drift(s, mu, sigma, 0.0, 3 * s ** 2, 6 * s))         # 240000 + 120000 = 360000.0
print("sqrt(S)", round(ito_drift(s, mu, sigma, 0.0, 0.5 / s ** 0.5, -0.25 / s ** 1.5), 4))    # 0.35 : curvature pulls it down

لوغاريتم السعر وسيغما تربيع على اثنين

لنطبق المبرهنة على f = ln S. هنا f_t = 0 وf_S = 1/S وf_SS = -1/S^2 فالانجراف mu - 0.5 * sigma^2 والانتشار sigma: d ln S = (mu - sigma^2/2) dt + sigma dW. فلوغاريتم السعر حركة براونية حسابية، ولهذا بالضبط يحمل حل الحركة الهندسية mu - sigma^2/2 في الأس. وتحدب exp وتقعر ln وجهان لحقيقة واحدة.

def ito_drift(s, mu, sigma, f_t, f_s, f_ss):
    return f_t + mu * s * f_s + 0.5 * sigma ** 2 * s ** 2 * f_ss

def log_drift(mu, sigma):
    s = 1.0                                        # the answer does not depend on s
    return ito_drift(s, mu, sigma, 0.0, 1.0 / s, -1.0 / s ** 2)

print(log_drift(0.08, 0.20))                       # 0.06   = 0.08 - 0.5 * 0.2**2
print(round(log_drift(0.08, 0.60), 4))             # -0.1   a high volatility makes the typical growth negative

التحقق من المبرهنة بالمحاكاة

لا حاجة لتصديق المبرهنة على الثقة. خذ حركات عشوائية كثيرة بخطوة واحدة s_new = s + mu * s * dt + sigma * s * sqrt(dt) * z واحسب f(s_new) - f(s) لدالة f وخذ المتوسط واقسم على dt. تتقارب النتيجة إلى الانجراف الذي تعطيه المبرهنة. ومع f = S^2 وإهمال حد التقعر تختلف المحاكاة بوضوح، وهذا أفضل ما يبين أن الحد الإضافي حقيقي.

import numpy as np

def mean_change_estimate(f, s, mu, sigma, dt, z):
    s_new = s + mu * s * dt + sigma * s * np.sqrt(dt) * z
    return float(np.mean(f(s_new) - f(s)) / dt)

half = np.random.default_rng(1).standard_normal(200_000)
z = np.concatenate([half, -half])                 # pairs of opposite draws: the noise at first order cancels
estimate = mean_change_estimate(lambda x: x ** 2, 100.0, 0.08, 0.2, 0.001, z)
print(round(estimate))                                       # about 2000
print(round(0.08 * 100.0 * 2 * 100.0))                       # 1600  the ordinary chain rule alone: the curvature term (400) is missing
لماذا يهم الخياراتلتسعير خيار تُطبَّق المبرهنة على قيمته V(S, t). ويحتوي الانجراف V_t وmu * S * V_S و0.5 * sigma^2 * S^2 * V_SS؛ والتحوط بدلتا يزيل حد dW فتبقى معادلة بلاك-شولز التي فيها يونانيات المواضيع السابقة: ثيتا ودلتا وغاما. ويحل المعدل الخالي من المخاطر محل mu ويختفي العائد المتوقع للسهم من السعر.
  • مبرهنة إيتو: انجراف f(S, t) هو f_t + mu * S * f_S + 0.5 * sigma^2 * S^2 * f_SS ومعامل الضجيج sigma * S * f_S.
  • حد التقعر موجود لأن (dW)^2 = dt؛ وفي ln S يعطي الانجراف mu - sigma^2 / 2 لحل الحركة الهندسية.
  • تحقق بالمحاكاة: متوسط f(s_new) - f(s) على dt يطابق المبرهنة؛ وعند تطبيقها على قيمة خيار تعطي بلاك-شولز.

التالي: الخيارات الآسيوية، التي يعتمد مدفوعها على متوسط السعر طوال عمر الخيار.

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

  • اعثر على انجراف دالة باستخدام ito_drift25 نقطة
  • اعثر على معامل الضجيج باستخدام ito_diffusion25 نقطة
  • طبّقه على لوغاريتم السعر باستخدام log_drift25 نقطة
  • تحقق بالمحاكاة باستخدام mean_change_estimate25 نقطة
المستكشف · lab-104-1
▾ lab-104-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-104-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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