σμ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›الوحدة 4 · تسعير الدخل الثابت والخيارات›الموضوع 4.8·~55 دمتوسط

صيغة بلاك–شولز

الموضع في المسارالوحدة 4 من 11 · الموضوع 8 من 16
4.8 صيغة بلاك–شولز
—درجة المختبر— / 100إجمالي XP—التتابع—

صيغة لخيار

في عام 1973 بيّن بلاك وشولز أنه إذا اتبع السهم النموذج اللوغاريتمي الطبيعي بتقلب ثابت أمكن تكرار الخيار بتداول السهم وسند، فلا يعتمد سعره على مدى ترجيح المستثمرين للارتفاع. وسعر الكول الأوروبي هو S * N(d1) - K * exp(-rT) * N(d2): السهم الذي تتلقاه إن انتهى الخيار داخل النقود مرجّحًا برقم يشبه الاحتمال، ناقص سعر التنفيذ المخصوم الذي تدفعه مرجّحًا بالاحتمال المحايد للمخاطر N(d2) للتنفيذ. ويأتي البوت من التكافؤ.

d1 = (ln(S/K) + (r + sigma^2/2) T) / (sigma sqrt(T)) d2 = d1 - sigma sqrt(T) C = S N(d1) - K e^(-rT) N(d2)
import math

def norm_cdf(x):
    return 0.5 * (1 + math.erf(x / math.sqrt(2)))      # N(x): the probability that a standard normal is below x

print(round(norm_cdf(0.0), 4), round(norm_cdf(1.96), 4))      # 0.5 0.975

def d1_d2(spot, strike, rate, sigma, t):
    d1 = (math.log(spot / strike) + (rate + 0.5 * sigma ** 2) * t) / (sigma * math.sqrt(t))
    return d1, d1 - sigma * math.sqrt(t)

d1, d2 = d1_d2(100, 100, 0.05, 0.2, 1)
print(round(d1, 4), round(d2, 4))                               # 0.35 0.15

الكول والبوت

N هي دالة التوزيع الطبيعي المعياري التي تعطيها math.erf في بايثون بالصيغة 0.5 * (1 + erf(x / sqrt(2))). يجمع d1 وd2 بين الموقع ln(S/K) والانجراف والتقلب على عمر الخيار. وبهما: الكول = S * N(d1) - K * exp(-rT) * N(d2) والبوت = K * exp(-rT) * N(-d2) - S * N(-d1). لسعر فوري 100 وسعر تنفيذ 100 ومعدل 5% وتقلب 20% وسنة واحدة يكلّف الكول 10.45 والبوت 5.57، والفرق 4.88 هو بالضبط قيمة التكافؤ S - K * exp(-rT).

def bs_call(spot, strike, rate, sigma, t):
    d1, d2 = d1_d2(spot, strike, rate, sigma, t)
    return spot * norm_cdf(d1) - strike * math.exp(-rate * t) * norm_cdf(d2)

def bs_put(spot, strike, rate, sigma, t):
    d1, d2 = d1_d2(spot, strike, rate, sigma, t)
    return strike * math.exp(-rate * t) * norm_cdf(-d2) - spot * norm_cdf(-d1)

call, put = bs_call(100, 100, 0.05, 0.2, 1), bs_put(100, 100, 0.05, 0.2, 1)
print(round(call, 4), round(put, 4))                            # 10.4506 5.5735
print(round(call - put, 4), round(100 - 100 * math.exp(-0.05), 4))   # 4.8771 4.8771   put-call parity holds

ما الذي يحرّك السعر

خمسة مدخلات تحدد السعر. سعر تنفيذ أعلى يجعل الكول أرخص (80: 24.59 و100: 10.45 و120: 3.25). وتقلب أعلى يجعل الخيارين أغلى لأن زيادة الريبة تضيف صعودًا فقط لحامل الخيار (10%: 6.81 و20%: 10.45 و40%: 18.02). وزمن أطول حتى الاستحقاق يرفع السعر أيضًا (3 أشهر: 4.62 وسنة: 10.45 و4 سنوات: 25.21). لاحظ أن العائد المتوقع للسهم لا يظهر في الصيغة إطلاقًا: لا يلزم تقدير إلا التقلب، ولهذا كثيرًا ما تُعرض أسعار الخيارات المعلنة بصيغة تقلب.

for strike in (80, 100, 120):
    print("strike", strike, round(bs_call(100, strike, 0.05, 0.2, 1), 4))      # 24.5888, 10.4506, 3.2475
for sigma in (0.1, 0.2, 0.4):
    print("sigma", sigma, round(bs_call(100, 100, 0.05, sigma, 1), 4))         # 6.805, 10.4506, 18.023
for t in (0.25, 1, 4):
    print("t", t, round(bs_call(100, 100, 0.05, 0.2, t), 4))                   # 4.615, 10.4506, 25.2133
# Time value: the call is worth more than its intrinsic value (what it would pay if it expired today)
intrinsic = max(100 - 100 * math.exp(-0.05), 0)
print(round(intrinsic, 4), round(bs_call(100, 100, 0.05, 0.2, 1) - intrinsic, 4))     # 4.8771 5.5735   intrinsic value and time value
نموذج له افتراضاتيفترض بلاك-شولز تقلبًا ثابتًا وأسعارًا لوغاريتمية طبيعية بلا قفزات ولا أرباح موزعة وتنفيذًا أوروبيًا وتداولًا بلا احتكاكات. وتُظهر الأسواق الحقيقية تقلبًا يتغير مع سعر التنفيذ والتاريخ (ابتسامة التقلب) وقفزات وأطرافًا ثقيلة. ومع ذلك تبقى الصيغة اللغة المشتركة للسوق، ولهذا تُعلَن الأسعار بصيغة التقلب الضمني، موضوع درس لاحق.
  • N(x) = 0.5 * (1 + erf(x / sqrt(2))) وd1 = (ln(S/K) + (r + sigma²/2) T) / (sigma sqrt(T)) وd2 = d1 - sigma sqrt(T).
  • الكول = S N(d1) - K e^(-rT) N(d2)؛ البوت = K e^(-rT) N(-d2) - S N(-d1)؛ وفرقهما قيمة التكافؤ S - K e^(-rT).
  • ترتفع الأسعار مع التقلب والزمن وتنخفض مع سعر تنفيذ الكول؛ والعائد المتوقع للسهم غائب، يكفي التقلب.

التالي: دلتا، كم يتحرك سعر الخيار حين يتحرك السهم دولارًا واحدًا.

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

  • ابنِ الاحتمال التراكمي للجرس باستخدام norm_cdf25 نقطة
  • احسب كميتَي بلاك-شولز باستخدام d1_d225 نقطة
  • سعّر كولًا باستخدام bs_call25 نقطة
  • سعّر بوتًا باستخدام bs_put25 نقطة
المستكشف · lab-73-1
▾ lab-73-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-73-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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