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 --- option.cpp | 105 ++++++++++++++++++++++++++++--------------------------------- 1 file changed, 48 insertions(+), 57 deletions(-) (limited to 'option.cpp') 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<