diff options
Diffstat (limited to 'option.cpp')
| -rw-r--r-- | option.cpp | 38 |
1 files changed, 16 insertions, 22 deletions
@@ -1,6 +1,7 @@ #include <algorithm> #include <iostream> #include "rqmc.hpp" +#include "p_adic.o" double frac_part(double x){ return x - floor(x); @@ -37,36 +38,24 @@ struct asian_option : public std::unary_function<std::vector<double>, double> -template <typename Fct> -struct quasi_option : public generator<double> +template <typename Fct, typename LDS> +struct quasi_option : public generator<typename Fct::result_type> { - quasi_option(int n, int d, Fct payoff) : n(n), d(d), payoff(payoff), U(0,1), s(d), seed(d) {}; + quasi_option(int n, int d, Fct payoff) : n(n), d(d), payoff(payoff), G(d) {}; - double operator()() { - std::vector<double> X(d); + typename Fct::result_type operator()() { double sum =0; - for(int i=0; i<d; i++){ - seed[i]=U(); - } - for (int i=0; i<n; i++){ - X=s(); - //std::cout<<X[i]<<std::endl; - for(int i=0; i<d; i++){ - X[i] = gsl_cdf_gaussian_Pinv(frac_part(seed[i]+X[i]), 1); - } - sum += payoff(X); - //std::cout<<X[i]<<std::endl; + for(int i=0; i<n; i++){ + sum += payoff(G()); + } - return sum/n; }; private: int n, d; Fct payoff; - uniform U; - sobol s; - std::vector<double> seed; + quasi_gaussian<LDS> G; }; int main(){ @@ -76,10 +65,15 @@ int main(){ int d =16; - typedef asian_option payoff_type; std::vector<double> result(3); - result = monte_carlo(100, quasi_option<payoff_type> (N, d, A)); + result = monte_carlo(100, quasi_option<asian_option, sobol> (N, d, A)); + for(int i =0; i<3; i++){ + std::cout<<result[i]<<std::endl; + } + + std::vector<double> result2(3); + result = monte_carlo(100, quasi_option<asian_option, halton> (N, d, A)); for(int i =0; i<3; i++){ std::cout<<result[i]<<std::endl; } |
