σμ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›الوحدة 11 · أنظمة الإنتاج والنماذج المتقدمة›الموضوع 11.9·~1 س 30 دخبير

نموذج SABR

الموضع في المسارالوحدة 11 من 11 · الموضوع 9 من 13
11.9 نموذج SABR
—درجة المختبر— / 100إجمالي XP—التتابع—

ابتسامة في أربعة أرقام

تُتداول خيارات الفائدة والصرف عبر سعور تنفيذ كثيرة وتحتاج المكاتب إلى طريقة ناعمة واعية بالمراجحة لاستيفاء التقلبات المعلنة واستقرائها. وSABR (هاغان وكومار ولسنيفسكي ووودوارد 2002) هو المعيار في السوق. وهو ينمذج سعرًا آجلًا F بتقلب عشوائي خاص alpha: dF = alpha F^beta dW وd alpha = nu alpha dZ بارتباط rho بين الصدمتين. وتشكّل أربعة معاملات ابتسامة استحقاق واحد: alpha تضبط المستوى العام وbeta كيف يعتمد التقلب على مستوى السعر (0 عادي و1 لوغاريتمي) وrho الميل (الانحياز) وnu الانحناء (مقدار ارتفاع الأطراف).

# The four parameters of one expiry, for a rate forward of 3%
f, t = 0.03, 1.0                              # forward rate and expiry in years
alpha, beta, rho, nu = 0.035, 0.5, -0.3, 0.4
print(round(alpha / f ** (1 - beta), 4))      # 0.2021   alpha / f^(1-beta) is roughly the at-the-money volatility (before the correction)

صيغة هاغان

يعطي منشور هاغان المقارب التقلب الضمني لبلاك دون محاكاة. عند السعر (K = F) يساوي alpha / F^(1-beta) مضروبًا في تصحيح زمني 1 + (...) * T حيث يجمع القوس ثلاثة أثار: انحناء beta للعمود الفقري وحد الانحياز rho * nu وحد الابتسامة nu^2. وبعيدًا عن السعر يضرب التصحيح نفسه عاملين آخرين: مقام في لوغاريتم السعرية L = ln(F/K) والنسبة z / chi(z) حيث z = (nu/alpha) (FK)^((1-beta)/2) L وchi(z) = ln((sqrt(1 - 2 rho z + z^2) + z - rho) / (1 - rho)). وحين يقترب z من 0 تؤول النسبة إلى 1 فتلتحم الصيغة بقيمة السعر بسلاسة، لكن حساب 0 / 0 مباشرة سيفشل: عامل z الضئيل كنهاية.

# The pieces of Hagan's formula: the time correction, the at-the-money volatility and z / chi(z)
import math

def sabr_correction(f, k, t, alpha, beta, rho, nu):
    fk = f * k
    return 1 + ((1 - beta) ** 2 / 24 * alpha ** 2 / fk ** (1 - beta) + rho * beta * nu * alpha / (4 * fk ** ((1 - beta) / 2)) + (2 - 3 * rho ** 2) * nu ** 2 / 24) * t

def sabr_atm_vol(f, t, alpha, beta, rho, nu):
    return alpha / f ** (1 - beta) * sabr_correction(f, f, t, alpha, beta, rho, nu)

def z_over_chi(z, rho):
    if abs(z) < 1e-7:
        return 1.0
    return z / math.log((math.sqrt(1 - 2 * rho * z + z ** 2) + z - rho) / (1 - rho))

print(round(sabr_atm_vol(0.03, 1.0, 0.035, 0.5, -0.3, 0.4), 6))      # 0.203877   the at-the-money volatility
print(round(z_over_chi(0.5, -0.3), 6), z_over_chi(0.0, -0.3))        # 1.103683 1.0   near 1, and exactly 1.0 at z = 0

قراءة الابتسامة ومعايرتها

ارسم التقلب الضمني مقابل سعر التنفيذ وستكون للمعاملات بصمات واضحة. فـrho سالب يرفع السعور المنخفضة ويخفض المرتفعة (انحياز هابط نموذجي للأسهم ولكثير من الفوائد)؛ وrho = 0 يعطي ابتسامة متناظرة. وnu أكبر يرفع الطرفين. وbeta يحرك العمود الفقري: مقدار تغير التقلب عند السعر حين يتحرك الآجل. ويثبّت الممارسون beta اصطلاحًا أو من التاريخ ثم يعايرون الباقي على التقلبات المعلنة لكل استحقاق (الموضوع التالي) وغالبًا يحلّون alpha من سعر عند السعر ليطابقه تمامًا. وتحذيران: الصيغة تقريب يتدهور للاستحقاقات الطويلة والسعور المنخفضة جدًا حيث قد تعني كثافات احتمال سالبة.

# The smile for three values of rho: a negative rho lifts the low strikes (downward skew)
import math

def sabr_vol(f, k, t, alpha, beta, rho, nu):
    fk = f * k
    log = math.log(f / k)
    mid = fk ** ((1 - beta) / 2)
    z = nu / alpha * mid * log
    ratio = 1.0 if abs(z) < 1e-7 else z / math.log((math.sqrt(1 - 2 * rho * z + z ** 2) + z - rho) / (1 - rho))
    denominator = mid * (1 + (1 - beta) ** 2 / 24 * log ** 2 + (1 - beta) ** 4 / 1920 * log ** 4)
    bracket = 1 + ((1 - beta) ** 2 / 24 * alpha ** 2 / fk ** (1 - beta) + rho * beta * nu * alpha / (4 * mid) + (2 - 3 * rho ** 2) * nu ** 2 / 24) * t
    return alpha / denominator * ratio * bracket

for rho in (-0.5, 0.0, 0.5):
    print(rho, [round(sabr_vol(0.03, k, 1.0, 0.035, 0.5, rho, 0.4), 4) for k in (0.02, 0.03, 0.04)])
# one line per rho: the first value (low strike) is the highest when rho is negative and the lowest when rho is positive
# A free sanity check: with beta = 1 and nu = 0 SABR is Black-Scholes, so the at-the-money volatility is alpha at every expiry
def atm(f, t, alpha, beta, rho, nu):
    fk = f * f
    bracket = 1 + ((1 - beta) ** 2 / 24 * alpha ** 2 / fk ** (1 - beta) + rho * beta * nu * alpha / (4 * fk ** ((1 - beta) / 2)) + (2 - 3 * rho ** 2) * nu ** 2 / 24) * t
    return alpha / f ** (1 - beta) * bracket

print(atm(100.0, 0.5, 0.2, 1.0, -0.3, 0.0), atm(100.0, 5.0, 0.2, 1.0, -0.3, 0.0))      # 0.2 0.2
تقريب له نقطة ضعف معروفةصيغة هاغان دقيقة قرب السعر وللاستحقاقات القصيرة لكنها قد تعطي أسعار فراشات سالبة عند السعور المنخفضة والاستحقاقات الطويلة، ما يعني مراجحة في الابتسامة المعايَرة. تحقق من التقلبات المعايَرة بتسعير الفراشات وقيّد مجالات المعاملات (rho ضمن -1 و1 بصرامة وnu ليست ضخمة) وأعد معايرة كل استحقاق على حدة وبسلاسة عبر الزمن. وللفوائد المنخفضة أو السالبة استعمل النسخة الطبيعية (باشيليه) من الصيغة التي لا تنهار قرب الصفر.
  • يعطي SABR كل استحقاق ابتسامة من أربعة معاملات: alpha (المستوى) وbeta (العمود الفقري) وrho (الانحياز) وnu (الانحناء).
  • صيغة هاغان = عامل أولي × z / chi(z) × تصحيح زمني؛ وعند السعر تؤول إلى alpha / F^(1-beta) مضروبًا في التصحيح، وتؤول z / chi(z) إلى 1 حين يؤول z إلى 0.
  • rho السالب يميل بالابتسامة إلى الأسفل، وnu الأكبر يرفع الطرفين؛ عايِر كل استحقاق على حدة وافحص المراجحة في الأطراف واستعمل النسخة الطبيعية قرب الفوائد الصفرية.

التالي: معايرة النماذج، مواءمة معاملات النموذج مع أسعار السوق.

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

  • أضف تصحيح الزمن باستخدام sabr_correction25 نقطة
  • اقرأ نقطة عند السعر باستخدام sabr_atm_vol25 نقطة
  • رَوِّض 0 / 0 في z_over_chi25 نقطة
  • ارسم الابتسامة باستخدام sabr_implied_vol25 نقطة
المستكشف · lab-138-1
▾ lab-138-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-138-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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