The implementation, in c++, of put option pricer using simulation can be as followed:
Files
2 Header file
3 cpp file
Header file 1: BSModel01.h
#include "BSModel01.h"
#include <iostream>
#include <cmath>
const double pi = 4.0 * atan(1.0);
double Gauss() {
double U1 = (rand() + 1.0) / (RAND_MAX + 1.0);
double U2 = (rand() + 1.0) / (RAND_MAX + 1.0);
return sqrt(-2.0 * log(U1)) * cos(2.0 * pi * U2);
}
void BSModel::GenerateSamplePath(double T, int m, SamplePath& S) {
double St = S0;
for (int k = 0; k < m; k++) {
S[k] = St * exp((r - sigma * sigma * 0.5) * (T / m) + sigma * sqrt(T / m) * Gauss());
St = S[k];
}
}
Header file 2: PathDepOption01.h
#pragma once
#include "BSModel01.h"
class PathDepOption
{
public:
double T;
int m;
double PriceByMC(BSModel Model, long N);
virtual double Payoff(SamplePath& S) = 0;
};
class ArthmAsianCall : public PathDepOption {
public:
double K;
ArthmAsianCall(double T_, double K_, int m_)
{
T = T_; K = K_; m = m_;
}
double Payoff(SamplePath& S);
};
class EurCall : public PathDepOption {
public:
double K;
EurCall(double T_, double K_, int m_)
{
T = T_; K = K_; m = m_;
}
double Payoff(SamplePath& S);
};
class EurPut : public PathDepOption {
public:
double K;
EurPut(double T_, double K_, int m_)
{
T = T_; K = K_; m = m_;
}
double Payoff(SamplePath& S);
};
cpp file 1 : BSModel01.cpp
#include "BSModel01.h"
#include <iostream>
#include <cmath>
const double pi = 4.0 * atan(1.0);
double Gauss() {
double U1 = (rand() + 1.0) / (RAND_MAX + 1.0);
double U2 = (rand() + 1.0) / (RAND_MAX + 1.0);
return sqrt(-2.0 * log(U1)) * cos(2.0 * pi * U2);
}
void BSModel::GenerateSamplePath(double T, int m, SamplePath& S) {
double St = S0;
for (int k = 0; k < m; k++) {
S[k] = St * exp((r - sigma * sigma * 0.5) * (T / m) + sigma * sqrt(T / m) * Gauss());
St = S[k];
}
}
cpp file 2 : PathDepOption01.cpp
#include "PathDepOption01.h"
#include <cmath>
double PathDepOption::PriceByMC(BSModel Model, long N)
{
double H = 0.0;
SamplePath S(m);
for (long i = 0; i < N; i++)
{
Model.GenerateSamplePath(T, m, S);
H = (i / (i + 1.0)) * H + Payoff(S) / (i + 1.0);
}
return exp(-Model.r * T) * H;
}
double ArthmAsianCall::Payoff(SamplePath& S)
{
double Ave = 0.0;
for (int k = 0; k < m; k++) Ave = (k / (k + 1.0)) * Ave + S[k] / (k + 1.0);
if (Ave < K) return 0.0;
return Ave - K;
}
double EurCall::Payoff(SamplePath& S)
{
double Ave = 0.0;
for (int k = 0; k < m; k++) Ave = (k / (k + 1.0)) * Ave + S[k] / (k + 1.0);
if (Ave < K) return 0.0;
return Ave - K;
}
double EurPut::Payoff(SamplePath& S)
{
double Ave = 0.0;
for (int k = 0; k < m; k++) Ave = (k / (k + 1.0)) * Ave + S[k] / (k + 1.0);
if (Ave > K) return 0.0;
return K - Ave;
}
cpp file 3 : Main.cpp
#include <iostream>
#include <iomanip>
#include "PathDepOption01.h"
using namespace std;
int main()
{
double S0 = 106.0;
double r = 0.058;
double sigma = 0.46;
double T = 9.0;
double K = 100.0;
int N1 = 12;
cout << setiosflags(ios::fixed) << setprecision(4);
BSModel Model(S0, r, sigma);
EurCall CallOption(T / N1, K, 1);
EurPut PutOption(T / N1, K, 1);
long N2 = 30000;
cout << "Eur Call Price = "
<< CallOption.PriceByMC(Model, N2) << endl;
cout << "Eur Put Price = "
<< PutOption.PriceByMC(Model, N2) << endl;
return 0;
}
/*
Eur Call Price = 21.2167
Eur Put Price = 11.1326
*/




Leave a comment