σμ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 AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 4 · Bewertung von Anleihen und Optionen›Thema 4.5·~50 Min.Mittelstufe

Zinskurven und Interpolation

Position in der SkillModul 4 von 11 · Thema 5 von 16
4.5 Zinskurven und Interpolation
—Lab-Punkte— / 100XP gesamt—Serie—

Ein Zins pro Laufzeit

Bisher zinste eine einzige Rendite alle Zahlungen einer Anleihe ab. In Wirklichkeit bringt für 6 Monate, 2 Jahre und 10 Jahre verliehenes Geld unterschiedliche Zinsen, und das Muster über die Laufzeiten ist die Zinskurve. Ein Nullkuponzins ist der Jahreszins für eine einzelne Zahlung an einem bestimmten Termin ohne Zwischenkupons. Meist steigt die Kurve mit der Laufzeit (Anleger wollen mehr für längeres Warten), sie kann aber flach oder invers sein, wenn kurze Zinsen die langen übersteigen, was Märkte als Warnsignal für das Wachstum lesen.

import numpy as np

maturities = np.array([0.5, 1, 2, 5, 10, 30])                      # years where the market quotes a rate
rates = np.array([0.040, 0.042, 0.045, 0.048, 0.050, 0.052])       # an upward-sloping curve

# The rate at 3 years is not quoted: interpolate linearly between 2 years (4.5%) and 5 years (4.8%)
print(float(np.interp(3, maturities, rates)))                        # 0.046
print(np.interp([0.25, 7, 40], maturities, rates).tolist())          # [0.04, 0.0488, 0.052]   flat outside the quoted range

Abzinsungsfaktoren und Terminzins

Ein Nullkuponzins r für die Laufzeit t ergibt den Abzinsungsfaktor (1 + r) ** -t: was eine bei t gezahlte Einheit heute wert ist. Die Kurve verbirgt auch Erwartungen. Zwei Jahre zu 4,5 % anzulegen muss dem entsprechen, ein Jahr zu 4,2 % anzulegen und dann ein weiteres Jahr zu einem vereinbarten Satz f: (1 + 4,5 %)² = (1 + 4,2 %)(1 + f), also f = 4,80 %. Dieser Terminzins ist der Break-even-Satz des zweiten Jahres, heute festgelegt. Allgemein gilt f = ((1 + r2) ** t2 / (1 + r1) ** t1) ** (1 / (t2 - t1)) - 1.

def discount_factor(rate, t):
    return (1 + rate) ** -t

print(round(float(discount_factor(0.045, 2)), 5))                  # 0.91573   one unit paid in 2 years

r1, t1, r2, t2 = 0.042, 1, 0.045, 2
forward = ((1 + r2) ** t2 / (1 + r1) ** t1) ** (1 / (t2 - t1)) - 1
print(round(forward, 5))                                            # 0.04801   the rate for year 2, implied by the curve
print(round((1 + r1) ** t1 * (1 + forward) ** (t2 - t1), 5), round((1 + r2) ** t2, 5))   # 1.09 1.09   both routes agree

Auf der ganzen Kurve bewerten

Die Bewertung mit einer einzigen Rendite behandelt eine Zahlung in 1 Jahr und eine in 10 Jahren gleich. Der Kurvenansatz ist treuer: Lesen Sie für jede Zahlung den Nullkuponzins ihres eigenen Termins ab (bei Bedarf interpoliert), wandeln Sie ihn in einen Abzinsungsfaktor um und summieren Sie Zahlung * Faktor. Zwei Anleihen mit denselben Zahlungen müssen unabhängig von ihren quotierten Renditen denselben Preis haben, so bewerten Banken Anleihen zu Marktwerten. Für eine 3-jährige 5-%-Anleihe auf unserer Kurve beträgt der Preis 1011,25, gegenüber 1010,98 bei flachen 4,6 %: hier nah beieinander, weil die Kurve sanft ist, doch verschiedene Anleihen reagieren unterschiedlich, wenn sich die Kurve verdreht.

times = np.array([1.0, 2.0, 3.0])
flows = np.array([50.0, 50.0, 1050.0])                              # a 3-year 5% bond with annual coupons

zero = np.interp(times, maturities, rates)
print(zero.tolist())                                                 # [0.042, 0.045, 0.046]
print((discount_factor(zero, times)).round(5).tolist())              # [0.95969, 0.91573, 0.87379]
print(round(float((flows * discount_factor(zero, times)).sum()), 4))   # 1011.2462   on the curve
print(round(float((flows / 1.046 ** times).sum()), 4))               # 1010.9752   with one flat 4.6% instead
# The forward rates between the quoted maturities, in one array expression
t = np.array([1.0, 2.0, 5.0])
r = np.array([0.042, 0.045, 0.048])
forwards = ((1 + r[1:]) ** t[1:] / (1 + r[:-1]) ** t[:-1]) ** (1 / np.diff(t)) - 1
print(forwards.round(5).tolist())       # [0.04801, 0.05]   year 2 and years 3 to 5: an upward-sloping curve implies rising forwards
Interpolation ist eine ModellierungsentscheidungDie lineare Interpolation von Nullkuponzinsen ist die einfachste Regel, aber nicht die einzige: Praktiker interpolieren auch Logarithmen der Abzinsungsfaktoren oder nutzen Splines, und die Wahl ändert Terminzinsen und Preise zwischen den notierten Punkten. Jenseits der letzten notierten Laufzeit hält np.interp den Satz flach, was eine Konvention und keine Tatsache ist. Nennen Sie die Methode, wann immer Sie eine Kurve veröffentlichen.
  • Eine Zinskurve ist der Nullkuponzins je Laufzeit; fehlende Laufzeiten liest man per Interpolation (np.interp, außerhalb flach).
  • Abzinsungsfaktor (1 + r) ** -t; Terminzins ((1 + r2) ** t2 / (1 + r1) ** t1) ** (1 / (t2 - t1)) - 1.
  • Preis = Summe aus Zahlung * Abzinsungsfaktor, jede Zahlung zum Nullkuponzins ihres Termins; nennen Sie die Interpolationsmethode.

Als Nächstes: Optionsauszahlungen, was ein Call oder Put bei Fälligkeit zahlt, der Ausgangspunkt der Optionsbewertung.

Lab: Was bewertet wird

  • Mit interpolate_rate einen Satz zwischen den notierten Laufzeiten ablesen25 Pkt.
  • Mit discount_factor einen Zins in einen Abzinsungsfaktor umrechnen25 Pkt.
  • Mit forward_rate den in der Kurve versteckten künftigen Zins ablesen25 Pkt.
  • Mit price_on_curve einen Zahlungsstrom auf der ganzen Kurve bewerten25 Pkt.
Explorer · lab-70-1
▾ lab-70-1
…
bash · im Browser
learner@quantcraft:~/lab-70-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-70-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub