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

أسعار السندات

الموضع في المسارالوحدة 4 من 11 · الموضوع 2 من 16
4.2 أسعار السندات
—درجة المختبر— / 100إجمالي XP—التتابع—

السند سلسلة وعود

السند قرض مقسّم إلى قطع قابلة للتداول. يعد المُصدِر بـقسيمة ثابتة كل فترة والقيمة الاسمية (par) عند الاستحقاق. سند لعشر سنوات قيمته الاسمية 1000 وقسيمته 5% تُدفع مرتين في السنة يعد بـ 25 كل ستة أشهر و1000 إضافية مع الدفعة الأخيرة. وسعره هو قيمة هذه الوعود اليوم: القيمة الحالية للتدفقات مخصومة بـالعائد الذي يطلبه السوق حاليًا لهذه المخاطرة وهذا الاستحقاق.

import numpy as np

def bond_cashflows(face, coupon_rate, years, freq):
    n = int(round(years * freq))                       # number of payments
    times = np.arange(1, n + 1) / freq                 # in years: 0.5, 1.0, 1.5, ...
    flows = np.full(n, face * coupon_rate / freq)      # a coupon each time
    flows[-1] += face                                  # and the face value with the last one
    return times, flows

times, flows = bond_cashflows(1000, 0.05, 2, 2)        # a 2-year bond, to keep the output short
print(times.tolist())    # [0.5, 1.0, 1.5, 2.0]
print(flows.tolist())    # [25.0, 25.0, 25.0, 1025.0]

السعر والعائد يتحركان في اتجاهين متعاكسين

اخصم كل تدفق عند (1 + ytm / freq) ** (freq * time) واجمعها. حين يساوي العائد معدل القسيمة تساوي قيمة السند قيمته الاسمية تمامًا (يُتداول عند القيمة الاسمية). وإذا ارتفعت عوائد السوق فوق القسيمة تدفع السندات الجديدة أكثر من هذا السند فينخفض سعره دون القيمة الاسمية (خصم)؛ وإذا انخفضت العوائد يُتداول بـعلاوة. إنها الآلية نفسها في الموضوع السابق لكن بتواريخ دفع حقيقية. والعائد الجاري، القسيمة السنوية على السعر، مقياس سريع لكنه ناقص لأنه يتجاهل الربح أو الخسارة عند الاستحقاق.

def bond_price(face, coupon_rate, ytm, years, freq=2):
    times, flows = bond_cashflows(face, coupon_rate, years, freq)
    return (flows / (1 + ytm / freq) ** (freq * times)).sum()

for ytm in (0.03, 0.05, 0.06, 0.08):
    print(ytm, round(bond_price(1000, 0.05, ytm, 10), 2))
# 0.03 1171.69   yield below the coupon: premium
# 0.05 1000.0    yield = coupon: par
# 0.06 925.61    yield above the coupon: discount
# 0.08 796.15

print(round(50 / bond_price(1000, 0.05, 0.06, 10), 5))    # 0.05402   current yield: 5.40%, not the 6% yield to maturity

السندات الأطول تتفاعل أكثر

يعتمد التغير النسبي في السعر لحركة معينة في العائد على الاستحقاق. فالدفعات البعيدة تُخصم بقوة عالية فهي شديدة الحساسية للمعدل. يخسر سند لسنة نحو 1% حين ترتفع العوائد نقطة، ولعشر سنوات نحو 7%، ولثلاثين سنة قرابة 14%. ولهذا يتحدث مستثمرو السندات عن مخاطر سعر الفائدة، ولهذا تبني الموضوعات التالية مقاييس (العائد حتى الاستحقاق والمدة) لقياسها.

for years in (1, 5, 10, 30):
    change = bond_price(1000, 0.05, 0.06, years) / 1000 - 1     # the coupon is 5%, the yield rises to 6%
    print(years, round(change, 4))
# 1 -0.0096
# 5 -0.0427
# 10 -0.0744
# 30 -0.1384
# The same 6% yield with annual, semiannual and monthly coupons: the quoting convention matters a little
for freq in (1, 2, 12):
    print(freq, round(bond_price(1000, 0.05, 0.06, 10, freq), 2))
# 1 926.4
# 2 925.61
# 12 924.94
العوائد المعلنة تتبع اصطلاحًاعائد 6% مع قسائم نصف سنوية ليس معدلًا سنويًا فعليًا بنسبة 6%: فهو يتراكب مرتين في السنة فمعدله الفعلي 6.09%. اذكر دائمًا المراكبة (freq) بجانب العائد. وللسندات الحقيقية أيضًا فائدة مستحقة بين تواريخ القسائم واصطلاحات احتساب الأيام، وهذا المختبر يتجاهلها بالتسعير في تواريخ القسائم.
  • السعر = مجموع flow / (1 + ytm / freq) ** (freq * time)؛ قسيمة كل فترة والقيمة الاسمية مع الأخيرة.
  • العائد = معدل القسيمة: السعر = القيمة الاسمية؛ العائد فوق القسيمة: خصم؛ تحتها: علاوة. السعر والعائد يتحركان بعكس بعضهما.
  • كلما طال الاستحقاق زاد تغير السعر لنفس حركة العائد: وهذه مخاطر سعر الفائدة التي تقيسها المدة لاحقًا.

التالي: العائد حتى الاستحقاق، في الاتجاه المعاكس: من سعر السوق إلى العائد.

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

  • اذكر دفعات السند باستخدام bond_cashflows25 نقطة
  • اخصم الدفعات للوصول إلى سعر باستخدام bond_price25 نقطة
  • قارن القسيمة بالسعر باستخدام current_yield25 نقطة
  • شاهد أثر تحرك العائد باستخدام price_change25 نقطة
المستكشف · lab-67-1
▾ lab-67-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-67-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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