Master Modélisation Aléatoire Paris VII, Cours Méthodes de Monte Carlo en nance et C++, TP n 2. Techniques de correction pour les options barrières 25 janvier 2007 Exercice à rendre individuellement lors du cours du 9 Février 2007. A joindre : - la rédaction de la partie mathématique ainsi que la justication des techniques employées pour la simulation. - les valeurs numériques obtenues et vos commentaires. - le listing du programme de simulation. 1 Partie mathématique Soit (Ω, F, (F t ) t 0, P) un espace de probabilité ltré muni d'un mouvement Brownien standard d-dimensionnel W. On considère un processus de dynamique X t = x + bt + σw t, b R d, σ R d R d, avec σσ symétrique dénie positive. Introduisons le demi-espace D := {y R d : n y + m > 0}, n R d, m R, et τ := inf{s 0 : X s D}. Pour x D, T > 0 déterministe, et une fonction de pay-o g donnés, on s'intéresse à l'approximation numérique de la quantité E x [g(x T )I τ>t ] associée au prix d'une option à barrières. On a ici aaire à une option path dependent, et il va donc falloir tenir compte de la trajectoire du processus. On dénit pour N N, h := T/N et τ N := inf{t i := ih, i N : X ti D}. On va tout d'abord dans cette partie prouver une majoration de l'erreur faible : à l'aide de techniques de calcul stochastique. 1.1 Résultats préliminaires Err(x, T, g, h) = E x [g(x T )(I τ N >T I τ>t )] Considérons d'abord le cas d = 1 = σ, b = 0 et D = R +. 1. Soit x D, A B(R + ), tribu borélienne de R +. A l'aide du principe de réexion pour le mouvement Brownien donner l'expression explicite de P x [X t A, τ > t] en terme de noyaux Gaussiens dont on précisera moyenne et variance. 2. Pour (t, x) [0, T ] D et g à croissance exponentielle, on dénit v(t, x) := E x [g(x T t )I τ>t t ]. Préciser l'edp satisfaite par v. 3. Montrer que v C 1,2 ([0, T ) D). Donner une condition sur g pour que v C 0 ([0, T ] D), puis pour que v C 2,4 ([0, T ] D). On entend par là que l'on peut prolonger de façon régulière les dérivées sur un voisinage de D. 1
4. Même question pour obtenir v C 2,4 b ([0, T ] D), i.e. la fonction ainsi que ses dérivées jusqu'à l'ordre indiqué sont bornées. Reprendre les questions précédentes dans le cas plus général introduit ci-avant. 1.2 Analyse de l'erreur i=0 N 1 1. Montrer que Err(x, t, g, h) = E[I τ N >t i (v(t i+1, Π D(X ti+1 )) v(t i, X ti ))] où Π D désigne la projection sur l'adhérence de D. 2. En supposant désormais que les hypothèses garantissant que v C 2,4 b ([0, T ] D) sont vériées, déduire de l'application d'une formule de Taylor à l'ordre 3 Err(x, t, g, h) = N 1 E x [I τ N >t i ( v(t i, X ti ) nf (X ti+1 ) + O(F (X ti+1 ) X ti+1 X ti ) i=0 ) +O((F (X ti+1 ) 2 ) + O(h 2 ) ]. (1) où F (x) = d(x, D)I x D d(x, D)I x D est la distance signée au bord du domaine. On pourra utiliser que Π D(X ti+1 ) = X ti+1 + nf (X ti+1 ). 3. En notant τ ti := inf{s t i : X s D}, établir C > 0, P[τ ti < t i+1 F ti ] CP[X ti+1 D F ti ]. 4. A l'aide de contrôles usuels sur le Brownien déduire du résultat précédent que Err(x, t, g, h) C h. Il existe en fait, sous de bonnes hypothèses, un développement de l'erreur de la forme Err(x, t, g, h) = C h + o( h), C = C 0 σ n E[I τ<t v(τ, X τ ) n], C 0 =.5823. On peut renvoyer aux travaux de Siegmund, [Sie79], pour des précisions sur la nature de la constante C 0 σ n. Il s'agit de l'espérance de l'overshoot normalisé, i.e. distance à la frontière lorsque le processus sort du domaine à temps discret divisé par h. Le développement d'erreur précédent justie l'utilisation d'une méthode d'extrapolation de type Romberg pour améliorer la convergence. La connaissance explicite de C 0 permet par ailleurs de proposer une méthode alternative basée sur la correction de domaine. Précisément, on va restreindre le domaine de sorte à compenser la surestimation due au temps discret. Introduisons D N := {y R d : y n + m > C 0 h σ n }, τ N D N := inf{t i : X N t i D N }. On a en fait le résultat suivant : E[g(X T )(I τ N DN >T I τ>t )] = o( h). (2) Dans un contexte d'application nancière, cette identité est présentée dans [BGK97]. Dans la suite du TP on s'attachera à mettre en oeuvre les diérentes techniques de simulation suggérées par ces résultats : simulation naive, simulation par ponts browniens, extrapolation de Romberg, technique de correction dérivant de (2). 2 Partie mise en oeuvre en C++ On va ici compléter les classes introduites lors du TP précédent pour évaluer des quantités de type Q T = E x [f(s T )I τ>t ] où S t = S 0 exp(σw t + (r σ2 )t), avec 2 (W t) t 0 mouvement Brownien monodimensionnel, τ := inf{t 0 : S t D}, D ouvert connexe de R. La fonction f sera supposée à croissance polynomiale. On rappelle que l'on a ici aaire à une option path dependent. Il va donc falloir tenir compte de la trajectoire de l'actif. A ce propos on va introduire un ensemble de classes pour simuler des processus stochastiques à valeurs réelles. 2
2.1 Classes associées à des processus aléatoires On va tout d'abord créer une classe abstraite Process dérivant de Loi_Proba et de prototype class Process: public Loi_Proba{ protected: int N; double T,DT; Process(double Ti=1,double DTi=.01); virtual double getincrement() const=0; virtual double getfinalvalue() const=0; double Simule() const{return getfinalvalue();} où T>0 désigne le temps terminal jusqu'auquel on souhaite observer le processus en partant de 0, DT est le pas de discrétisation et N le nombre de pas de discrétisation sur l'intervalle [0,T]. La méthode getincrement() renverra pour un processus X donné une réalisation de X ti+1 X ti pour i [0, N 1]. La méthode getfinalvalue() renverra une réalisation de X T. Question 1. Ecrire les constructeurs de la classe Process. Question 2. Faire dériver de Process une classe Brownian. On suggère d'utiliser le prototype suivant : class Brownian: public Process{ Normale No; Brownian(double Ti=1,double DTi=.01); double getincrement() const; double getfinalvalue() const; Implémenter les méthodes de la partie publique de cette classe. Question 3. Faire dériver de Process une classe Geometric_Brownian, de prototype : class Geometric_Brownian: public Process{ Brownian B; double sigma, r, S0; Geometric_Brownian(double S0i=100,double sigmai=.15, double r=.02, double Ti=1, double DTi=.01); double getincrement() const; double getfinalvalue() const; Implémenter les méthodes de cette classe. 2.2 Options et héritage Nous allons dans cette partie décrire et implémenter un ensemble de classes pour estimer des prix d'options par méthode de Monte Carlo dans un modèle de Black et Scholes. La classe de base pour cela sera 3
OptionBS:public Loi_Proba{ protected: double r,t; // On peut considérer que le taux d'actualisation et la maturité // sont des données de l'option. Geometric_Brownian GB; PayOff & PO; OptionBS(PayOff & POi,double S0i=100,double sigmai=.15, double ri=.02, double Ti=1, double DTi=.01); C'est là une classe abstraite, i.e. on n'y implémente pas la méthode Simule de Loi_Proba dont la classe OptionBS dérive. A titre indicatif, la classe VanillaOptionBS du TP précédent devrait maintenant dériver de OptionBS. Question 1. On va écrire une classe BarrierOptionBS dérivant de OptionBS de prototype class BarrierOptionBS:public OptionBS{ double borne_gauche, borne_droite; BarrierOptionBS(double bg, double bd, PayOff & POi, double SOi=100, double sigmai=.15, double r=.02, double Ti=1, double DT=.01); double Simule() const; où D = (borne_gauche,borne_droite). Implémenter les méthodes précédentes. On utilisera pour cela la discrétisation naïve du temps de sortie qui consiste à observer si la trajectoire est hors du domaine à un des instants de discrétisation. Question 2. A l'aide de la procédure de simulation élémentaire précédente, mettre en évidence numériquement l'identité E[f(S T )I τ N >T ] E[f(S T )I τ>t ] = C DT + o( DT) où τ N := inf{t i = ih : S ti D}, pour f(x) = (x K) +, D = (0, B), K < B. On pourra utiliser que l'expression explicite du prix, cf. [MR97], est dans ce cas donnée par ( E[f(S T )I τ>t ] = S 0 exp(rt ) N (d 1 (K, S 0, σ, r, T )) N (d 1 (B, S 0, σ, r, T )) ( B + K S 0 ) 2r σ 2 +1 ( N (2 ˆd2 (B, S 0, σ, r, T ) ˆd 2 (K, S 0, σ, r, T )) N ( ˆd 2 (B, S 0, σ, r, T )) )) ( N (d 2 (K, S 0, σ, r, T )) N (d 2 (B, S 0, σ, r, T )) ( ) 2r B σ + 2 1 ( N (2 ˆd1 (B, S 0, σ, r, T ) S ˆd 1 (K, S 0, σ, r, T )) N ( ˆd 1 (B, S 0, σ, r, T )) )) 0 où N (x) = P[N (0, 1) x], d 1 (x, S 0, σ, r, T ) = log(s0/x)+rt σ + 1 T 2 σ T, ˆd 1 (x, S 0, σ, r, T ) = d 1 (x, S 0, σ, r, T ) 2r σ T, et d2 (x, S 0, σ, r, T ) = d 1 (x, S 0, σ, r, T ) σ T, ˆd 2 (x, S 0, σ, r, T ) = d 2 (x, S 0, σ, r, T ) 2r σ T. On prendra S 0 = 100, B = 130, K = 90, σ =.15, r =.02. On fera varier le nombre N de pas de discrétisation en faisant bien attention à équilibrer erreur statistique associée à la méthode de Monte Carlo, dirigée par le théorème central limite, et erreur de discrétisation que l'on cherche à mettre en évidence. 4
Question 3. Implémenter la méthode de simulation qui utilise la probabilité qu'un pont Brownien ait dépassé un certain seuil entre deux instants de discrétisation. On suggère pour cela d'ajouter dans la partie publique de la classe Brownian une fonction de prototype static double ProbBrownBridgeBigger(double B, double xi, double xip1, double h) ; qui renvoie P[sup s [0,h] W s B W 0 = xi, W h = xip1]. Ecrire une fonction double SimuleBB() const dans la partie publique de BarrierOptionBS utilisant cette probabilité dans les cas où D = (0, B) ou D = (B, + ). Etudier l'impact de la discrétisation en temps par cette technique. Estimer le gain associé en terme de vitesse de convergence. Question 4. Implémenter les méthodes d'extrapolation de Romberg et de correction de domaine introduites en Section 1. Commenter les résultats. Question 5. An de permettre à l'utilisateur de choisir entre les diérentes méthodes de simulation on va utiliser des pointeurs sur fonctions et surcharger les constructeurs. 1. Introduire une variable double (BarrierOptionBS::*PTR_Simule) () const ; dans la partie privée de BarrierOptionBS. La variable PTR_Simule est un pointeur de fonction. Il ne peut pointer que des fonctions const de la classe BarrierOptionBS n'ayant pas d'arguments, et renvoyant un double. L'aectation de ce type de variables se fait de la façon suivante : PTR_Simule=& BarrierOptionBS::SimuleBB ; 2. Modier les constructeurs de cette classe en ajoutant un champ int FLAG, qui prendra les valeurs 0,1,2,3 en fonction de la technique retenue par l'utilisateur. - 0 : simulation naive. - 1 : simulation par ponts Browniens. - 2 : extrapolation de Romberg. - 3 : correction de domaine. 3. Modier la fonction Simule qui devient double BarrierOptionBS::Simule() const { return (this->*ptr_simule)(); } Mettre enn les diérentes méthodes de simulation dans la partie privée de la classe. Ces dernières ne sont ainsi plus directement accessibles à l'utilisateur. Références [BGK97] M. Broadie, P. Glasserman, and S. Kou. A continuity correction for discrete barrier options. Mathematical Finance, 7 :325349, 1997. [MR97] M. Musiela and M. Rutkowski. Martingale methods in nancial modelling. Springer, 1997. [Sie79] D. Siegmund. Corrected diusion approximations in certain random walk problems. Adv. in Appl. Probab., 11(4) :701719, 1979. 5