diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/opti.hpp | 13 | ||||
| -rw-r--r-- | src/option.hpp | 53 |
2 files changed, 66 insertions, 0 deletions
diff --git a/src/opti.hpp b/src/opti.hpp new file mode 100644 index 0000000..e12d544 --- /dev/null +++ b/src/opti.hpp @@ -0,0 +1,13 @@ +#include <vector> +#include <nlopt.hpp> +#include <cmath> +#include <algorithm> +#include <iostream> + +double pos (double x); + +double f (const std::vector<double> &X, std::vector<double> &grad, void *params); + +std::vector<double> argmax(double r, double T, double S0, double V, double K, int d); + + diff --git a/src/option.hpp b/src/option.hpp new file mode 100644 index 0000000..d104bd6 --- /dev/null +++ b/src/option.hpp @@ -0,0 +1,53 @@ +#include "rqmc.hpp" + +double frac_part(double x); + +double pos (double x); + +struct asian_option : public std::unary_function<std::vector<double>, 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) {}; + + double operator()(std::vector<double> X) const { + std::vector<double> S(d); + S[0]= S0*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*X[0]); + for(int i=1;i<d;i++){ + S[i]=S[i-1]*exp((r-V*V/2)*(T/d)+V*sqrt(T/d)*X[i]); + } + double temp = std::accumulate(S.begin(), S.end(), 0.)/d; + return exp(-r*T)*pos(temp-K); + }; + + private: + double r; + double T; + double S0; + double V; + int d; + double K; + }; + + + + +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), G(d) {}; + + typename Fct::result_type operator()() { + double sum =0; + for(int i=0; i<n; i++){ + sum += payoff(G()); + + } + return sum/n; + }; + + private: + int n, d; + Fct payoff; + quasi_gaussian<LDS> G; + }; + |
