From 8fd762b2e427f62b531614e5e84dfbfb3b7fff37 Mon Sep 17 00:00:00 2001 From: Bertrand Date: Sun, 14 Feb 2016 21:24:26 +0000 Subject: réécriture avec classe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- option.cpp | 83 ++++++++++++++++++++++++++++++-------------------------------- 1 file 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 #include -typedef struct option_param { - double r; - double T; - double S0; - double V; - int d; - double K; -}option_param; - -std::vector path_gen(std::vector X, option_param *p){ - std::vector 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;id;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 +std::vector monte_carlo(int n, L X) +{ + std::vector 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 monte_carl(option_param* p, int N){ - double moyenne=0; - double variance=0; - gaussian G(0,1); - double temp=0; - std::vector S(p->d); - std::vector X(p->d); - for(int i=0; id;j++){ - X[j]=G(); +struct asian_option : public var_alea +{ + 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 S(d); + S[0]= S0*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*G()); + for(int i=1;id, 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 meanvar = monte_carl(&p, N); - std::cout<<"espérance "< meanvar = monte_carlo(N, A); + std::cout<<"espérance "<