σμ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 AcademyParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Parcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Parcours Python›Module 4 · Valorisation des produits de taux et d'options›Sujet 4.3·~45 minIntermédiaire

Rendement à l'échéance

Position dans le parcoursModule 4 sur 11 · Sujet 3 sur 16
4.3 Rendement à l'échéance
—Score du lab— / 100XP total—Série—

Du prix retour au rendement

Sur le marché, une obligation est cotée par son prix, mais les investisseurs comparent les obligations par le rendement. Le rendement à l'échéance (YTM) est le taux d'actualisation unique pour lequel la valeur actuelle de tous les flux de l'obligation égale son prix : le rendement annualisé que vous obtenez si vous achetez maintenant, conservez jusqu'à l'échéance et que tous les paiements sont effectués. Pour une obligation à 10 ans cotée 925,61 avec un coupon de 5 %, il vaut 6 %. Contrairement au prix, le YTM n'a pas de formule fermée, car l'inconnue se trouve dans un polynôme de degré élevé.

import numpy as np

def bond_price(face, coupon_rate, ytm, years, freq=2):
    n = int(round(years * freq))
    times = np.arange(1, n + 1) / freq
    flows = np.full(n, face * coupon_rate / freq)
    flows[-1] += face
    return (flows / (1 + ytm / freq) ** (freq * times)).sum()

price = bond_price(1000, 0.05, 0.06, 10)
print(round(price, 4))                                       # 925.6126   the market price we pretend to observe

# A back-of-the-envelope yield: annual coupon plus the yearly share of the discount, over the average of price and par
coupon = 1000 * 0.05
print(round((coupon + (1000 - price) / 10) / ((1000 + price) / 2), 5))     # 0.05966   close to 6%, but not exact

Chercher : la dichotomie

Le prix baisse régulièrement quand le rendement monte, on peut donc chercher. Prenez un intervalle [low, high] qui contient sûrement la réponse (0 % à 100 %). Calculez le prix de l'obligation au milieu : si le prix est au-dessus de la cible, le rendement doit être plus élevé, donc remontez low au milieu ; sinon abaissez high. Chaque étape divise l'intervalle par deux ; 40 étapes le réduisent d'un facteur mille milliards. La dichotomie est lente comparée à d'autres méthodes, mais elle ne peut pas échouer tant que la réponse est dans l'intervalle, ce qui en fait le repli sûr.

low, high = 0.0, 1.0
for step in range(6):
    mid = (low + high) / 2
    price_mid = bond_price(1000, 0.05, mid, 10)
    print(step, round(mid, 5), round(price_mid, 2))
    if price_mid > price:      # priced too high: the yield must be higher
        low = mid
    else:
        high = mid
# 0 0.5 110.38
# 1 0.25 275.86
# 2 0.125 578.47
# 3 0.0625 908.08
# 4 0.03125 1159.97
# 5 0.04688 1024.72      the interval keeps shrinking around 6% (the target price is 925.61)

Chercher plus vite : Newton

La méthode de Newton utilise la pente. Posez f(y) = bond_price(y) - cible ; on veut f(y) = 0. À l'estimation courante, suivez la tangente jusqu'à zéro : y_new = y - f(y) / f'(y). La pente s'estime numériquement avec un pas minuscule h : (f(y + h) - f(y - h)) / (2h). Près de la réponse, le nombre de chiffres justes double à peu près à chaque étape : quatre ou cinq étapes suffisent là où la dichotomie en demande quarante. Newton peut échouer s'il démarre mal ou si la pente est plate ; gardez donc une limite d'étapes et repliez-vous sur la dichotomie s'il ne converge pas.

y, h = 0.05, 1e-6                            # start at the coupon rate
for step in range(5):
    f = bond_price(1000, 0.05, y) - price
    slope = (bond_price(1000, 0.05, y + h) - bond_price(1000, 0.05, y - h)) / (2 * h)
    print(step, round(y, 8), round(f, 6))
    y = y - f / slope
# 0 0.05 74.387374
# 1 0.05954347 3.245932
# 2 0.05999903 0.006916
# 3 0.06 0.0
# 4 0.06 0.0        converged to 6% after 3 steps
# Check the answer by pricing the bond at the yield we found
print(round(bond_price(1000, 0.05, y, 10), 4), round(price, 4))      # 925.6126 925.6126   the same price: the yield is right
Les rendements se comparent, pas les prixUn rendement à l'échéance suppose que vous pouvez réinvestir chaque coupon au même rendement et que l'émetteur paie en totalité : c'est une promesse, pas une prévision. Une obligation qui se négocie à un rendement très élevé est généralement une obligation dont le marché doute du remboursement. Comparez les rendements seulement entre obligations de risque et d'échéance similaires.
  • Le YTM est le taux d'actualisation qui égale la valeur actuelle de l'obligation à son prix ; il n'a pas de formule fermée, on le cherche donc.
  • Dichotomie : divisez sans cesse [low, high] par deux (prix au-dessus de la cible : montez low) ; lente mais sûre.
  • Newton : y = y - f / slope, avec une pente numérique ; il converge en quelques étapes mais demande une limite d'étapes et un bon départ.

À suivre : la duration et la convexité, mesurer la sensibilité du prix d'une obligation au rendement.

Lab : ce qui est noté

  • Estimer le rendement au dos d'une enveloppe avec approx_ytm25 pts
  • Trouver le rendement en divisant l'intervalle en deux avec bisect_yield25 pts
  • Trouver le rendement plus vite avec newton_yield25 pts
  • Nommer la situation de l'obligation avec classify_price25 pts
Explorateur · lab-68-1
▾ lab-68-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-68-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-68-1 revient aux fichiers de départ et le terminal est vidé. Votre solution actuelle sera perdue : cette action est irréversible.

Sera réinitialisé
  • main.py → code de départ
  • Historique du terminal et sortie des tests
  • Modifications non soumises
Sera conservé
  • Meilleur score du lab
  • Votre XP et votre série
  • Progression du cours et notes

Connectez-vous pour exécuter votre code.

Tous les cours sont gratuits à lire. Créez un compte ou connectez-vous pour exécuter du code, lancer les tests et soumettre ce lab.

  • IDE dans le navigateur avec terminal bash — rien à installer
  • Correction instantanée, XP et votre place dans le parcours
Créer un compteSe connecter
OU
Continuer avec GitHub