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

Trending