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