aboutsummaryrefslogtreecommitdiffstats
path: root/option.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'option.cpp')
-rw-r--r--option.cpp42
1 files changed, 19 insertions, 23 deletions
diff --git a/option.cpp b/option.cpp
index 5caf23f..87aeca6 100644
--- a/option.cpp
+++ b/option.cpp
@@ -4,32 +4,33 @@
#include <algorithm>
#include <iostream>
-double r;
-double T;
-double S0;
-double V;
-int d;
+struct option_param {
+ double r;
+ double T;
+ double S0;
+ double V;
+ int d;
+};
-std::vector<double> path_gen(std::vector<double> X){
- d=X.size();
- std::vector<double> S(d);
- S[0]= S0;
- for(int i=1;i<d;i++){
- S[i]=S[i-1]*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*X[i]);
+std::vector<double> path_gen(std::vector<double> X, option_param *p){
+ std::vector<double> S(p->d);
+ S[0]= p->S0;
+ for(int i=1;i<p->d;i++){
+ S[i]=S[i-1]*exp((p->r-p->V*p->V/2)*(p->T/p->d)+p->V*sqrt(p->T/p->d)*X[i]);
}
return S;
}
-double mean_monte_carl(double r, double T, double S0, double V, int N, int d){
+double mean_monte_carl(option_param* p, int N){
double moyenne=0;
gaussian G;
- std::vector<double> S(d);
- std::vector<double> X(d);
+ std::vector<double> S(p->d);
+ std::vector<double> X(p->d);
for(int i=1; i<N; i++){
- for(int j=1;j<d;i++){
+ for(int j=1;j<p->d;i++){
X[i]=G();
}
- S=path_gen(X);
+ S=path_gen(X, p);
moyenne+=std::accumulate(S.begin(), S.end(), 0 );
}
return moyenne/N;
@@ -37,15 +38,10 @@ double mean_monte_carl(double r, double T, double S0, double V, int N, int d){
int main(){
init_alea(0);
- double r=0.05;
- double T=1.0;
- double S0=50.0;
- double V=0.1;
- int d=16;
+ option_param* p = {.r=0.05, .T=1.0, .S0=50.0, .V=0.1, .d=16};
int N=1000000;
-
- double moyenne = mean_monte_carl(r, T, S0, V, N, d);
+ double moyenne = mean_monte_carl(p, N);
std::cout<<moyenne<<std::endl;