From 43481c09afd990c99106d7efd6fe8a7c9a53d519 Mon Sep 17 00:00:00 2001 From: Bertrand Date: Sun, 14 Feb 2016 22:04:24 +0000 Subject: ajout option rqmc et correction rqmc.cpp --- option.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) (limited to 'option.cpp') diff --git a/option.cpp b/option.cpp index deb8347..016de0b 100644 --- a/option.cpp +++ b/option.cpp @@ -3,6 +3,7 @@ #include "var_alea.hpp" #include #include +#include "low_discrepancy.hpp" template @@ -25,6 +26,10 @@ double pos (double x){ return x>0?x:0; } +double frac_part(double x){ + return x - floor(x); +} + struct asian_option : public var_alea { asian_option(double r, double T, double S0, double V, int d, double K) @@ -50,15 +55,56 @@ struct asian_option : public var_alea gaussian G; }; +struct asian_option_qmc : public var_alea +{ + asian_option_qmc(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(d), U(0,1) {}; + + double operator()() { + std::vector S(d); + std::vector sob(d); + sob = G(); + S[0]= S0*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*gsl_cdf_gaussian_Pinv(frac_part(U()+sob[0]), 1)); + for(int i=1;i meanvar = monte_carlo(N, A); + std::vector meanvar = monte_carlo(M, A); std::cout<<"espérance "< temp; + double m = 0; + double s = 0; + for(int i=0;i