int main() { // All options are European // Call option on a stock (b = r by default) EuropeanOption callOption; cout << "S: "; double S; cin >> S; cout << "Option on a stock: " << callOption.Price(S) << endl; // Option on a stock index /* EuropeanOption indexOption; indexOption.optType = "C"; indexOption.K = 50.0; indexOption.T = 0.41667; indexOption.r = 0.1; indexOption.sig = 0.00; double q = 0.0; // Dividend yield indexOption.b = indexOption.r - q; cout << indexOption.optType << " option on an index: " << indexOption.Price(50.0) << endl; // Options on a future EuropeanOption futureOption; futureOption.optType = "P"; futureOption.K = 19.0; futureOption.T = 0.75; futureOption.r = 0.10; futureOption.sig = 0.28; futureOption.b = 0.0; cout << "Put option on a future: " << futureOption.Price(20.0) << endl; // Now change over to a call on the option futureOption.toggle(); cout << "Call option on a future: " << futureOption.Price(20.0) << endl; // Call option on currency EuropeanOption currencyOption; currencyOption.optType = "C"; currencyOption.K = 1.60; currencyOption.T = 0.5; currencyOption.r = 0.06; currencyOption.sig = 0.12; double rf = 0.08; // risk-free rate of foreign currency currencyOption.b = currencyOption.r - rf; cout << endl << "** Other pricing examples **" << endl << endl; cout << "Call option on a currency: " << currencyOption.Price(1.56) << endl; //////// NOW CALCULATIONS OF SENSITIVITIES ////////////////////////////////// // Call and put options on a future: Delta and Elasticity EuropeanOption futureOption2; futureOption2.optType = "P"; futureOption2.K = 100.0; futureOption2.T = 0.5; futureOption2.r = 0.10; futureOption2.sig = 0.36; futureOption2.b = 0.0; cout << "Delta on a put future: " << futureOption2.Delta(105.0) << endl; // Now change over to a call on the option futureOption2.toggle(); cout << "Delta on a call future: " << futureOption2.Delta(105.0) << endl; // Some more data for testing; Calcuate price and delta a EuropeanOption stockOption; stockOption.optType = "C"; stockOption.K = 60.0; stockOption.T = 0.75; stockOption.r = 0.10; stockOption.sig = 0.30; stockOption.b = stockOption.r; stockOption.toggle(); // Calculating theta of a European stock index EuropeanOption indexOption2; indexOption2.optType = "P"; indexOption2.K = 405.0; indexOption2.T = 0.0833; // One month expiration indexOption2.r = 0.07; indexOption2.sig = 0.20; double divYield = 0.05; // Dividend yield, 5% per annum indexOption2.b = indexOption2.r - divYield; // Stock Option: Rho EuropeanOption stockOption2; stockOption2.optType = "C"; stockOption2.K = 75.0; stockOption2.T = 1.0; stockOption2.r = 0.09; stockOption2.sig = 0.19; stockOption2.b = stockOption2.r; // Calculating Cost of Carry of a European stock index EuropeanOption indexOption3; indexOption3.optType = "P"; indexOption3.K = 490.0; indexOption3.T = 0.222225; indexOption3.r = 0.08; indexOption3.sig = 0.15; double divYield3 = 0.05; // Dividend yield, 5% per annum indexOption3.b = indexOption3.r - divYield3 ; */ return 0; }
//pricers // double PutOption::Price(const EuropeanOption &Opt) const { // black scholes double tmp = Opt.sig_() * sqrt(Opt.T_()); double d1 = ( log(Opt.U_()/Opt.K_()) + (Opt.b_()+ (Opt.sig_()*Opt.sig_())*0.5 ) * Opt.T_() )/ tmp; double d2 = d1 - tmp; return (Opt.K_() * exp((-Opt.r_())*Opt.T_()) * N(-d2)) - (Opt.U_() * exp((Opt.b_()- Opt.r_()) * Opt.T_())* N(-d1)); }
void exercise2(void) { std::cout<<"Exercise 2"<<std::endl; EuropeanOption option; std::cout<<"Initial values:"<<std::endl; option.print(); //(a) std::cout<<"K in range [80,120] step 2:"<<std::endl; double tempK = 80; while (tempK<120.01) { std::cout<<"K = "<<tempK; option.K=tempK; std::cout<<";\tCall Price="<<option.Price(); option.toggle(); std::cout<<";\tPut Price="<<option.Price()<<std::endl; tempK = tempK + 2; } option.K=100; //(b) std::cout<<"T in range [0.2,5] step 0.2:"<<std::endl; double tempT= 0.2; while (tempT<5.01) { std::cout<<"T = "<<tempT; option.T=tempT; std::cout<<";\tCall Price="<<option.Price(); option.toggle(); std::cout<<";\tPut Price="<<option.Price()<<std::endl; tempT = tempT + 0.2; } option.T=1; //(c) std::cout<<"r in range [0, 0.2] step 0.01:"<<std::endl; double tempr= 0; while (tempr<0.2001) { std::cout<<"r = "<<tempr; option.r=tempr; std::cout<<";\tCall Price="<<option.Price(); option.toggle(); std::cout<<";\tPut Price="<<option.Price()<<std::endl; tempr = tempr + 0.01; } option.r=0.05; }