aboutsummaryrefslogtreecommitdiffstats
path: root/src/option.hpp
blob: c969071f554188a53cc22aa8364c157c2d55da04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <functional>

double pos (double x);

struct asian_option : public std::function<double(std::vector<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;
    };