#include #include #include #include #include #include "stratified_sampling.hpp" #include #include #include "opti.hpp" #include "option.hpp" #include "rqmc.hpp" using namespace std; struct first:public std::unary_function, double> { double operator()(std::vector X){ return X[0]; } }; vector< vector > exemple1_stratified() { int I = 10; //le nombre de strates vector q = quantile_norm(10, 1); vector p(I, 1/(double)I); vector rvar; rvar.push_back(gaussian_truncated(GSL_NEGINF, q[0])); for (int i=1; i N = {300, 1000, 10000, 20000}; //notre tableau du nombre successif de tirages, qui correspondent aux 300, 1300, 11300 et 31300 //de l'article de Etoré et Jourdain vector< vector > data (4); stratified_sampling S(p,rvar); cout<<"N"<<"\t"<<"moyenne"<<"\t\t"<<"sigma"<<"\t"<<"théorique"< r(4,0); for (size_t i=0; i > exemple1_rqmc(){ int I = 100; vector N = {3, 13, 113, 313}; //les N choisis pour que les NI soient égaux aux N de l'exemple 1 stratified_sampling first f; //comme quasi_gaussian retourne un vecteur, on doit composer avec f pour avoir le double QG()[0] vector< vector > data (4); for(size_t i =0; i (N[i], 1, f)); } cout<<"moyenne"<<"\t\t"<<"sigma"<<"\t\t"<<"taille IC"< normalize (std::vector mu) { int d = mu.size(); double norm_mu = 0; std::vector u(d); for(int i=0; i > exemple2_stratified (int d, bool call = true){ vector K = {45, 50, 55}; vector N = {100000, 400000, 500000}; int I = 100; //le nombre de strates vector< vector > data(3); vector q = quantile_norm(I, 1); vector p(I, 1/(double)I); double r = 0.05; double T = 1.0; double S0 = 50; double V = 0.1; typedef compose_t, multi_gaussian_truncated> tilted_option; for (size_t i=0; i < K.size(); i++){ vector mu = argmax(r, T, S0, V, K[i], d, call); std::vector u = normalize(mu); asian_option A(r, T, S0, V, K[i], call); exponential_tilt G(mu, A); std::vector X; X.push_back(compose(G, multi_gaussian_truncated(GSL_NEGINF, q[0], u))); for(int j=1; j < I; j++) { X.push_back(compose(G, multi_gaussian_truncated(q[j-1], q[j], u))); } stratified_sampling S(p, X); vector r(3, 0); for (size_t j=0; j < N.size(); j++){ S.draw(N[j]); } r[0] = K[i]; r[1] = S.estimator().first; r[2] = S.estimator().second; data[i] = r; } return data; } vector< vector > exemple2_rqmc(int d, bool call = true) { int N= 10000; double r = 0.05; double T = 1.0; double S0 = 50; double V = 0.1; vector< vector > data(3); vector K = {45, 50, 55}; int I=100;//la taille du vrai Monte-Carlo for(int i =0; i<3; i++) { asian_option A(r, T, S0, V, K[i], call); data[i] = monte_carlo(I, quasi_mean (N, d, A)); } return data; }; int make_table1(vector< vector > const &data1, vector< vector > const &data2) { std::fstream fs("doc/table1.tex", std::fstream::out); fs< > data1, vector< vector > data2, vector< vector > data3, vector< vector > data4, string table_name) { std::fstream fs("doc/" + table_name, std::fstream::out); fs< > data1 = exemple2_stratified(16); vector< vector > data2 = exemple2_rqmc(16); vector< vector > data3 = exemple2_stratified(64); vector< vector > data4 = exemple2_rqmc(64); make_table2(data1, data2, data3, data4, "table2.tex"); vector< vector > data5 = exemple2_stratified(16, false); vector< vector > data6 = exemple2_rqmc(16, false); vector< vector > data7 = exemple2_stratified(64, false); vector< vector > data8 = exemple2_rqmc(64,false); make_table2(data5, data6, data7, data8, "table3.tex"); return 0; }