diff options
| -rw-r--r-- | option.cpp | 83 |
1 files changed, 40 insertions, 43 deletions
@@ -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; |
