σμ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.7·~40 دمتوسط

تكافؤ الشراء والبيع (Put-Call)

الموضع في المسارالوحدة 4 من 11 · الموضوع 7 من 16
4.7 تكافؤ الشراء والبيع (Put-Call)
—درجة المختبر— / 100إجمالي XP—التتابع—

طريقان إلى المكان نفسه

ابنِ محفظتين. أ: اشترِ كولًا وضع في البنك (أو سند خالٍ من المخاطر) القيمة الحالية لسعر التنفيذ K * exp(-rT). ب: اشترِ بوتًا واشترِ السهم. عند الاستحقاق إن انتهى السهم فوق K فالمحفظة أ هي S - K من الكول زائد K من البنك أي S؛ والمحفظة ب هي السهم S وبوت بلا قيمة أي S. وإن انتهى دون K فالمحفظة أ هي K البنك فقط لأن الكول ينتهي بلا قيمة، والمحفظة ب هي K - S من البوت زائد السهم S أي K. وفي الحالتين تتساوى قيمة المحفظتين عند الاستحقاق، فيجب أن تتساوى كلفتهما اليوم.

C + K * exp(-r*T) = P + S so P = C - S + K * exp(-r*T)
import math

spot, strike, rate, t = 100, 100, 0.05, 1
pv_strike = strike * math.exp(-rate * t)             # what must be put in the bank today to own K at expiry
print(round(pv_strike, 4))                            # 95.1229

call = 10.4506                                        # a call price we observe
put = call - spot + pv_strike                         # the parity relation
print(round(put, 4))                                  # 5.5735
print(round(put + spot - pv_strike, 4))               # 10.4506   and back to the call

حين ينكسر التكافؤ: المراجحة

إن عرض السوق أسعارًا لا تحقق العلاقة فثمة ربح بلا مخاطر. عرّف الفجوة (C - P) - (S - K e^(-rT)). الفجوة الموجبة تعني أن الكول غالٍ قياسًا إلى البوت: بِع الكول واشترِ البوت واشترِ السهم واقترض القيمة الحالية لسعر التنفيذ. تكلفة المحفظة صفر في البداية ولا تدفع شيئًا عند الاستحقاق مهما فعل السهم، وتجني الفجوة اليوم. والفجوة السالبة تعكس كل ساق. وللأسواق الحقيقية تكاليف وفروق شراء-بيع فلا يمكن تداول الفجوات الصغيرة: وهذا ما يمثله التفاوت.

def parity_gap(call, put, spot, strike, rate, t):
    return (call - put) - (spot - strike * math.exp(-rate * t))

print(round(parity_gap(11.0, put, 100, 100, 0.05, 1), 4))         # 0.5494   the call at 11.00 is too expensive: sell it
print(round(parity_gap(call, put, 100, 100, 0.05, 1), 4))         # 0.0      consistent prices: nothing to do

def arbitrage_action(call, put, spot, strike, rate, t, tolerance=0.01):
    gap = parity_gap(call, put, spot, strike, rate, t)
    if gap > tolerance:
        return "sell call, buy put, buy stock"
    if gap < -tolerance:
        return "buy call, sell put, sell stock"
    return "none"

print(arbitrage_action(11.0, put, 100, 100, 0.05, 1))             # sell call, buy put, buy stock
# The package of the arbitrage, at today's prices: sell the call at 11, buy the put, buy the stock, borrow the strike's present value
cash_today = 11.0 - put - 100 + 100 * math.exp(-0.05 * 1)
print(round(cash_today, 4))                # 0.5494   you are paid the gap now and owe nothing at expiry
# A call minus a put is a synthetic forward: it behaves like the stock bought with borrowed money
print(round(10.4506 - put, 4), round(100 - pv_strike, 4))        # 4.8771 4.8771
التكافؤ لا يعتمد على نموذجلا يحتاج تكافؤ الكول والبوت إلى أي افتراض عن حركة السهم أو التقلب، بل إلى انعدام المراجحة والتنفيذ الأوروبي (دون تنفيذ مبكر). وهذا يجعله فحصًا قويًا: نموذج تسعير يخرق التكافؤ نموذج خاطئ. والخيارات الأمريكية والأرباح الموزعة تغيّر العلاقة فتصير متباينات فقط، فاطرح القيمة الحالية للأرباح من السعر الفوري قبل استخدامها.
  • C + K * exp(-rT) = P + S: كول زائد السند يساوي بوتًا زائد السهم، فـ P = C - S + K * exp(-rT).
  • فجوة (C - P) - (S - K e^(-rT)) موجبة: بِع الكول واشترِ البوت والسهم؛ سالبة: العكس.
  • التكافؤ لا يعتمد على نموذج، فاستخدمه فحصًا لأي نموذج تسعير؛ ومع الأرباح أو التنفيذ المبكر يصير متباينة.

التالي: صيغة بلاك-شولز، سعر بصيغة مغلقة للكول والبوت.

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

  • استنتج البوت من الكول باستخدام parity_put_price25 نقطة
  • استنتج الكول من البوت باستخدام parity_call_price25 نقطة
  • قِس بُعد الأسعار عن التكافؤ باستخدام parity_gap25 نقطة
  • سمِّ الصفقة الخالية من المخاطر باستخدام arbitrage_action25 نقطة
المستكشف · lab-72-1
▾ lab-72-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-72-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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