## part 2

## black scholes via numerical integration

**finance c++ course **

## objective

– calculate Call option in Black Scholes model using c++

C++ and QuantLib have many types of variables in quant finance most useful types are:

double – to store real number

int – to store integer number

QuantLib::Date – to store dates

QuantLib::Array – to store array of double

QuantLib::Matrix – to store 2d matrix of doubles

lets start by doing some numerical integration

delete all the contents of source.cpp file and copy paste following code

## Example – numerical integration

this code will calculate integral

$$ \int_{0}^{1}e^xdx $$

#include <iostream> #include <cmath> //for using math functions //everything after // is a comment double f(double x) //declaration of function f(x)=exp(x) { return std::exp(x); } void main() { double dt=0.0001; //integration step double sum=0; //current value of integral for(double t=0;t<1.0;t+=dt) //for loop t+=dt means t=t+dt { sum+=f(t)*dt; // its equivalent to write sum=sum+f(t)*dt; } std::cout<<"integral "<< sum; //output int dummy;std::cin>>dummy;//screen delay }

read about for loop and other control structures here: http://www.cplusplus.com/doc/tutorial/control/

important notes:

use 1.0 instead of just 1

in c++ 1.0 and 1 are different numbers 1.0 is real number and 1 is integer number

it means that 1/2=0 while 1.0/2 is 0.5

when doing comparisons of doubles don’t use if(x==0)

use if( std::abs(x)

see “variables scope” here http://www.cplusplus.com/doc/tutorial/variables/

here we used simplest form of numerical integration

for a faster/ more precise integratoin you can use other methods

many of them are described in free book “numerical recipes in c”

this book is for C but the code structure would be the same

## example – call option in Black Scholes model using integration

now lets change previous program to calculate Call option in Black Scholes model with zero interest rates

risk-neutral dynamics:

$$ dS=S*\sigma dWt$$

so

$$ S_T=S_0 exp(-0.5 \sigma^2+\sigma \sqrt T x )$$

where x is a standard gaussian

so the call option price will be

$$ Call=\int_{-\infty}^{+\infty} (S_0 e^{-0.5 \sigma^2+\sigma \sqrt T x} – K)^+ \phi(x) dx $$

where $$\phi(x)=\frac{1}{\sqrt{2\pi}}exp(-0.5 x^2)$$ standard gaussian density

S0=100

volatility=20%

maturity=T=1 year

#include <iostream> #include <cmath> #include <boost/math/constants/constants.hpp> double density(double x) //normal density { const double pi = boost::math::constants::pi<double>(); return 1.0/sqrt(2.0*pi)*std::exp(-0.5*x*x); } double pp(double x) //positive part x+ { if(x>0) return x; return 0; } double f(double K,double S0,double T,double sigma,double x) //function to integrate { return pp(S0*std::exp(-0.5*sigma*sigma*T+sigma*std::sqrt(T)*x)-K)*density(x); } void main() { double S0=100.0; double sigma=0.2; double T=1.0; double K=80.0; double dx=0.0001; double sum=0; for(double x=-10.0;x<10.0;x+=dx) { sum+=f(K,S0,T,sigma,x)*dx; } std::cout<<"call= "<< sum; int dummy;std::cin>>dummy; }

Notes:

we have to pass arguments again to the integrated function because their original scope is inside * main() * , so variables K, S0 etc are not visible inside function *f(x)*

we use boost here to extract Pi constant , so it will be easier to port this program to linux for example (standard c++ has no math constants)

### exercises

– debug first program by setting break points and watch variables sum and t change value

– change first program to integrate via trapezoidal rule , check the results against known answer $$ e^1-1 $$

– change second program to include non zero interest rates

– change second program to calculate put price

– verify call put parity

### some tricks

if you’ve got an error always start by correcting first compile error (double click on compile error line)

some c++ error messages are quite cryptic and are results of previous errors

for example remove “;” after return statement

press F7 to compile

now double-click on first error: