#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; } 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) : 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;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) {}; 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(M, A); std::cout<<"espérance "< temp; double m = 0; double s = 0; for(int i=0;i