double callPriceBS(const double S, const double K, const double T, const double r, const double sigma) { double t = T/ (double)252.0 ; return norm_cdf(d_1(S,K,T,r,sigma)) * S - norm_cdf(d_2(S,K,T,r,sigma)) * K * exp((-1 *r )* (t)); }
// Pricing a Lookback European Put option double lookback_put(const double& S, const double& M, // Maximum price of asset over period const double& r, const double& v, const double& T) { double a1 = a_1(S,M,r,v,T); double a2 = a_2(S,M,r,v,T); double a3 = a_3(S,M,r,v,T); double term1 = -S * norm_cdf(-a1); double term2 = M * exp(-r*T) * norm_cdf(-a2); double mult = S*v*v/(2.0*r); double term3 = norm_cdf(a1) - exp(-r*T) * pow((M/S),((2*r)/(v*v))) * norm_cdf(a3); return term1 + term2 + mult * term3; }
// Pricing a Lookback European Call option double lookback_call(const double& S, const double& m, // Minimum price of asset over period const double& r, const double& v, const double& T) { double a1 = a_1(S,m,r,v,T); double a2 = a_2(S,m,r,v,T); double a3 = a_3(S,m,r,v,T); double term1 = S * norm_cdf(a1); double term2 = m * exp(-r*T) * norm_cdf(a2); double mult = S*v*v/(2.0*r); double term3 = norm_cdf(-a1) - exp(-r*T) * pow((m/S),((2*r)/(v*v))) * norm_cdf(-a3); return term1 - term2 - mult * term3; }
// An approximation to the cumulative distribution function // for the standard normal distribution // Note: This is a recursive function double norm_cdf(const double& x) { double k = 1.0/(1.0 + 0.2316419*x); double k_sum = k*(0.319381530 + k*(-0.356563782 + k*(1.781477937 + k*(-1.821255978 + 1.330274429*k)))); if (x >= 0.0) { return (1.0 - (1.0/(pow(2*M_PI,0.5)))*exp(-0.5*x*x) * k_sum); } else { return 1.0 - norm_cdf(-x); } }
double putPriceBS(const double S, const double K, const double T, const double r, const double sigma) { double t = T/ (double)252.0 ; return -S* norm_cdf(-d_1( S, K, T, r, sigma))+K*exp(-r*t) * norm_cdf(-d_2(S, K, T, r, sigma)); }