aboutsummaryrefslogtreecommitdiffstats
path: root/src/option.cpp
diff options
context:
space:
mode:
authorBertrand <bertrand.horel@gmail.com>2016-02-19 15:03:51 +0000
committerBertrand <bertrand.horel@gmail.com>2016-02-19 15:03:51 +0000
commitd2b133901a65244934eb642ec8e20c797efaf650 (patch)
treef8d186f8e8ca0886f8f0a464261ba8747242b4e6 /src/option.cpp
parent355e4567e68a76356714e2e58a42dcd78533cf6c (diff)
downloadprojet_C++-d2b133901a65244934eb642ec8e20c797efaf650.tar.gz
nettoyage du dépôt
Diffstat (limited to 'src/option.cpp')
-rw-r--r--src/option.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/option.cpp b/src/option.cpp
new file mode 100644
index 0000000..0e5a56c
--- /dev/null
+++ b/src/option.cpp
@@ -0,0 +1,92 @@
+#include <algorithm>
+#include <iostream>
+#include "rqmc.hpp"
+#include "p_adic.o"
+
+double frac_part(double x){
+ return x - floor(x);
+}
+
+double pos (double x){
+ return x>0?x:0;
+}
+
+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;
+ };
+
+int main(){
+ init_alea(1);
+ asian_option A(0.05, 1.0, 50.0, 0.1, 16, 45);
+ int N= 10000;
+
+ int d =16;
+
+
+ std::vector<double> result(3);
+ 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;
+ }
+
+
+
+ return 0;
+}
+
+
+
+
+
+
+
+