σμ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.7·~40 minIntermédiaire

Parité call-put

Position dans le parcoursModule 4 sur 11 · Sujet 7 sur 16
4.7 Parité call-put
—Score du lab— / 100XP total—Série—

Deux chemins vers le même endroit

Construisez deux portefeuilles. A : achetez un call et placez à la banque (ou en obligation sans risque) la valeur actuelle du prix d'exercice K * exp(-rT). B : achetez un put et achetez l'action. À l'échéance, si l'action termine au-dessus de K, A vaut le S - K du call plus le K de la banque, soit S ; B vaut l'action S et un put sans valeur, soit S. Si l'action termine sous K, A ne vaut que le K de la banque puisque le call expire sans valeur, et B vaut le K - S du put plus l'action S, soit K. Dans les deux cas les deux portefeuilles valent autant à l'échéance : ils doivent donc coûter autant aujourd'hui.

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

Quand la parité est rompue : l'arbitrage

Si le marché cote des prix qui ne satisfont pas la relation, un profit sans risque existe. Définissez l'écart (C - P) - (S - K e^(-rT)). Un écart positif signifie que le call est trop cher par rapport au put : vendez le call, achetez le put, achetez l'action et empruntez la valeur actuelle du prix d'exercice. Le portefeuille ne coûte rien au départ, ne paie rien à l'échéance quoi que fasse l'action, et empoche l'écart aujourd'hui. Un écart négatif inverse chaque jambe. Les vrais marchés ont des coûts et des fourchettes achat-vente, donc de petits écarts ne sont pas négociables : c'est ce que représente la tolérance.

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
La parité ne dépend d'aucun modèleLa parité call-put ne demande aucune hypothèse sur l'évolution de l'action ni sur la volatilité, seulement l'absence d'arbitrage et l'exercice européen (pas d'exercice anticipé). C'est donc un contrôle puissant : un modèle de valorisation qui viole la parité est faux. Les options américaines et les dividendes modifient la relation, qui ne tient alors qu'en inégalités ; retirez donc la valeur actuelle des dividendes du cours avant de l'utiliser.
  • C + K * exp(-rT) = P + S : un call plus l'obligation égale un put plus l'action, donc P = C - S + K * exp(-rT).
  • Écart (C - P) - (S - K e^(-rT)) positif : vendez le call, achetez le put et l'action ; négatif : l'inverse.
  • La parité ne dépend d'aucun modèle : utilisez-la pour contrôler tout modèle de valorisation ; avec dividendes ou exercice anticipé, elle devient une inégalité.

À suivre : la formule de Black–Scholes, un prix en forme fermée pour le call et le put.

Lab : ce qui est noté

  • Déduire le put du call avec parity_put_price25 pts
  • Déduire le call du put avec parity_call_price25 pts
  • Mesurer l'écart des prix à la parité avec parity_gap25 pts
  • Nommer l'opération sans risque avec arbitrage_action25 pts
Explorateur · lab-72-1
▾ lab-72-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-72-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-72-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