Bonjour,
Je fais un programme qui est lié à de la finance, on calcule entre autre un brownien, etc...
Dans ce programme, je dois faire appel à la fonction rand(), et donc à la fonction srand().
Voici le programme :
L'initialisation de srand() est faite dans le main par la commande : srand(time(NULL));
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 #include <iostream> #include <cmath> #include <fstream> #include <time.h> using namespace std; const int M=365; const double sigma=0.2,r=0.1; const double dt=1.0/(double)M; //const double pi=M_PI; const double pi=3.14159265; const double pi4=4.0*pi; const double sdt=sqrt(dt); double S[M]; double Sinitial; double T=1; // 1 année ==> pas sur ! double K=100; int N=2000; double maximum(double a, double b) { if(a>b) return a; else return b; } double gauss(){ double x,y,z; x=(rand())/((double)RAND_MAX); y=(rand())/((double)RAND_MAX); z=sqrt(-2.0*log(x))*cos(2.0*pi*y); return z; } void ED0stoch( const int m){ for(int i=0;i<m;i++){ S[i+1]=S[i]*(1.0+r*dt+gauss()*sdt); } } int main() { srand(time(NULL)); double P0=0; // Valeur du contrat double moy_ST=0; // moyenne des S_T cout<<"Entrez une valeur de S0 : "; cin>>Sinitial; S[0]=Sinitial; ED0stoch(M-1); cout<<endl; cout<< "Valeur de S au bout d'un an : "; cout<<S[M-1]<<endl; cout<<endl; for(int k=1;k<=N;k++) { //srand(time(NULL)); S[0]=Sinitial; ED0stoch(M-1); cout<<"S[M-1]="<<S[M-1]<<endl; P0=P0+exp(r*T)*maximum(K-S[M-1],0); cout<<P0 <<endl; moy_ST=moy_ST+S[M-1]; } P0=P0/N; cout<<" Valeur de P0="<<P0<<endl; cout<<" Moyenne des S[M-1] (=ST) : "<<moy_ST/N<<endl; ofstream ff("fichier.txt"); // stockage des données for(int i=0;i<M-1;i++) ff<<i<<" "<<S[i]<<endl; cout<<endl; cout<<"Les donnees sont stockees dans le fichier 'fichier.txt'"<<endl; return 0; }
Ensuite, je fais appel dans mon programme à une fonction EDOstoch qui aura besoin entre autre de rand().
Ce qui nous intéresse particulièrement est la valeur de S en M-1, c'est à dire S[M-1].
Mon problème vient lors de l'execution de la boucle suivante ( qui permet de calculer la valeur d'une option put européenne ) :
Si je mets un srand(time(NULL)); à l'intérieur de cette boucle, je vais avoir toujours le même résultat pour S[M-1], ce qui est logique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 for(int k=1;k<=N;k++) { //srand(time(NULL)); S[0]=Sinitial; ED0stoch(M-1); cout<<"S[M-1]="<<S[M-1]<<endl; P0=P0+exp(r*T)*maximum(K-S[M-1],0); cout<<P0 <<endl; moy_ST=moy_ST+S[M-1]; }
J'ai donc supprimé le srand à l'intérieur de la boucle, mais le problème c'est que j'ai des résultats étranges pour S[M-1] : certaines valeurs sont infinies.
Ma fonction EDOstoch semble marcher correctement, donc je pense que celà vient de l'utilisation de rand() et srand(), mais je n'en suis pas sur du tout.
Est ce qu'il y a quelque chose qui cloche dans mon programme avec l'utilisation de srand() et rand() ?
Je vous remercie.
Partager