aboutsummaryrefslogtreecommitdiffstats
path: root/option.cpp
diff options
context:
space:
mode:
authorBertrand <bertrand.horel@gmail.com>2016-02-14 21:24:26 +0000
committerBertrand <bertrand.horel@gmail.com>2016-02-14 21:24:26 +0000
commit8fd762b2e427f62b531614e5e84dfbfb3b7fff37 (patch)
tree622500b8253ae47b68e0a6abd1144f00a889a8b4 /option.cpp
parent76c8cc513e49075e3b045c9517b19000976ac43d (diff)
downloadprojet_C++-8fd762b2e427f62b531614e5e84dfbfb3b7fff37.tar.gz
réécriture avec classe
Diffstat (limited to 'option.cpp')
-rw-r--r--option.cpp83
1 files changed, 40 insertions, 43 deletions
diff --git a/option.cpp b/option.cpp
index a104c19..deb8347 100644
--- a/option.cpp
+++ b/option.cpp
@@ -4,64 +4,61 @@
#include <algorithm>
#include <iostream>
-typedef struct option_param {
- double r;
- double T;
- double S0;
- double V;
- int d;
- double K;
-}option_param;
-
-std::vector<double> path_gen(std::vector<double> X, option_param *p){
- std::vector<double> S(p->d);
- S[0]= p->S0*exp((p->r-p->V*p->V/2)*(p->T/p->d)+p->V*sqrt(p->T/p->d)*X[0]);
- 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;
+template <typename L>
+std::vector<double> monte_carlo(int n, L X)
+{
+ std::vector<double> result(3,0);
+ double x;
+ for (int j = 0; j < n; j++) {
+ x = X();
+ result[0] += x;
+ result[1] += x*x;
+ }
+ result[0] /= (double) n;
+ result[1] = (result[1] - n*result[0]*result[0])/(double)(n-1);
+ result[2] = 1.96*sqrt(result[1]/(double) n);
+ return result;
}
double pos (double x){
return x>0?x:0;
}
-double pay_off (double mean, option_param* p){
- return exp(-p->r*p->T)*pos(mean-p->K);
-}
-
-std::pair<double,double> monte_carl(option_param* p, int N){
- double moyenne=0;
- double variance=0;
- gaussian G(0,1);
- double temp=0;
- std::vector<double> S(p->d);
- std::vector<double> X(p->d);
- for(int i=0; i<N; i++){
- for(int j=0;j<p->d;j++){
- X[j]=G();
+struct asian_option : public var_alea<double>
+{
+ asian_option(double r, double T, double S0, double V, int d, double K)
+ : r(r), T(T), S0(S0), V(V), d(d), K(K), G(0,1) {};
+
+ double operator()() {
+ std::vector<double> S(d);
+ S[0]= S0*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*G());
+ for(int i=1;i<d;i++){
+ S[i]=S[i-1]*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*G());
}
- S=path_gen(X, p);
- temp = pay_off(std::accumulate(S.begin(), S.end(), 0.)/p->d, p);
- moyenne+=temp;
- variance+=temp*temp;
- }
- return {moyenne/N, variance/N-(moyenne/N)*(moyenne/N)};
-}
-
+ double temp = std::accumulate(S.begin(), S.end(), 0.)/d;
+ return exp(-r*T)*pos(temp-K);
+ };
+
+ private:
+ double r;
+ double T;
+ double S0;
+ double V;
+ int d;
+ double K;
+ gaussian G;
+};
-
-
int main(){
init_alea(1);
- option_param p = {.r=0.05, .T=1.0, .S0=50.0, .V=0.1, .d=16, .K=45};
+ asian_option A(0.05, 1.0, 50.0, 0.1, 16, 45);
int N=1000000;
- std::pair<double,double> meanvar = monte_carl(&p, N);
- std::cout<<"espérance "<<meanvar.first<<" IC "<<1.64*sqrt(meanvar.second)/sqrt(N)<<std::endl;
+ std::vector<double> meanvar = monte_carlo(N, A);
+ std::cout<<"espérance "<<meanvar[0] <<" IC "<<meanvar[2]<<std::endl;
return 0;