aboutsummaryrefslogtreecommitdiffstats
path: root/src/option.cpp
diff options
context:
space:
mode:
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;
+}
+
+
+
+
+
+
+
+