Conception d'un pricer Monte-Carlo générique en C++ - Ensiwiki
Conception d'un pricer Monte-Carlo générique en C++ - Ensiwiki
Conception d'un pricer Monte-Carlo générique en C++ - Ensiwiki
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Conception</strong> d’un <strong>pricer</strong> <strong>Monte</strong>-<strong>Carlo</strong> générique <strong>en</strong> <strong>C++</strong><br />
Jérôme Lelong<br />
26 mai 2010<br />
Le but de cette deuxième partie du cours de “Modélisation <strong>en</strong> <strong>C++</strong>” est de réfléchir à la<br />
structure d’un outil permettant de calculer des prix d’options par une méthode de <strong>Monte</strong> <strong>Carlo</strong><br />
ainsi que leur dérivée par rapport au spot. L’exécutable développé devra lire les paramètres<br />
des produits dans un fichier texte comme expliqué à la section 5.<br />
1 Motivations pratiques<br />
Lorsque l’on s’intéresse à un produit dérivé, il est important de pouvoir calculer son prix<br />
et de savoir construire son portefeuille de couverture.<br />
Notons S = (S t , t ≥ 0) la dynamique du sous-jac<strong>en</strong>t et F sa filtration naturelle, <strong>en</strong><br />
pratique nous nous restreindrons au cas du modèle de Black Scholes multidim<strong>en</strong>sionnel (c.f.<br />
section 2). Pour simplifier les choses, nous allons supposer que le payoff des options que nous<br />
allons considérer s’écrit sous la forme<br />
ϕ(S t0 , S t1 , . . . , S tN )<br />
où la grille de temps 0 = t 0 < t 1 < · · · < t N = T est supposée régulière, i.e. t k = kT/N pour<br />
k = 0, . . . , N.<br />
Exemple. Voici quelques exemples de fonctions ϕ dans le cas d’un sous-jac<strong>en</strong>t unique.<br />
– N = 1 et ϕ(s 0 , s 1 ) = (s 1 − K) + correspond à une option d’achat<br />
– T = 1, N = 12 et ϕ(s 0 , s 1 , . . . , s 12 ) = (s 12 −K) + 1 {∀0≤i≤12, si ≥L} correspond à une option<br />
d’achat barrière à monitoring discret (une date de constatation par mois). L’option est<br />
annulée si à une des dates de constatation, la valeur du sous-jac<strong>en</strong>t est inférieure à L.<br />
– T = 1, N = 365 et ϕ(s 0 , . . . , s 365 ) = ( 1 ∑ 364<br />
365 i=0 s i − K) + correspond à une option<br />
d’achat asiatique où la moy<strong>en</strong>ne continue du sous-jac<strong>en</strong>t 1 ∫ T<br />
T 0<br />
S udu a été remplacée par<br />
une moy<strong>en</strong>ne discrète.<br />
Notons r le taux d’intérêt instantané que nous supposerons constant dans ce projet. Le<br />
prix à l’instant 0 ≤ t ≤ T , avec t i ≤ t < t i+1 d’une telle option est donné par<br />
v(t, S t0 , . . . , S ti , S t ) = e −r(T −t) E(ϕ(S t0 , S t1 , . . . , S tN )|F t )<br />
Cette quantité sera calculée par une méthode de <strong>Monte</strong> <strong>Carlo</strong>.<br />
1
Prix à l’instant 0<br />
l’instant 0<br />
On approche v(0, S 0 ) par<br />
Attardons nous un instant sur le cas particulier du calcul du prix à<br />
v(0, S 0 ) = e −rT E(ϕ(S t0 , S t1 , . . . , S tN ))<br />
e −rT<br />
1 M<br />
M∑<br />
j=1<br />
ϕ(S (j)<br />
t 0<br />
, S (j)<br />
t 1<br />
, . . . , S (j)<br />
t N<br />
)<br />
où les N−uplets (S (j)<br />
t 0<br />
, S (j)<br />
t 1<br />
, . . . , S (j)<br />
t N<br />
) pour j = 1, · · · , M sont i.i.d selon la loi de<br />
(S t0 , S t1 , . . . , S tN ).<br />
Prix à un instant t > 0 Le calcul du prix à l’instant t est légèrem<strong>en</strong>t plus compliqué car il<br />
faut calculer une espérance conditionnelle. Une manière de faire est de réécrire le sous-jac<strong>en</strong>t<br />
S t+u pour u > 0 comme une fonction de S t et d’une quantité indép<strong>en</strong>dante de F t . Dans le<br />
cas du modèle de Black Scholes <strong>en</strong> dim<strong>en</strong>sion 1, on remarque facilem<strong>en</strong>t que<br />
S t+u = S t e (r−σ2 /2)u+σ(W t+u −W t) = S t ˜Su (1)<br />
où ˜S indép<strong>en</strong>dant de F t et la dynamique de ˜S est donnée par<br />
˜S u = e (r−σ2 /2)u+σ ˜W u<br />
où ˜W est un mouvem<strong>en</strong>t Browni<strong>en</strong> réel standard indép<strong>en</strong>dant de F t . Remarquons que ˜S est<br />
un processus de Markov de même noyau de transition que S mais de valeur initiale 1. Ainsi<br />
le prix à l’instant t se réécrit<br />
v(t, S t0 , . . . , S ti , S t ) = e −r(T −t) E(ϕ(s t0 , . . . , s ti , s t ˜Sti+1 −t, . . . , s t ˜StN −t)) ∣ ∣ ∣∣∣ s tk = S tk , k = 0, · · · , i<br />
s t = S t<br />
(2)<br />
Les lettres s minuscules désign<strong>en</strong>t des variables déterministes. On peut alors approcher le prix<br />
à l’instant t par la moy<strong>en</strong>ne <strong>Monte</strong> <strong>Carlo</strong> suivante<br />
e −r(T −t) 1<br />
M<br />
M∑<br />
j=1<br />
ϕ(s t0 , s t1 , . . . , s ti , s ˜S(j) t t i+1 −t , . . . , s (j)<br />
t ˜S t N −t ) (3)<br />
(j)<br />
(j)<br />
où les N−uplets ( ˜S t i+1 −t , . . . , ˜S t N −t ) sont i.i.d selon la loi de (S t i+1 −t, . . . , S tN −t). Les<br />
quantités (s t0 , s t1 , . . . , s ti , s t ) représ<strong>en</strong>t<strong>en</strong>t les valeurs réellem<strong>en</strong>t observées jusqu’à l’instant t<br />
sur la trajectoire du sous-jac<strong>en</strong>t sur laquelle on souhaite calculer le prix de l’option. D’un<br />
point du vue pratique, les valeurs (s t0 , s t1 , . . . , s ti , s t ) sont les cotations du sous-jac<strong>en</strong>t<br />
observées sur le marché jusqu’à la date t.<br />
2 Modèle de Black Scholes multidim<strong>en</strong>sionnel<br />
Considérons D actifs évoluant chacun selon un modèle de Black Scholes de dim<strong>en</strong>sion 1<br />
et corrélés <strong>en</strong>tre eux. La dynamique S de ces D actifs s’écrit<br />
S d t = S d 0 e (r−(σd ) 2 /2)t+σ d B d t , d = 1 . . . D (4)<br />
2
où r est le taux d’intérêt, (σ 1 , . . . , σ D ) sont les volatilités de chacun des actifs et B =<br />
(B 1 , . . . , B D ) T est un vecteur de D mouvem<strong>en</strong>ts Browni<strong>en</strong>s standards et réels de matrice<br />
de corrélation Cov(B t , B t ) = Γt définie par Cov(Bt, i B j t ) = Γ ijt = ρt pour tout i ≠ j et<br />
Γ ii = 1. Le paramètre ρ doit être choisi dans ] − 1<br />
D−1<br />
, 1[ de telle sorte que Γ soit définie positive<br />
pour assurer que le marché soit complet. Att<strong>en</strong>tion B n’est pas un mouvem<strong>en</strong>t Browni<strong>en</strong><br />
standard à valeurs dans R D car ses composantes ne sont pas indép<strong>en</strong>dantes mais on peut le<br />
réécrire <strong>en</strong> utilisant un mouvem<strong>en</strong>t Browni<strong>en</strong> standard à valeurs dans R D , noté dans la suite<br />
W = (W 1 , . . . , W d ) T et qui sera vu comme un vecteur colonne. Ainsi on a l’égalité <strong>en</strong> loi<br />
(B t , t ≥ 0) = (LW t , t ≥ 0) pour tout t ≥ 0 où L est la factorisée de Cholesky de la matrice Γ,<br />
.i.e Γ = L ′ L avec L triangulaire inférieure. L’équation (4) se réécrit alors<br />
S d t = S d 0 e (r−(σd ) 2 /2)t+σ d L d W t<br />
,<br />
d = 1 . . . D<br />
où L d est la ligne d de la matrice L. Ainsi la quantité L d W t est bi<strong>en</strong> un réel. De cette équation,<br />
on remarque facilem<strong>en</strong>t que l’on peut déduire<br />
S d t i+1<br />
= S d t i<br />
e (r−(σd ) 2 /2) T N +σd L d (W ti+1 −W ti ) ,<br />
S d t i+1<br />
= S d t i<br />
e (r−(σd ) 2 /2) T N +σd√ T<br />
N Ld G i+1<br />
,<br />
d = 1 . . . D<br />
d = 1 . . . D<br />
où la suite (G i ) i≥1 une suite i.i.d de vecteurs gaussi<strong>en</strong>s c<strong>en</strong>trés de matrice de covariance<br />
id<strong>en</strong>titée. Ainsi pour simuler le processus S sur la grille (t i ) i=0,...,N il suffit de savoir simuler<br />
des vecteurs gaussi<strong>en</strong>s c<strong>en</strong>trés de matrice de covariance id<strong>en</strong>tité.<br />
Vous avez vu <strong>en</strong> cours de Finance qu’il était possible de construire un portefeuille de<br />
couverture pour les options d’achat et de v<strong>en</strong>te dans le modèle de Black Scholes <strong>en</strong> dim<strong>en</strong>sion<br />
1. Ce portefeuille de couverture est <strong>en</strong>tièrem<strong>en</strong>t déterminé par la quantité d’actifs risqués à<br />
posséder à chaque instant t qui est donnée par la dérivée du prix par rapport à S t , i.e<br />
∂v(t, S t0 , · · · , S ti , S t )<br />
∂S t<br />
Cette théorie est <strong>en</strong> fait valable bi<strong>en</strong> au delà des options d’achat et de v<strong>en</strong>te, elle est connue<br />
sous le nom de couverture <strong>en</strong> delta. Dans ce projet, nous l’appliquerons à d’autres produits<br />
bi<strong>en</strong> plus complexes. Ces quantités sont connues sous le nom de delta de l’option et sont <strong>en</strong><br />
pratique approchées par une méthode de différ<strong>en</strong>ces finies<br />
e−r(T −t)<br />
M2s t h<br />
M∑<br />
j=1<br />
(<br />
(j)<br />
ϕ(s t0 , s t1 , . . . , s ti , s t (1 + h) ˜S t i+1 −t , . . . , s (j)<br />
t(1 + h) ˜S t N −t )<br />
)<br />
(j)<br />
−ϕ(s t0 , s t1 , . . . , s ti , s t (1 − h) ˜S t i+1 −t , . . . , s (j)<br />
t(1 − h) ˜S t N −t )<br />
(5)<br />
(j)<br />
(j)<br />
où les N−uplets ( ˜S t i+1 −t , . . . , ˜S t N −t ) sont i.i.d selon la loi de (S t i+1 −t, . . . , S tN −t).<br />
Pour un produit faisant interv<strong>en</strong>ir D sous-jac<strong>en</strong>ts, son portefeuille de couverture conti<strong>en</strong>t<br />
les D actifs et la quantité d’actifs d à dét<strong>en</strong>ir à l’instant t est donnée par<br />
∂v(t, S t0 , · · · , S ti , S t )<br />
∂S d t<br />
3
3 Pricer <strong>Monte</strong> <strong>Carlo</strong> générique<br />
3.1 Calcul des prix<br />
L’ambition de cette partie est d’écrire un outil permettant de <strong>pricer</strong> n’importe quel produit<br />
dans un modèle de Black Scholes de dim<strong>en</strong>sion 1 ou plus <strong>en</strong> ne spécifiant que 2 choses : le<br />
payoff de l’option et la manière de générer une trajectoire du modèle.<br />
Votre <strong>pricer</strong> devra cont<strong>en</strong>ir les classes suivantes<br />
class BS {<br />
int size_; /*! nombre d’actifs du modèle */<br />
double r_; /*! taux d’intérêt */<br />
double rho_; /*! paramètre de corrélation */<br />
int dates_; /*! nombre de dates de constatation<br />
redondant avec Option::dates_ */<br />
Dvector sigma_; /*! volatilités */<br />
Dvector spot_; /*! valeurs initiales du sous-jac<strong>en</strong>t */<br />
/**<br />
* Génère une trajectoire du modèle et la stocke dans path<br />
*<br />
* @param path (output) conti<strong>en</strong>t une trajectoire du modèle. C’est une matrice<br />
* de taille d x (N+1)<br />
*/<br />
void asset (Dmatrix &path) ;<br />
}<br />
class Option {<br />
double T_; /*! maturité */<br />
int dates_; /*! nombre de dates de constatation<br />
(supposées équi-réparties)*/<br />
int size_; /* dim<strong>en</strong>sion du modèle, redondant avec BS::size_ */<br />
/**<br />
* Calcul la valeur du payoff sur la trajectoire passée <strong>en</strong> paramètre<br />
*<br />
* @param path (input) est une matrice de taille d x (N+1) cont<strong>en</strong>ant une<br />
* trajectoire du modèle telle que créée par la fonction asset.<br />
* @return phi(trajectoire)<br />
*/<br />
virtual double payoff (const Dmatrix &path) = 0;<br />
}<br />
class <strong>Monte</strong><strong>Carlo</strong> {<br />
BS *mod_; /*! pointeur vers le modèle */<br />
Option *opt_; /*! pointeur sur l’option */<br />
double h_; /*! pas de différ<strong>en</strong>ce finie */<br />
int TimeSteps_; /*! nombre de pas de temps de discrétisation */<br />
int samples_; /*! nombre de tirages <strong>Monte</strong> <strong>Carlo</strong> */<br />
}<br />
4
De la classe Option vont dériver toutes les classes implém<strong>en</strong>tant une option particulière. Voici<br />
une liste de produits à implém<strong>en</strong>ter<br />
– call/put <strong>en</strong> dim<strong>en</strong>sion 1.<br />
– option asiatique <strong>en</strong> dim<strong>en</strong>sion 1<br />
– option barrière <strong>en</strong> 1<br />
– option d’achat ou de v<strong>en</strong>te sur panier <strong>en</strong> dim<strong>en</strong>sion D de payoff<br />
( D<br />
)<br />
∑<br />
ϕ(S T ) = λ d ST d − K<br />
d=1<br />
où les λ d sont les poids de chacun des actifs dans le panier. Vous pourrez considérer que<br />
les coeffici<strong>en</strong>ts λ d peuv<strong>en</strong>t être négatifs de même que K pour gérer le cas des options<br />
de v<strong>en</strong>te égalem<strong>en</strong>t.<br />
– option sur panier à barrière <strong>en</strong> dim<strong>en</strong>sion D avec monitoring discret<br />
( D<br />
)<br />
∑<br />
ϕ(S t0 , · · · , S tN ) = λ d ST d − K<br />
d=1<br />
+<br />
+<br />
1 {∀1≤d≤D,∀0≤j≤N, L d ≤S d t j<br />
}<br />
où le vecteur L est une barrière basse. Vous pouvez considérer le même g<strong>en</strong>re de produit<br />
avec une barrière haute égalem<strong>en</strong>t.<br />
Prix à l’instant 0 Dans un premier temps, on se limitera au calcul du prix à l’instant<br />
0. Implém<strong>en</strong>ter la méthode price à la classe <strong>Monte</strong><strong>Carlo</strong> permettant de calculer par une<br />
méthode de <strong>Monte</strong> <strong>Carlo</strong> le prix à l’instant 0 d’une option. Cette fonction calculera égalem<strong>en</strong>t<br />
la largeur de l’intervalle de confiance de l’estimateur à 95%. On rappelle que la variance de<br />
l’estimateur peut être approchée par<br />
ξ 2 M = e −2rT ⎡<br />
⎢<br />
⎣ 1 M<br />
M∑<br />
(ϕ(S (j)<br />
t 0<br />
j=1<br />
, S (j)<br />
t 1<br />
, . . . , S (j)<br />
⎛<br />
t N<br />
)) 2 − ⎝ 1 M<br />
M∑<br />
j=1<br />
ϕ(S (j)<br />
t 0<br />
et que l’intervalle de confiance à 95% est alors donné par<br />
⎡<br />
⎤<br />
⎣e −rT 1 M∑<br />
ϕ(S (j)<br />
t<br />
M<br />
0<br />
, S (j)<br />
t 1<br />
, . . . , S (j)<br />
t N<br />
) ± 1.96ξ M<br />
√ ⎦<br />
M<br />
j=1<br />
, S (j)<br />
t 1<br />
, . . . , S (j)<br />
⎞<br />
t N<br />
) ⎠2 ⎤ ⎥ ⎦<br />
/**<br />
*<br />
* Calcul du prix de l’option à la date 0<br />
*<br />
* @param prix (ouptut) conti<strong>en</strong>t le prix<br />
* @param ic (ouptut) conti<strong>en</strong>t la largeur de l’intervalle de confiance<br />
* sur le calcul du prix<br />
*/<br />
void price (double &prix, double &ic);<br />
Cette méthode price devra faire appel aux méthodes asset et payoff.<br />
5
Prix à un instant t > 0 Un fois le calcul du prix à l’instant 0 testé et validé, vous<br />
pourrez passer au calcul à tout instant t > 0.<br />
Pour ce faire, il faut être capable de calculer l’espérance définie par l’équation (2) <strong>en</strong><br />
utilisant l’estimateur (3). Cette espérance peut-être calculée par une méthode de <strong>Monte</strong> <strong>Carlo</strong><br />
standard pourvu que l’on soit capable de générer des trajectoires i.i.d selon la loi conditionnelle<br />
de S sachant F t , i.e. grâce à la propriété (1) des trajectoires de la forme<br />
Ajouter à la classe BS la méthode<br />
(s t0 , s t1 , . . . , s ti , s ˜S(j) t t i+1 −t , . . . , s (j)<br />
t ˜S t N −t )<br />
/**<br />
*<br />
* Calcule une trajectoire du sous-jac<strong>en</strong>t connaissant le<br />
* passé jusqua’ à la date t<br />
*<br />
* @param path (output) conti<strong>en</strong>t une trajectoire du sous-jac<strong>en</strong>t<br />
* donnée jusqu’à l’instant t par la past<br />
* @param t (input) date jusqu’à laquelle on connait la trajectoire<br />
* t n’est pas forcém<strong>en</strong>t une date de discrétisation<br />
* @param past (input) trajectoire réalisée jusqu’a la date t<br />
*/<br />
void asset (const Dmatrix &path, double t, Dmatrix &past);<br />
Cette méthode génère une trajectoire où la matrice past conti<strong>en</strong>t toute l’information<br />
du passé par rapport auquel on conditionne jusqu’à l’instant t, i.e les valeurs de<br />
s t0 , s t1 , . . . , s ti , s t . La trajectoire générée est stockée dans la variable path.<br />
A ce stade, nous pouvons ajouter une nouvelle méthode <strong>Monte</strong><strong>Carlo</strong>::price permettant<br />
de calculer le prix à l’instant t.<br />
/**<br />
*<br />
* Calcul du prix de l’option à la date t<br />
*<br />
* @param past (input) conti<strong>en</strong>t la trajectoire du sous-jac<strong>en</strong>t<br />
* jusqu’à l’instant t<br />
* @param t (input) date à laquelle le calcul est fait<br />
* @param prix (ouptut) conti<strong>en</strong>t le prix<br />
* @param ic (ouptut) conti<strong>en</strong>t la largeur de l’intervalle de confiance<br />
* sur le calcul du prix<br />
*/<br />
void price (const Dmatrix &past, double t, double &prix, double &ic);<br />
3.2 Calcul du delta<br />
Dans cette partie, on cherche à écrire une méthode <strong>Monte</strong><strong>Carlo</strong>::delta qui calcule le delta<br />
de l’option à un instant t à partir de la formule (5). Remarquons dans cette formule qu’il faut<br />
6
être capable de simuler 2 trajectoires utilisant les mêmes aléas Browni<strong>en</strong>s mais shiftées l’une<br />
par rapport à l’autre. Considérons une trajectoire (s t0 , s t1 , . . . , s ti , s ˜S(j) t t i+1 −t , . . . , s (j)<br />
t ˜S t N −t ), nous<br />
souhaitons à partir de cette trajectoire construire pour d = 1 . . . D les trajectoires<br />
où<br />
(s t0 , s t1 , . . . , s ti , g+(s d (j)<br />
t ) ˜S t i+1 −t , . . . , gd (j)<br />
+(s t ) ˜S t N −t )<br />
(s t0 , s t1 , . . . , s ti , g−(s d (j)<br />
t ) ˜S t i+1 −t , . . . , gd (j)<br />
−(s t ) ˜S t N −t )<br />
⎛<br />
g+(x) d =<br />
⎜<br />
⎝<br />
x 1<br />
.<br />
x d−1<br />
x d (1 + h)<br />
x d+1<br />
.<br />
x D<br />
⎞<br />
⎟<br />
⎠<br />
⎛<br />
g−(x) d =<br />
⎜<br />
⎝<br />
x 1<br />
.<br />
x d−1<br />
x d (1 − h)<br />
x d+1<br />
Pour ce faire, nous pouvons créer une nouvelle méthode BS::shift_asset.<br />
/**<br />
*<br />
* Shift d’une trajectoire du sous-jac<strong>en</strong>t<br />
*<br />
* @param path (input) conti<strong>en</strong>t <strong>en</strong> input la trajectoire<br />
* du sous-jac<strong>en</strong>t<br />
* @param shift_path (output) conti<strong>en</strong>t la trajectoire path<br />
* dont la composante d a été shiftée par (1+h) à partir de la date t.<br />
* @param t (input) date à partir de laquelle on shift<br />
* @param h (input) pas de différ<strong>en</strong>ces finies<br />
* @param d (input) indice du sous-jac<strong>en</strong>t à shifter<br />
*/<br />
void shift_asset (Dmatrix &_shift_apth, const Dmatrix &path,<br />
double h, double t, int d);<br />
Il ne reste vous plus <strong>en</strong>suite qu’à écrire sur le principe des méthodes <strong>Monte</strong><strong>Carlo</strong>::price une<br />
méthode <strong>Monte</strong><strong>Carlo</strong>::delta<br />
/**<br />
*<br />
* Calcul du delta de l’option à la date t<br />
*<br />
* @param past (input) conti<strong>en</strong>t la trajectoire du sous-jac<strong>en</strong>t<br />
* jusqu’à l’instant t<br />
* @param t (input) date à laquelle le calcul est fait<br />
* @param prix (ouptut) conti<strong>en</strong>t le prix<br />
* @param ic (ouptut) conti<strong>en</strong>t la largeur de l’intervalle de confiance<br />
* sur le calcul du delta<br />
*/<br />
void delta (const Dmatrix &past, double t, double &delta, double &ic);<br />
.<br />
x D<br />
⎞<br />
⎟<br />
⎠<br />
7
4 Simulation de la couverture<br />
Pour les pratici<strong>en</strong>s de la finance, parmi les critères qui intervi<strong>en</strong>n<strong>en</strong>t dans le choix d’un<br />
modèle plutôt qu’un autre, la répartition du P&L (Profit and Loss, i.e. erreur de couverture)<br />
joue un rôle tout à fait c<strong>en</strong>tral. Un modèle est jugé sur sa bonne capacité à couvrir les produits<br />
exotiques.<br />
Maint<strong>en</strong>ant que nous avons implém<strong>en</strong>té un <strong>pricer</strong> <strong>Monte</strong> <strong>Carlo</strong> capable de calculer les prix<br />
et les deltas de produits financiers à n’importe quelle date <strong>en</strong>tre 0 et la maturité T du produit,<br />
nous allons créer un nouvel outil qui va repr<strong>en</strong>dre la classe BS précédemm<strong>en</strong>t écrite à laquelle<br />
il faut rajouter le vecteur membre tr<strong>en</strong>d qui représ<strong>en</strong>te le paramètre µ apparaissant dans<br />
la dynamique du modèle de Black Scholes lorsque celle-ci est exprimée sous la probabilité<br />
historique et non sous la probabilité risque neutre.<br />
S d t = S d 0 e (µd −(σ d ) 2 /2)t+σ d L d W t<br />
,<br />
d = 1 . . . D<br />
Ajouter la méthode simul_market à la classe BS r<strong>en</strong>voyant une simulation du marché (c’est<br />
à dire une simulation du modèle sous la probabilité historique) avec un nombre de dates H,<br />
typiquem<strong>en</strong>t on pr<strong>en</strong>dra une date par jour ou par semaine. Le long de cette trajectoire, calculer<br />
le prix et le delta à chaque date de simulation et construire le portefeuille de couverture.<br />
Notons p i et δ i les prix et deltas calculés le long de cette trajectoire alors l’évolution de la<br />
part investie au taux sans risque s’écrit.<br />
{<br />
V0 = p 0 − δ 0 S 0<br />
V i<br />
= V i−1 ∗ e r∗T<br />
H −(δ i − δ i−1 ) · S ti , i = 1, . . . , H<br />
L’erreur de couverture est donnée par P &L = V H + δ H S tH − payoff.<br />
5 Une suggestion de parser<br />
Le parser prés<strong>en</strong>té dans cette partie n’est qu’un exemple partiel de ce que vous devez<br />
implém<strong>en</strong>ter. Vous devrez selon toute vraisemeblance ajouter d’autres clés.<br />
Votre projet devra être alim<strong>en</strong>té par un fichier texte du type<br />
##ceci est un comm<strong>en</strong>taire<br />
option size 40<br />
strike 100<br />
spot 100<br />
maturity 3<br />
volatility 0.2<br />
interest rate 0.05<br />
correlation 0.2<br />
option type exchange<br />
payoff coeffici<strong>en</strong>ts 0.025<br />
TimeStep Number 20<br />
Sample Number 10000<br />
8
Il faut être capable de lire un tel fichier puis de remplir une pseudo table de hachage à partir<br />
des clés trouvées. Cette table est <strong>en</strong>suite utilisée pour initialiser le bon type d’option <strong>en</strong><br />
fonction de la ligne option type.<br />
Voici une suggestion pour réaliser cette tâche. Considérons la structure suivante<br />
typedef struct parameter_t{<br />
const char *key;<br />
int index;<br />
} HashParameter;<br />
HasParameter ParamTab[]={<br />
{"interest rate", 0},<br />
{"correlation", 1},<br />
{"spot", 2},<br />
{"maturity", 3},<br />
{"option size", 4},<br />
{"Sample Number", 5},<br />
{"Timestep Number", 6},<br />
{"payoff coeffici<strong>en</strong>ts", 7},<br />
{"strike", 8},<br />
{"barrier", 9},<br />
{"bs volatility", 10},<br />
/* ____ END _______ */<br />
{(char *) NULL, -1}<br />
};<br />
1. Lire le fichier dans un tableau de chaînes de caractères data de façon à pouvoir le<br />
parcourir facilem<strong>en</strong>t.<br />
2. Parcourir le tableau ParamTab et pour chaque clé chercher son occurr<strong>en</strong>ce dans le tableau<br />
data. Si elle est prés<strong>en</strong>te, extraire la valeur associée et la stocker dans un tableau de<br />
chaînes de caractères à la ligne indiquée par l’indice correspondant dans ParamTab.<br />
3. Pour la class BS et chacune des options, écrire un constructeur pr<strong>en</strong>ant <strong>en</strong> argum<strong>en</strong>t un<br />
tel tableau de chaînes de caractère et initialisant les différ<strong>en</strong>ts champs de la classe.<br />
Une solution plus sophistiquée consiterait à stocker les couples clé/valeur dans une véritable<br />
table de hachage mais il faudra pr<strong>en</strong>dre soin de garder le type de la valeur qui est variable<br />
(int, double, Dvector, string).<br />
9