independante call

Transcription

independante call
Université de Marne-la-Vallée
1er trimestre 2006/2007
Master "Mathématiques et Applications", 2ème année
Mise à niveau en C
TD 3 : Variables aléatoires et méthode de Monte-Carlo
Un algorithme efficace pour générer une suite de nombres pseudo-aléatoires ayant de bonnes propriétés statistiques est le « Mersenne Twister »1 développé par M. Matsumoto et T. Nishimura en 1997. Nous allons utiliser
leur programme tout au long de ce TD. Télécharger le fichier mt19937ar.tgz et décompresser-le en utilisant la
commande
> tar xvfz mt19937ar.tgz
dans le répertoire de votre choix.
1. Écrire le fichier d’en-tête (header) associé au fichier mt19937ar.c et écrire un programme de test qui initialise
le générateur aléatoire et qui simule n variables aléatoires uniformes sur [a, b].
Pour générer un couple de 2 gaussiennes indépendantes à partir d’un tirage de 2 uniformes, on peut utiliser les
algorithmes suivants :
– la transformation de Box-Müller (sous forme polaire) : soit U0 et U1 deux variables aléatoires indépendantes
uniformément distribuées sur ]0, 1] et Z0 et Z1 telles que
(
p
Z0 = −2 ln(U0 ) cos(2πU1 ),
p
Z1 = −2 ln(U0 ) sin(2πU1 ).
Alors Z0 et Z1 sont des variables aléatoires indépendantes suivant la loi normale centrée réduite.
– une méthode de rejet (à partir de le forme cartésienne de la transformation de Box-Müller) : soit X et Y
deux variables aléatoires indépendantes uniformément distribuées sur [−1, 1] et R tel que R = X 2 + Y 2 . Si
R ∈]0, 1], on pose

r

−2 ln(R)

Z0 = X
,
R
r

−2 ln(R)

Z1 = Y
,
R
sinon on retire X et Y tant que R = 0 ou R > 1. À la fin, Z0 et Z1 sont des variables aléatoires indépendantes
suivant la loi normale centrée réduite.
2. Écrire un fichier random.c contenant une implémentation de ces deux algorithmes et dont le fichier d’en-tête
random.h est le suivant :
2
# ifndef RANDOM_H
# define RANDOM_H
4
# include " mt19937ar . h "
6
8
double
double
double
double
GaussianBM ( double m , double s );
GaussianRJ ( double m , double s );
SRGaussianBM ( void );
SRGaussianRJ ( void );
// m : moyenne et s : variance
// centree reduite
10
# endif
3. Écrire un programme de test qui génère un échantillon n variables aléatoires indépendantes suivant la loi N (0, 1)
et qui renvoie la moyenne et la variance de cet echantillon.
Une autre méthode efficace pour générer une variable aléatoire gaussienne est l’algorithme « Ziggurat »de
G. Marsaglia et W.W. Tsang, cf. http://www.jstatsoft.org/v05/i08/ziggurat.pdf.
1 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
1
Nous allons maintenant programmer une méthode de Monte-Carlo générique en utilisant le type mc_dim1 défini
de cette façon (toujours dans le fichier random.h si vous voulez)
2
4
typedef struct {
int n ;
double mean ;
double var ;
} mc_dim1 ;
// nb d ’ iterations de la methode
// resultat de la methode
// variance de la methode
4. Écrire une fonction estimant E[f (Z)] par une méthode de Monte-Carlo. Cette fonction devra avoir le prototype
suivant
int MonteCarloDim1 ( fun_R_R *f , fun_void_R * generate , mc_dim1 * result );
où fun_R_R et fun_void_R sont des types de fonctions prédéfinis (cf. TD 2). Elle renvoit 1 si le calcul s’est bien
passé et 0 si il y a une erreur lors de l’initialisation du vecteur temporaire (nécessaire pour le calcul de la
variance). De plus, la variable result doit être modifiée et contenir le résultat.
5. Calculer en utilisant cette fonction le prix d’un Call européen de paramètres S0 , K, T , r, σ où
S0 = 100, K = 100, T = 1, r = 0.05, σ = 0.3.
Donner la variance et l’intervalle de confiance à 95%.
Calculer maintenant le prix du Call en utilisant la formule de parité Call-Put et en estimant le prix du Put par
Monte Carlo. Comparer la variance et la taille de l’intervalle de confiance.
6. Calculer le prix du Call en utilisant la formule Black Scholes. Rappel :
E[exp(−rT )(ST − K)+ ] = S0 N (d1 ) − exp(−rT )KN (d2 ),
où
d1 =
µ
¶
S0 ¡
σ2 ¢
ln
+ r+
T
K
2
σ T
1
√
2
√
et d2 = d1 − σ T .

Documents pareils