From cee0800329a0be3b27ae3907498ddf0883393382 Mon Sep 17 00:00:00 2001 From: Bertrand Date: Mon, 15 Feb 2016 19:16:29 +0000 Subject: création de nouvelles classes, composition de monte_carlo... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- option.cpp | 105 ++++++++++++++++++++++++++++--------------------------------- rqmc.cpp | 7 ++--- rqmc.hpp | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 63 deletions(-) create mode 100644 rqmc.hpp diff --git a/Makefile b/Makefile index 3e093eb..b3dd461 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ test: test.o mt19937.o rqmc: rqmc.o mt19937.o $(CXX) $^ -o $@ $(GSL_FLAGS) -option: option.o mt19937.o +option: option.o rqmc.o mt19937.o $(CXX) $^ -o $@ $(GSL_FLAGS) clean: diff --git a/option.cpp b/option.cpp index 016de0b..fb8b9cc 100644 --- a/option.cpp +++ b/option.cpp @@ -1,72 +1,53 @@ -#include -#include -#include "var_alea.hpp" #include #include -#include "low_discrepancy.hpp" - - -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; -} +#include "rqmc.hpp" double pos (double x){ return x>0?x:0; } -double frac_part(double x){ - return x - floor(x); -} - -struct asian_option : public var_alea +struct asian_option : public std::unary_function, 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()() { + 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) {}; + + double operator()(std::vector X) const { std::vector S(d); - S[0]= S0*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*G()); + S[0]= S0*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*X[0]); for(int i=1;i { 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) {}; + : r(r), T(T), S0(S0), V(V), d(d), K(K), G(d), U(0,1), seed(d) { + for(int i=0; i 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)); + S[0]= S0*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*gsl_cdf_gaussian_Pinv(frac_part(seed[0]+sob[0]), 1)); for(int i=1;i double K; sobol G; uniform U; + std::vector seed; }; int main(){ init_alea(1); asian_option A(0.05, 1.0, 50.0, 0.1, 16, 45); - asian_option_qmc B(0.05, 1.0, 50.0, 0.1, 16, 45); - int M= 1000000; - int N=10000; - int I=100; + //~ int M= 1000000; + int N= 10000; + //~ int I= 100; - std::vector meanvar = monte_carlo(M, A); - std::cout<<"espérance "< temp; - double m = 0; - double s = 0; - for(int i=0;i meanvar = monte_carlo(M, A); + //~ std::cout<<"espérance "< temp; + //~ double m = 0; + //~ double s = 0; + //~ for(int i=0;i test(d,1); + std::cout< r = monte_carlo(N, A, G); + for(int i=0; i<3; i++){ + std::cout< -#include -#include "var_alea.hpp" +#include "rqmc.hpp" double frac_part(double x){ @@ -34,7 +31,7 @@ int main() { m = m/I; s = s/I - m*m; - std::cout<<"espérance "< +#include +#include "var_alea.hpp" + + +double frac_part(double x); + +//fonctions de compositions de monte_carlo.hpp + +template +struct generator +{ + typedef _Result result_type; +}; + +template +struct compose_t : public generator< typename Fct::result_type > +{ + compose_t(Fct f, VA X) : f(f), X(X) {}; + typename Fct::result_type operator()() { + return f(X()); + }; + private: + Fct f; VA X; +}; + +template +inline compose_t +compose(Fct f, VA X) { + return compose_t(f, X); +}; + +// + +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; +}; + +template +std::vector monte_carlo(int n, Fct f, L X) +{ + return monte_carlo(n, compose(f, X)); +}; + +struct quasi_gaussian : public var_alea > +{ + quasi_gaussian (int d, double mean = 0, double std =1) + : d(d), mean(mean), std(std), sob(d) {}; + std::vector operator ()(){ + std::vector result = sob(); + for(int i=0;i > +{ + gaussian_d(int d, double mean = 0, double std =1) + : d(d), mean(mean), std(std), G(mean, std) {}; + std::vector operator ()(){ + std::vector result(d); + for(int i=0;i