aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBertrand <bertrand.horel@gmail.com>2016-02-21 16:39:57 +0000
committerBertrand <bertrand.horel@gmail.com>2016-02-21 16:39:57 +0000
commitd637151c4acae4a06ffef927bf7ececd77d67a44 (patch)
tree145e23bd102f175f806ab01f4c9286b2133f57ac /src
parent906c2dee383a7eb72632bfbdf61916a576a5460d (diff)
downloadprojet_C++-d637151c4acae4a06ffef927bf7ececd77d67a44.tar.gz
réorganisation
Diffstat (limited to 'src')
-rw-r--r--src/opti.hpp13
-rw-r--r--src/option.hpp53
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;
+ };
+