Dans ce présent travail, nous allons appliquer la méthode numérique pour l'équation différentielle vérifiée par le prix d'une option en finance, communément appelé l'équation de Black-Scholes.
La formule de Black-Scholes lie le prix d'une option à ses caractéristique par une équation différentielle partielle non linéaire. Elle s'est imposée comme une référence en termes de valorisation des options.
L'intérêt de ce présent travail est de résoudre cette équation différentielle par la méthode des différences finies (bien que la solution analytique existe) et l'implémenter en python. Pour cela, nous commencerons par présenter la méthode des différences finies dans un premier temps. Ensuite dans la deuxième partie, nous discrétiserons l'équation de black-scholes à l'aide des différentes schéma et pour finir l'implémentation en python en troisième partie.
Résolution numérique de l'équation de Black Scholes en python
1. Résolution numérique de l’équation de
Black-Scholes en Python par différence
finie
SIDIBE Ali Broma 1
Financial Market and Risk Management.
Juillet, 2019
1
bromasidibe@gmail.com
3. 1 Introduction
D’une manière générale, la résolution analytique fournit traditionnellement une solution
exacte aux modèles mathématiques. Souvent certains modèles dûs à leur complexité
peuvent ne pas avoir des solutions analytiques. Aussi la précision peut ne pas être un
critère fondamentale dans certains cas. Il s’avère alors utile de procéder par une solu-
tion approchées du problème d’où l’intérêt des méthodes numériques. Les méthodes des
différences finies sont un moyen d’obtenir des solutions numériques. C’est une technique
courante de recherche de solutions approchées d’équations aux dérivées partielles qui con-
siste à résoudre un système de relations (schéma numérique) liant les valeurs des fonctions
inconnues en certains points suffisamment proches les uns des autres.
Dans ce présent travail, nous allons appliquer la méthode numérique pour l’équation dif-
férentielle vérifiée par le prix d’une option en finance, communément appelé l’équation
de Black-Scholes. La formule de Black-Scholes lie le prix d’une option à ses caractéris-
tique par une équation différentielle partielle non linéaire. Elle s’est imposée comme une
référence en termes de valorisation des options.
L’intérêt de ce présent travail est de résoudre cette équation différentielle par la méthode
des différences finies (bien que la solution analytique existe) et l’implémenter en python.
Pour cela, nous commencerons par présenter la méthode des différences finies dans un
premier temps. Ensuite dans la deuxième partie, nous discrétiserons l’équation de black-
scholes à l’aide des différentes schéma et pour finir l’implémentation en python en troisième
partie.
2 Méthodes des différences finies
2.1 Approximation des dérivées
Nous allons appliquer la formule de Taylor pour donner une approximation des dérivés
d’une fonction en un point x0. En mathématiques, plus précisément en analyse, le
théorème de Taylor (ou formule de Taylor), du nom du mathématicien anglais Brook
Taylor montre qu’une fonction suffisamment dérivable au voisinage d’un point peut être
approchée par une fonction polynomiale dont les coefficients dépendent uniquement des
dérivées de la fonction en ce point.
Théoreme 1. Soient I un intervalle de R, x0 un point de I et f : I −→ R une fonction
de classe Cn
sur I. Alors pour tout h ∈ R tel que x0 + h ∈ I, on a
f(x0 + h) = f(x0) + hf (x0) +
h2
2!
f .... + hn
(h)
=
n
i=0
hi
i!
f(i)
(x0) + hn
(h)
(2.1.1)
Resolution numérique de l’equation de Black Schole en Python 2
4. 2.1.1 Dérivée première
Par le développement de Taylor à l’ordre 1 de f au voisinage de x0 nous avons f(x0 +h) =
f(x0) + hf (x0) + h (h) Il en résulte immédiatement que:
f (x0) =
f(x0 + h) − f(x0)
h
+ (h) (2.1.2)
2.1.2 Dérivée seconde
De même lorsqu’on fait le développement à l’ordre 2, nous obtenons f(x0 + h) = f(x0) +
hf (x0) + h2
2
f (x0) + h2
(h2
) lorsque nous faisons le développement limité au point xo + h
et f(x0 −h) = f(x0)−hf (x0)+ h2
2
f (x0)+h2
(h2
) lorsque nous faisons le développement
limité au point xo − h En faisant la somme de chaque terme de ces deux égalités, on
a
f (x0) =
f(x0 + h) − 2f(x0) + f(x0 − h)
2h
+ (h2
) (2.1.3)
2.2 Types de schéma
On considère un problème à deux dimensions:spatiale et temps, de la forme
∂f
∂t
= F f, t, x,
∂f
∂x
,
∂2
f
∂x2
Nous souhaitons évaluer les valeurs au points (tn, xj) avec le pas spatiale δx et δt le pas
en temps. On note fn,j = f(nδt, jδx)
2.2.1 Euler explicite
Le schéma explicite est la plus facile et la plus rapide des types de méthodes de différences
finie. Elle calcule le prix des options pour chaque instant t à partir des pas instants
précédents. Dans la méthode d’Euler explicite, la valeur approchée à l’instant tn+1 est
obtenue à partir de la précédente c’est à dire l’instant tn déjà connu.
fn+1,j − fn,j
δt
= Fn
j f, t, x,
∂f
∂x
,
∂2
f
∂x2
Formellement, elle s’écrit comme une combinaison linéaire de la forme suivante:
fn+1,j = afn,j+1 + bfn,j−1 + cfn,j
Une condition de la stabilité est que a > 0, b > 0 et c > 0. Afin que cette méthodes
converge, les valeurs à l’instant tn+1 doivent être supérieurs aux instants tn
fn,j
fn+1,j
< 1
Resolution numérique de l’equation de Black Schole en Python 3
5. Figure 1: Différent types de schéma
2.2.2 Euler implicite
fn+1,j − fn,j
δt
= Fn+1
j f, t, x,
∂f
∂x
,
∂2
f
∂x2
Le schéma implicite réclame un travail numérique supplémentaire par rapport au schéma
explicite. En contrepartie, il n’impose aucune condition sur le choix de a et b et c. Ce
bénéfice est tellement important que l’approximation par schéma de différences finies
implicite est presque toujours préféré à l’approximation par différences finies explicite
dans les cas pratiques.
2.2.3 Crank Nicolson
La méthode de Crank-Nicolson est un algorithme simple permettant de résoudre des
systèmes d’équations aux dérivées partielles. Cette méthode utilise les différences finies
pour approcher une solution du problème : elle est numériquement stable et quadratique
pour le temps. La méthode de Crank-Nicolson s’obtient en faisant la moyenne des deux
Resolution numérique de l’equation de Black Schole en Python 4
6. égalités précédentes (explicite et implicite) :
fn+1,j − fn,j
δt
=
1
2
Fn+1
i f, t, x,
∂f
∂x
,
∂2
f
∂x2
+ Fn
i f, t, x,
∂f
∂x
,
∂2
f
∂x2
La méthode est considérée comme implicite, car elle nécessite la résolution d’équations
algébriques (correspondant au second membre de la méthode d’Euler régressive). Elle
est inconditionnellement stable, mais nécessite certaines conditions de régularité sur les
équations à résoudre pour que le résultat ait une précision satisfaisante.
2.3 Propriétés
Un certain nombre de notion est nécessaire lors de la résolution d’équations aux dérivées
partielles (EDP) au moyen des méthodes de différences finies. Les trois principales sont
la convergence, la stabilité et la consistance. Ces trois propriétés permettent de relier la
solution exacte des équations continues à la solution exacte des équations discrétisées et à
la solution numérique. Le respect de ces propriétés est nécessaire pour la crédibilité d’un
schéma numérique.
Figure 2: Les propriétés d’un schéma numérique
2.3.1 Consistance
C’est la propriété qui assure que la solution exacte des équations discrétisées tende vers
la solution exacte des équations continues lorsque les pas discrétisations tendent vers
zéro.
Resolution numérique de l’equation de Black Schole en Python 5
7. Definition 1. Soient A(.t, x) = 0, une équation différentielle, u une solution analytique
de A et F(.) = 0 un schéma discrétisant l’équation A(t, x) = 0 de pas δ Le schéma F(.)
est dit consistant si
lim
δ→0
F(u)) = 0
Autrement dit, si on remplace la discrétisation par la solution exacte, alors l’erreur temps
vers 0.
2.3.2 Convergence
La convergence d’un schéma aux différences finies est une propriété naturelle qui assure
que, pour des valeurs suffisamment petites des pas de discretisation, la solution numérique
calculée sera proche de la solution exacte du problème de départ. C’est la propriété qui
assure que la solution numérique tende vers la (ou une) solution exacte des équations
continues.
Definition 2. Soit A(t, x) = 0 une équation différentielle et F(un
j ) = 0 un schéma dis-
crétisant l’équation A(t, x) = 0 est dit consistant si
lim
dx→0,dt→0
F(u(tj, xn) = 0
si et seulement si u(t, x) est solution.
Autrement dit, si on remplace la discrétisation par la solution exacte, alors l’erreur temps
vers 0.
2.3.3 Stabilité
D’une façon plus général, un problème est dit stable, très sensible ou mal conditionné
si une petite variation des données ou des paramètres entraîne une grande variation des
résultats. Pour un schéma numérique, c’est la propriété qui assure que la différence
entre la solution numérique obtenue et la solution exacte des équations discrétisées est
bornée.
Definition 3. On considère la norme discrète suivante
un
2 =
N
j=1
∆x|un
j |2
1
2
(2.3.1)
Un schéma est dit stable par rapport à cette norme, s’il existe une constante K > 0
indépendante des pas discretisation tel que pour tout n entier positif.
un
< K u0
Resolution numérique de l’equation de Black Schole en Python 6
8. Figure 3: Stabilité d’un schéma numérique
2.4 Choix du schéma
Le choix d’un schéma numérique pour la résolution d’une équation différentielle doit
idéalement tenir compte de notamment d’une part le respect des propriétés précédentes
d’autres part sur les contraintes techniques (puissances de la machine) et de la complexité
de son implémentation informatique. Le schéma centré bien qu’apparaît comme un juste
milieu entre le schéma explicite et implicite est totalement instable, par cette raison, nous
l’ignorons totalement.
Le schéma explicite est très facile à implémenter de manière informatique mais sa stabilité
impose des choix sur les pas de discretisation. Nous pouvons respecter ces choix et se
lancer tenter.
Le dernier schéma est le schéma implicite, bien que difficile à implémenter il est incondi-
tionnellement stable.
Notre choix sur le schéma implicite se justifie par le fait que nous aimerons avoir une plus
grande liberté sur le choix de nos pas de discretisation.
Resolution numérique de l’equation de Black Schole en Python 7
9. 3 Discrétisation
3.1 Equation différentielle
Soit une option de maturité T, de prix d’exercice K, du taux sans risque r, de volatilité σ
et du sous-jacent St, alors d’après l’équation de Black-Scholes, le prix f d’une telle option
vérifie l’équation différentielle suivantes
∂f(t, St)
∂t
+ rS
∂f(t, St)
∂S
+
1
2
S2
σ2 ∂2
f(t, St)
∂S2
= rf(t, St)
f(T, ST ) = max(ST − K)
(3.1.1)
Nous avons pris une option de type call.
3.2 Methode
Le prix d’une option f (3.1.1) dépend de deux paramètres le temps t et le sous-jacent St
que nous noterons x pour simplification.
Figure 4: Discrétisation
La maturité T est connue, elle est la limite de notre discretisation, nous divisons l’intervalle
[0, T] en N pas constant δt = T
N
. L’intervalle discrétisé est alors de la forme suivante:
[t0 = 0, t0 + δt, t0 + 2δt. . . , t0 + nδt. . . Nδt = T]
[t0 = 0, t1, t2. . . , tn. . . tN = T]
Resolution numérique de l’equation de Black Schole en Python 8
10. De même, pour discrétiser, le prix du sous-jacent x c’est à dire St, nous supposons qu’il
possède une limite supérieur. Cette limitation du prix du sous-jacent est évidemment co-
hérente avec la réalité financière. Si le sous-jacent est une action, ou une matière première,
nous savons que leur prix ne tend pas vers l’infini dans la réalité. Soit Smax un nombre
suffisamment grand symbolisant cette limite, on note δx le pas de discretisation.
δx =
Smax
M
[x0 = 0, x0 + δx, x0 + 2δx. . . , x0 + jδx. . . Mδx = Smax]
[x0 = 0, x1, x2. . . , xj. . . xM = Smax]
Le pas de déplacement en espace et temps pour tout entier positif n et tout entier relatif
j se notera comme suivant:
xj = jδx
tn = nδt
fn,j = f(tn, xj)
3.3 Condition aux bords
Une équation différentielle sans conditions de bord peut avoir une ou plusieurs solutions ou
sans solution d’où la nécessité de spécifier les conditions de bord pour notre équation. Les
payoffs des options call et put à la maturité sont données respectivement par max(ST −
K, 0) et max(K − ST , 0).
Lorsque t = T (autrement dit à la maturité), on à n = N,
fN,j = max(K − jδx, 0)
Lorsque S = Smax , par la relation de parité on a
fn,0 = x − Ke−r(N−n)δt
Lorsque S = 0, on a fn,j = 0
Resolution numérique de l’equation de Black Schole en Python 9
11. 4 Implémentation en Python
4.1 Schéma explicite
4.1.1 Equation
La plupart des équations différentielles possèdes des conditions initiales. Les étapes suiv-
antes sont alors déterminée par une approximations en discrétisant le temps par une
approche "forward." Dans le cadre des options, c’est la valeur terminale qui est connue
c’est pour cela nous utilisons le backward pour le time.
Pour le schéma explicite, nous ferons le schéma centré sur le sous-jacent du premier ordre
et symétrique sur le second ordre. Pour des raisons de stabilités,
Pour la dérivée première par rapport au temps au point tn on applique Taylor à tn − δt
on aura alors
∂f
∂t
(tn, xj) =
f(tn, xj) − f(tn − δt, xj)
δt
=
fn,j − fn−1,j
δt
(4.1.1)
Il faut noter ici que pour une option, nous connaissons la valeur terminale, notre objectif
est de déterminer la valeur à l’instant zéro.
Pour la dérivée première par rapport au sous-jacent au point xj, nous utilisons une ap-
proximation centrée. Ce qui se justifie par le fait que l’option peut augmenter à Sj+1 ou
descendre à Sj−1 on a
∂f
∂x
(tn, xj) =
f(tn, xj + δx) − f(tn, xj − δx)
2δx
==
fn,j+1 − fn,j−1
2δx
(4.1.2)
Pour la dérivée seconde par rapport au sous-jacent au point xj on a
∂2
f
∂x2
(tn, xj) =
f(tn, xj + δx) − 2f(tn, xj) + f(tn, xj − δx)
(δx)2
=
fn,j+1 − 2fn,j + fn,j−1
(δx)2
(4.1.3)
En remplaçant les termes (4.1.2), (4.1.3) et (4.1.1) par leur valeurs dans l’équation 3.1.1,
nous aurons
fn,j − fn−1,j
δt
+ rxj
fn,j+1 − fn,j−1
2δx
+
1
2
x2
j σ2 fn,j+1 − 2fn,j + fn,j−1
(δx)2
− rfn,j = 0
Sachant que xj = jδx, on peut ramener cette équation numérique sous la forme suiv-
ante
fn−1,j = ajfn,j+1 + bjfn,j−1 + cjfn,j (4.1.4)
Resolution numérique de l’equation de Black Schole en Python 10
12. Avec
aj =
1
2
j2
σ2
δt +
1
2
jδt
bj =
1
2
j2
σ2
δt −
1
2
jδt
cj = 1 − j2
σ2
δt − rδt
Les valeurs aj,bj et cj sont des valeurs de probabilité de transitions.On remarque qu’ils
sont positives et leur somme est égale à 1. Par construction.
fn−1,1 = a1fn,2 + b1fn,1 + c1fn,0
fn−1,2 = a2fn,3 + b2fn,2 + c2fn,1
fn−1,3 = a3fn,4 + b3fn,3 + c3fn,2
... =
...
fn−1,M−1 = aM−1fn,M−2 + b1fn,M−1 + c1fn,M−2
(4.1.5)
En posant
Fn =
fn−1,1
fn−1,2
...
fn−1,j
...
fn−1,M−1
A =
b1 a1 0 0 · · · 0
c2 b2 a2 0 · · · 0
0 c3 b3 a3 · · · 0
... 0 0
...
...
...
...
... 0
... ... aM−2
0 0 · · · 0 cM−1 bM−1
on a
Fn−1 = AFn
Nous connaissons la valeur terminale par fN,j = max(K − jδx, 0), par cette suite, nous
pouvons nous ramener facilement la valeur à l’instant t = 0
4.1.2 Stabilité
On peut aussi démontrer que pour que le schéma explicite devient stable il faut que
δt
(δs)2
<
1
ρ
Avec ρ = max(σ2
Sj, j = 1... . . . M − 1)
Resolution numérique de l’equation de Black Schole en Python 11
13. 4.1.3 Implémentation
1 import math
2 import numpy as np
3 from matplotlib import cm
4 from matplotlib import pyplot as plt
5 import matplotlib
6 from mpl_toolkits.mplot3d import Axes3D
7 import numpy as np
8 from matplotlib import cm
9 from matplotlib import pyplot as plt
10 class FiniteEngine:
11
12 def __init__(self):
13 self.strike = 0.5
14 self.maturity = 1.0
15 self.risk_free_rate = 0.05
16 self.volatility = 0.2
17 self.stockMax = 1
18 self.Ms = 20
19 self.Nt = 20
20 self.dt = self.stockMax/(float(self.Ms))
21 self.dx = self.maturity/(float(self.Nt))
22
23 def compute_explicite(self):
24 previous = np.zeros(self.Ms)
25 xvalues = np.zeros(self.Ms)
26 for x in range(self.Ms):
27 xvalues[x] =x*self.dx
28 previous[x] = max(xvalues[x]- self.strike,0)
29 result = np.zeros(self.Ms)
30 output1 = list()
31 output2 = list()
32 output3 = list()
33
34 prev_t = 0
35 for ti in range(self.Nt):
36 cur_t = prev_t + self.dt
37 result[0] = 0
38 result[self.Ms - 1] = (xvalues[self.Ms - 1] - self.strike) *
math.exp(-self.risk_free_rate * self.dt * (self.maturity - prev_t))→
39 for xi in range(1, self.Ms - 1, 1):
40 result[xi] = self.coef_a(xi) * previous[xi + 1] + self.coef_b(xi) *
previous[xi] + self.coef_c(xi) * previous[xi - 1]→
41 for xi in range(self.Ms):
42 output1.append(xvalues[xi])
43 output2.append(prev_t)
44 output3.append(result[xi])
Resolution numérique de l’equation de Black Schole en Python 12
14. 45 previous = result
46 prev_t = cur_t
47
48 self.plot_option(xvalues,result)
49 self.plot_surface(output1,output2,output3)
50
51 def plot_option(self,x_values,c_values):
52 fig, ax = plt.subplots()
53 ax.plot(x_values,c_values)
54 ax.set_xlabel('Stock')
55 ax.set_ylabel('Option')
56 ax.set_title('Finite Model price')
57 plt.show()
58
59 def plot_surface(self, output1, output2,output3):
60 X = np.reshape(output1, (self.Ms, self.Nt))
61 Y = np.reshape(output2, (self.Ms, self.Nt))
62 Z = np.reshape(output3, (self.Ms, self.Nt))
63 fig = plt.figure()
64 ax = fig.add_subplot(111, projection='3d')
65
66 ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.YlGnBu_r)
67 ax.set_zlim3d(0, 1.0)
68 ax.set_xlabel(r'$S$')
69 ax.set_ylabel(r'$T-t$')
70 ax.set_zlabel(r'$C(S,t)$')
71 plt.show()
72
73 def coef_a(self, i):
74 return 0.5 * i * i * self.dt * (self.volatility ** 2) + 0.5 * i * self.dt
75
76 def coef_b(self, i):
77 return 1 - i * i * self.volatility * self.volatility * self.dt -
self.risk_free_rate * self.dt→
78
79 def coef_c(self, i):
80 return 0.5 * i * i * self.dt * (self.volatility ** 2) - 0.5 * i * self.dt
Avec les paramêtres definies dans le code, nous avons
Resolution numérique de l’equation de Black Schole en Python 13
15. Figure 5: Surface de prix d’option call
Resolution numérique de l’equation de Black Schole en Python 14