05.06.2015 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!