Absence d’arbitrage et valorisation binomiale des options
Un call peut verser 20 à l’échéance, ou ne rien verser. Combien faut-il payer aujourd’hui pour l’acheter ? Si une action et une obligation permettent de reproduire son paiement dans tous les états possibles, l’option doit coûter autant que ce portefeuille. L’arbre binomial limite chaque étape suivante à deux états : on peut ainsi suivre le raisonnement de valorisation nœud par nœud.
Marchés financiers et modélisation mathématique présente les droits associés aux options, leurs paiements à l’échéance et le résultat après déduction de la prime. Tous les chiffres ci-dessous sont hypothétiques, les montants sont exprimés dans une même unité monétaire et chaque option porte sur une action sans dividendes.
Paiement à l’échéance, prix et arbitrage
Pour un prix d’exercice et un cours à l’échéance, les paiements du call et du put sont :
Le paiement dépend de l’état à l’échéance ; et sont les prix payés aujourd’hui pour acquérir ces droits. Une option européenne ne peut être exercée qu’à l’échéance. Une option américaine peut aussi être exercée plus tôt.
Un arbitrage est une stratégie sans investissement net, sans perte future dans aucun état, et procurant un gain dans au moins un état de probabilité positive. On suppose que les deux états du cours ont une probabilité positive et que les opérations nécessaires sont réalisables. Le support de travaux dirigés du MIT OpenCourseWare sur les options déduit la valorisation par réplication et la parité put-call du principe suivant : des paiements identiques doivent avoir des coûts identiques. Sinon, acheter le portefeuille le moins cher et vendre le plus cher laisse un excédent certain.
Le raisonnement autorise les prêts et les emprunts au même taux sans risque, les positions fractionnaires en actions et en options, ainsi que la vente à découvert. Il ignore les frais, les impôts, les écarts entre prix acheteur et vendeur et les contraintes de marge. Ces conditions rendent possibles les arbitrages décrits ci-dessous.
Une période : acheter une demi-action et emprunter
Le cours actuel est . Après une période, il ne peut être que ou . Le facteur de croissance sans risque est : une somme de 1 devient 1,05, soit un taux de 5 % sur cette période. Un call européen a pour prix d’exercice .
Répliquons ce call avec actions et une obligation sans risque de valeur actuelle . À l’échéance, l’obligation vaut ; correspond à un emprunt. Il faut reproduire les deux paiements :
La différence donne , donc . En reportant dans l’équation de l’état de baisse :
On achète une demi-action et on emprunte 38,095238, pour un coût net de 11,904762. L’emprunt impose de rembourser 40 à l’échéance :
Le portefeuille reproduit les deux résultats : son coût détermine donc le prix de l’option. Aucun pronostic sur la probabilité de hausse n’est nécessaire.
Si ce call européen se négocie à 14, on en vend un et on constitue le portefeuille de réplication. L’excédent initial est . Placé au taux sans risque, il devient 2,2 à l’échéance. Le paiement du portefeuille compense exactement l’obligation liée au call vendu : le gain subsiste dans les deux états. Si l’option coûte moins que sa réplication, on inverse les opérations : achat de l’option, vente à découvert du portefeuille et placement de la différence. Les montants sont affichés à six décimales ; les calculs conservent les valeurs non arrondies.
D’où vient la probabilité risque-neutre ?
Pour un arbre à une période, posons et , avec . L’absence d’arbitrage entre l’action et l’obligation exige :
Si , vendre l’action à découvert et placer le produit de la vente ne fait perdre d’argent dans aucun état après restitution de l’action, et procure un gain en cas de baisse. Si , emprunter pour acheter l’action permet également un arbitrage. Les inégalités strictes donnent aux deux états des poids de valorisation positifs.
Le portefeuille qui réplique des paiements quelconques à l’échéance vérifie :
En les substituant dans , puis en regroupant les termes :
est la probabilité risque-neutre de hausse. Elle vérifie : avec ces poids, le facteur moyen de croissance de l’action est celui du placement sans risque. Ici, et , d’où :
Les 62,5 % sont un poids de valorisation issu de la réplication, pas une prévision de la fréquence réelle des hausses. La probabilité réelle sert à prévoir les rendements et le risque. Calculer le paiement moyen d’une option avec , puis l’actualiser au taux sans risque, ne donne généralement pas le prix de réplication. La valorisation risque-neutre n’exige pas non plus que les investisseurs soient indifférents au risque.
Parité put-call : vérifier une autre relation de prix
Considérons des options européennes sur la même action sans dividendes, de mêmes prix d’exercice et échéance. Un call accompagné d’une obligation versant à l’échéance et un put accompagné d’une action versent tous deux à l’échéance. Donc :
Dans l’exemple à une période, le put verse 0 en cas de hausse et 20 en cas de baisse :
L’écart de prix concorde également : . Sur plusieurs périodes, on remplace par la valeur actuelle du prix d’exercice à l’échéance. Pour un taux annuel à capitalisation continue et une durée , elle vaut . Les dividendes demandent un ajustement ; les options américaines peuvent être exercées à des dates différentes, si bien que cette égalité européenne ne s’y applique pas directement.
Plusieurs périodes : remonter depuis l’échéance
L’article de Cox, Ross et Rubinstein de 1979, Option Pricing: A Simplified Approach, a paru dans le Journal of Financial Economics 7(3), pages 229–263. La section 3 du texte original accessible étend la réplication à plusieurs périodes ; la section 6 traite des dividendes et des puts.
Avec des facteurs fixes, une hausse suivie d’une baisse et une baisse suivie d’une hausse conduisent au même cours, car . L’arbre est donc recombinant. Au pas , après hausses, le cours est :
On remplit la dernière couche avec les paiements à l’échéance, puis on remonte couche par couche. Pour un put européen :
C’est la récurrence à rebours. À chaque nœud, on réplique les deux valeurs possibles de l’option au pas suivant. Une fois arrivé au nœud suivant, on ajuste les quantités d’actions et d’obligations. La valeur de l’ancien portefeuille finance le nouveau sans apport supplémentaire : la stratégie est autofinancée. Un portefeuille acheté une seule fois, sans ajustement ultérieur, ne réplique généralement qu’une option à une période.
Put américain : comparer exercice et attente à chaque nœud
À chaque nœud où l’exercice est possible, on compare la valeur de continuation à la valeur d’exercice immédiat :
La dernière couche contient toujours les paiements à l’échéance. Un arbre fini ne teste l’exercice qu’à ses dates : il approche ainsi les possibilités d’exercice continu d’une option américaine. Sur le même arbre, le prix américain est au moins égal au prix européen, puisque le détenteur peut choisir d’attendre l’échéance.
Prenons un second exemple, à deux pas : , an, un taux annuel à capitalisation continue et un paramètre de volatilité annualisée . Chaque pas dure six mois. Le choix CRR est :
Pour , on obtient , , et . Les 5 % désignent ici un taux annuel à capitalisation continue, contrairement au taux simple sur une période du premier exemple. Les cours terminaux et les paiements du put sont :
Au nœud de baisse après six mois, le cours est de 86,812345. La valeur de continuation est :
L’exercice immédiat rapporte : le détenteur du put américain doit donc exercer à ce nœud. Au nœud de hausse, l’exercice et la continuation valent tous deux 0. En remontant jusqu’à aujourd’hui :
Aujourd’hui, l’exercice immédiat vaut 0 : le détenteur du put américain doit encore attendre. Le droit d’exercice anticipé ajoute environ 1,074211 au prix. Lorsque le taux est positif, les intérêts que permet de gagner un encaissement plus précoce peuvent valoir davantage que la conservation de l’option. C’est pourquoi l’exercice anticipé peut être utile pour un put même sans dividendes.
Hypothèses et limite de Black–Scholes–Merton
Ces arbres utilisent un taux constant et des facteurs de hausse et de baisse fixes. La construction CRR détermine ces facteurs à partir d’un paramètre de volatilité constant. Elle suppose aussi l’absence de dividendes et de frais de transaction, des taux de prêt et d’emprunt identiques, la possibilité de vendre à découvert et de détenir des fractions d’action, ainsi qu’un rééquilibrage exact à chaque nœud. Modifier les taux, la volatilité, les dividendes, le financement ou les contraintes de négociation peut changer les prix et les décisions optimales d’exercice.
sont des paramètres du modèle, pas des prévisions du cours déduites de l’absence d’arbitrage. Une fois choisis, ils doivent encore vérifier . Le paramètre CRR fixe l’amplitude de chaque variation du logarithme du cours ; avec un nombre fini de pas, il ne coïncide pas nécessairement avec l’écart-type exact du rendement logarithmique terminal sur un an.
La section 5 de l’article original établit la limite de Black–Scholes. On maintient fixes , un taux constant et , puis on fait tendre . À chaque raffinement, on recalcule avec les formules précédentes et on utilise les probabilités risque-neutres. Pour les calls et puts européens sur une action sans dividendes, dans ces conditions sans frictions, les prix de l’arbre convergent vers ceux de Black–Scholes–Merton. Sous ces probabilités, les variations successives sont indépendantes et leur amplitude logarithmique diminue selon . Le théorème central limite donne alors un rendement logarithmique terminal normal, de moyenne limite et de variance : le cours terminal suit ainsi la limite lognormale utilisée dans BSM. La seule concordance des moyennes et des variances ne suffirait pas à établir cette limite en distribution.
Ajouter des couches sans modifier les anciens change le risque sur l’ensemble de la durée et ne donne pas cette limite. Multiplier les pas ne corrige pas non plus les sauts, la volatilité variable ou les frais omis du modèle. L’arbre d’un put américain approche la valeur d’arrêt optimal dans le modèle correspondant ; la formule BSM européenne ne peut pas remplacer la comparaison avec l’exercice anticipé.
Comparer les deux puts sur le même arbre avec Python
Enregistrez le code suivant dans binomial_example.py et lancez python3 binomial_example.py. Il utilise seulement la bibliothèque standard de Python. Les entrées numériques sont converties en nombres flottants et doivent être finies ; le cours, le prix d’exercice, la durée et le paramètre de volatilité doivent être positifs ; le nombre de pas doit être un entier positif ; l’arbre doit respecter l’inégalité d’absence d’arbitrage. Les facteurs de croissance et les cours à tous les nœuds doivent être représentables par des flottants positifs et finis, la probabilité calculée doit être strictement comprise entre 0 et 1, et les valeurs des options doivent rester finies. Le code lève ValueError pour une entrée invalide ou un arbre hors de cette plage numérique ; il convertit aussi en ValueError les dépassements de capacité des fonctions mathématiques de Python. Cet exemple ne traite pas l’arbre dégénéré à volatilité nulle.
j compte les hausses : values[j] est donc le nœud fils de baisse et values[j+1] celui de hausse. Les deux options partagent le cours initial, le prix d’exercice, le taux, la volatilité, la durée et le nombre de pas. american=True ajoute la comparaison avec l’exercice à chaque nœud. L’exécution à deux pas affiche les nœuds américains, puis les résultats sont comparés sur des arbres plus fins.
from math import exp, isfinite, log, sqrt
def price_put(s0, strike, years, rate, sigma, steps, american=False, trace=False):
try:
s0, strike, years, rate, sigma = map(float, (s0, strike, years, rate, sigma))
except (TypeError, ValueError, OverflowError) as error:
raise ValueError("numeric inputs must be representable as floats") from error
inputs = (s0, strike, years, rate, sigma)
if not all(isfinite(x) for x in inputs):
raise ValueError("inputs must be finite")
if min(s0, strike, years, sigma) <= 0:
raise ValueError("s0, strike, years, sigma must be positive")
if type(steps) is not int or steps < 1:
raise ValueError("steps must be a positive integer")
log_s0 = log(s0)
try:
dt = years / steps
move = sigma * sqrt(dt)
u, d = exp(move), exp(-move)
growth = exp(rate * dt)
lowest = exp(log_s0 - steps * move)
highest = exp(log_s0 + steps * move)
except OverflowError as error:
raise ValueError("tree exceeds floating-point range") from error
if not all(isfinite(x) and x > 0 for x in (u, d, growth, lowest, highest)):
raise ValueError("tree exceeds floating-point range")
if not d < growth < u:
raise ValueError("tree must satisfy d < exp(rate * dt) < u")
q = (growth - d) / (u - d)
if not 0 < q < 1:
raise ValueError("risk-neutral probability is outside floating-point range")
def stock_at(i, j):
return s0 if i == 0 else exp(log_s0 + (2*j - i) * move)
values = [max(strike - stock_at(steps, j), 0.0)
for j in range(steps + 1)]
if trace:
print(f"u={u:.6f}; d={d:.6f}; R={growth:.6f}; q={q:.6f}")
print("terminal_puts=" + ", ".join(f"{v:.6f}" for v in values))
for i in range(steps - 1, -1, -1):
previous = []
for j in range(i + 1):
stock = stock_at(i, j)
continuation = ((1-q) * values[j] + q * values[j+1]) / growth
exercise = max(strike - stock, 0.0)
value = max(exercise, continuation) if american else continuation
if not isfinite(value):
raise ValueError("option value exceeds floating-point range")
previous.append(value)
if trace:
decision = "exercise" if american and exercise > continuation else "hold"
print(f"i={i}; j={j}; S={stock:.6f}; "
f"continue={continuation:.6f}; exercise={exercise:.6f}; "
f"value={value:.6f}; decision={decision}")
values = previous
return values[0]
parameters = (100.0, 100.0, 1.0, 0.05, 0.20)
eu = price_put(*parameters, 2)
am = price_put(*parameters, 2, american=True, trace=True)
print(f"n=2; European={eu:.6f}; American={am:.6f}; premium={am-eu:.6f}")
for n in (50, 200, 800):
eu = price_put(*parameters, n)
am = price_put(*parameters, n, american=True)
print(f"n={n}; European={eu:.6f}; American={am:.6f}; premium={am-eu:.6f}")
u=1.151910; d=0.868123; R=1.025315; q=0.553908
terminal_puts=24.636168, 0.000000, 0.000000
i=1; j=0; S=86.812345; continue=10.718647; exercise=13.187655; value=13.187655; decision=exercise
i=1; j=1; S=115.190991; continue=0.000000; exercise=0.000000; value=0.000000; decision=hold
i=0; j=0; S=100.000000; continue=5.737654; exercise=0.000000; value=5.737654; decision=hold
n=2; European=4.663444; American=5.737654; premium=1.074211
n=50; European=5.533634; American=6.073728; premium=0.540094
n=200; European=5.563534; American=6.086383; premium=0.522849
n=800; European=5.571027; American=6.089402; premium=0.518375
L’arbre à deux pas se prête au calcul à la main, mais donne une approximation grossière du prix. Ces résultats sur des arbres plus fins montrent que la prime d’exercice anticipé dépend elle aussi de la discrétisation. Pour estimer les rendements réels et le risque de détenir des actions, voir Rendements, diversification et risque de portefeuille. La vue d’ensemble de la finance quantitative relie les autres thèmes.