Skip to content

Commit

Permalink
finished developing regression strategies, basis functions, and makin…
Browse files Browse the repository at this point in the history
…g it work with american monte carlo pricer
  • Loading branch information
anthonymakarewicz committed Aug 14, 2024
1 parent 4d6fac0 commit 9c8d22f
Show file tree
Hide file tree
Showing 65 changed files with 895 additions and 380 deletions.
1 change: 1 addition & 0 deletions .idea/editor.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 35 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ add_library(marketdata SHARED
src/market_data/market_data.cpp
src/market_data/market_data_observer.cpp
src/market_data/stock_data.cpp
include/solver/monte_carlo/builder/mc_builder_american.h
)

# Create dynamic library for payoff
Expand Down Expand Up @@ -78,12 +77,27 @@ add_library(option SHARED
src/option/path_dependent/factory_lookback_option.cpp
)

# Create dynamic library for marketdata
# Create dynamic library for model
add_library(model SHARED
src/model/gbm_model.cpp
src/model/base_model.cpp
)

# Create dynamic library for random
add_library(random SHARED
src/random/distribution/base_distribution.cpp
src/random/distribution/standard_normal_distribution.cpp
src/random/number_generator/base_generator.cpp
src/random/number_generator/random_generator.cpp
src/random/number_generator/base_quasi_random_generator.cpp
src/random/number_generator/faure_quasi_random_generator.cpp
src/random/number_generator/sobol_quasi_random_generator.cpp
)

# Create dynamic library for solver
add_library(solver SHARED
src/solver/base_solver.cpp
src/solver/monte_carlo/mc_solver.cpp
src/solver/monte_carlo/stock_price_model.cpp
src/solver/monte_carlo/gbm_stock_price_model.cpp
src/solver/monte_carlo/base_mc.cpp
src/solver/monte_carlo/mc_single_path.cpp
src/solver/monte_carlo/base_mc_path_dependent.cpp
Expand All @@ -96,25 +110,38 @@ add_library(solver SHARED
src/solver/monte_carlo/builder/base_mc_builder_path_dependent.cpp
src/solver/monte_carlo/builder/mc_builder_asian.cpp
src/solver/monte_carlo/builder/mc_builder_barrier.cpp
src/solver/monte_carlo/builder/mc_builder_lookback.cpp
src/solver/monte_carlo/builder/mc_builder_american.cpp
src/solver/monte_carlo/builder/mc_lookback_builder.cpp
src/solver/monte_carlo/regression/base_regression_strategy.cpp
src/solver/monte_carlo/regression/least_squares.cpp
src/solver/monte_carlo/regression/ridge.cpp
src/solver/monte_carlo/regression/lasso.cpp
src/solver/monte_carlo/basis_function/base_basis_function_strategy.cpp
src/solver/monte_carlo/basis_function/monomial.cpp
src/solver/monte_carlo/basis_function/legendre.cpp
src/solver/monte_carlo/basis_function/legendre.cpp
src/solver/monte_carlo/basis_function/chebyshev.cpp
src/solver/monte_carlo/basis_function/laguerre.cpp
)

# Link the option library against marketdata and payoff
target_link_libraries(option PUBLIC marketdata payoff)

# Link random library to the solver ONLY
target_link_libraries(solver PUBLIC option Boost::random Eigen3::Eigen)
target_link_libraries(solver PUBLIC option random model Boost::random Eigen3::Eigen)

target_link_libraries(model PUBLIC option)


# Create main executable
add_executable(Option_pricer main.cpp)

# Link the main executable to our dynamic libraries
target_link_libraries(Option_pricer PUBLIC marketdata payoff option solver)
target_link_libraries(Option_pricer PUBLIC marketdata payoff option solver random model)

# Enable testing and add the tests directory
enable_testing()
add_subdirectory(tests)

# Add the examples subdirectory
add_subdirectory(examples)
add_subdirectory(examples)
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@

namespace OptionPricer {

class StockPriceModel {
class StockModel {
public:
StockPriceModel(const std::string& ticker, std::shared_ptr<IMarketData> marketData);
virtual ~StockPriceModel();
StockModel(const std::string& ticker, std::shared_ptr<IMarketData> marketData);
virtual ~StockModel();

[[nodiscard]] virtual double simulatePriceAtMaturity(const double& T, const double& z) const = 0;
[[nodiscard]] virtual double simulateStepPrice(const double& dt, const double& z) const = 0;
Expand Down
21 changes: 21 additions & 0 deletions include/model/gbm_model.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef GBM_STOCK_PRICE_MODEL_H
#define GBM_STOCK_PRICE_MODEL_H

#include <cmath>
#include <random>
#include <model/base_model.h>
#include <market_data/interface_market_data.h>

namespace OptionPricer {

class GeometricBrownianMotionModel : public StockModel {
public:
GeometricBrownianMotionModel(const std::string& ticker, std::shared_ptr<IMarketData> marketData);

[[nodiscard]] double simulatePriceAtMaturity(const double& T, const double& z) const override;
[[nodiscard]] double simulateStepPrice(const double& dt, const double& z) const override;
};

}

#endif //GBM_STOCK_PRICE_MODEL_H
17 changes: 17 additions & 0 deletions include/random/distribution/base_distribution.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef BASE_DISTRIBUTION_H
#define BASE_DISTRIBUTION_H

#include <random>

namespace OptionPricer {

class Distribution {
public:
virtual ~Distribution();
[[nodiscard]] virtual double inv_cdf(const double& quantile) const = 0;
virtual double operator()(std::mt19937& gen) = 0;
};

}

#endif //BASE_DISTRIBUTION_H
23 changes: 23 additions & 0 deletions include/random/distribution/standard_normal_distribution.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#ifndef STANDARD_NORMAL_DISTRIBUTION_H
#define STANDARD_NORMAL_DISTRIBUTION_H

#include <cmath>
#include "random/distribution/base_distribution.h"

namespace OptionPricer {

class StandardNormalDistribution final: public Distribution {
public:
explicit StandardNormalDistribution();
~StandardNormalDistribution() override;

[[nodiscard]] double inv_cdf(const double& quantile) const override;
double operator()(std::mt19937& gen) override;

private:
std::normal_distribution<> normal_dist_;
};

}

#endif //STANDARD_NORMAL_DISTRIBUTION_H
24 changes: 24 additions & 0 deletions include/random/number_generator/base_generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef BASE_NUMBER_GENERATOR_H
#define BASE_NUMBER_GENERATOR_H

#include "random/distribution/base_distribution.h"

namespace OptionPricer {

class NumberGenerarator {
public:
explicit NumberGenerarator(std::shared_ptr<Distribution> dist);
explicit NumberGenerarator(std::shared_ptr<Distribution> dist, const unsigned int& seed);

virtual ~NumberGenerarator();

virtual double generate(const int& step) = 0;

protected:
std::shared_ptr<Distribution> dist_;
unsigned int seed_;
};

}

#endif //BASE_NUMBER_GENERATOR_H
26 changes: 26 additions & 0 deletions include/random/number_generator/base_quasi_random_generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#ifndef BASE_QUASI_RANDOM_GENERATOR_H
#define BASE_QUASI_RANDOM_GENERATOR_H

#include "random/number_generator/base_generator.h"

namespace OptionPricer {

class QRNGenerator : public NumberGenerarator {
public:
explicit QRNGenerator(std::shared_ptr<Distribution> dist, const unsigned int& dim);
QRNGenerator(std::shared_ptr<Distribution> dist, const unsigned int& seed, const unsigned int& dim);

~QRNGenerator() override;

unsigned int getDim() const;

protected:
void validateDim() const;

unsigned int dim_;
std::vector<double> point_; // Maybe use array
};

}

#endif //BASE_QUASI_RANDOM_GENERATOR_H
24 changes: 24 additions & 0 deletions include/random/number_generator/faure_quasi_random_generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef FAURE_QUASI_RANDOM_GENERATOR_H
#define FAURE_QUASI_RANDOM_GENERATOR_H

#include <boost/random/faure.hpp>
#include "random/number_generator/base_quasi_random_generator.h"

namespace OptionPricer {

class FaureGenerator final: public QRNGenerator {
public:
explicit FaureGenerator(std::shared_ptr<Distribution> dist, const unsigned int& dim);
FaureGenerator(std::shared_ptr<Distribution> dist, const unsigned int& seed, const unsigned int& dim);

~FaureGenerator() override;

[[nodiscard]] double generate(const int& step) override;

private:
boost::random::faure faureQrng_;
};

}

#endif //FAURE_QUASI_RANDOM_GENERATOR_H
21 changes: 21 additions & 0 deletions include/random/number_generator/random_generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef RANDOM_NUMBER_GENERATOR_H
#define RANDOM_NUMBER_GENERATOR_H

#include "random/number_generator/base_generator.h"

namespace OptionPricer {

class RNGenerator final: public NumberGenerarator {
public:
explicit RNGenerator(std::shared_ptr<Distribution> dist);
RNGenerator(std::shared_ptr<Distribution> dist, const unsigned int& seed);

[[nodiscard]] double generate(const int& step) override;

private:
std::mt19937 generator_; // Mersenne Twister PRNG
};

}

#endif //RANDOM_NUMBER_GENERATOR_H
24 changes: 24 additions & 0 deletions include/random/number_generator/sobol_quasi_random_generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef SOBOL_QUASI_RANDOM_GENERATOR_H
#define SOBOL_QUASI_RANDOM_GENERATOR_H

#include <boost/random/sobol.hpp>
#include "random/number_generator/base_quasi_random_generator.h"

namespace OptionPricer {

class SobolGenerator final: public QRNGenerator {
public:
explicit SobolGenerator(std::shared_ptr<Distribution> dist, const unsigned int& dim);
SobolGenerator(std::shared_ptr<Distribution> dist, const unsigned int& seed, const unsigned int& dim);

~SobolGenerator() override;

[[nodiscard]] double generate(const int& step) override;

private:
boost::random::sobol sobolQrng_;
};

}

#endif //SOBOL_QUASI_RANDOM_GENERATOR_H
9 changes: 5 additions & 4 deletions include/solver/monte_carlo/base_mc.h
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
#ifndef BASE_MC_H
#define BASE_MC_H

#include "solver/monte_carlo/stock_price_model.h"
#include "solver/monte_carlo/generator.h"
#include <iostream>
#include "model/base_model.h"
#include "random/number_generator/base_generator.h"

namespace OptionPricer {

class MCPricer {
public:
MCPricer(std::shared_ptr<IMarketData> marketData,
std::shared_ptr<StockPriceModel> stockModel,
std::shared_ptr<StockModel> stockModel,
std::shared_ptr<NumberGenerarator> generator);

virtual ~MCPricer();
Expand All @@ -18,7 +19,7 @@ namespace OptionPricer {

protected:
std::shared_ptr<IMarketData> marketData_;
std::shared_ptr<StockPriceModel> stockModel_;
std::shared_ptr<StockModel> stockModel_;
std::shared_ptr<NumberGenerarator> generator_;
};

Expand Down
2 changes: 1 addition & 1 deletion include/solver/monte_carlo/base_mc_path_dependent.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace OptionPricer {
class PathDependentMCPricer : public MCPricer {
public:
PathDependentMCPricer(std::shared_ptr<IMarketData> marketData,
std::shared_ptr<StockPriceModel> stockModel,
std::shared_ptr<StockModel> stockModel,
std::shared_ptr<NumberGenerarator> generator,
const unsigned int& steps);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef BASE_BASIS_FUNCTION_H
#define BASE_BASIS_FUNCTION_H

#include <Eigen/Dense>

namespace OptionPricer {

class BasisFunctionStrategy {
public:
explicit BasisFunctionStrategy(const unsigned int& numberBasis);
virtual ~BasisFunctionStrategy();

[[nodiscard]] virtual Eigen::MatrixXd generate(const Eigen::VectorXd& x) const = 0;

protected:
unsigned int numberBasis_; // Number of basis functions to generate
};

}

#endif //BASE_BASIS_FUNCTION_H
18 changes: 18 additions & 0 deletions include/solver/monte_carlo/basis_function/chebyshev.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef CHEBYSHEV_H
#define CHEBYSHEV_H

#include "solver/monte_carlo/basis_function/base_basis_function_strategy.h"

namespace OptionPricer {

class ChebyshevBasisFunction : public BasisFunctionStrategy {
public:
using BasisFunctionStrategy::BasisFunctionStrategy;
~ChebyshevBasisFunction() override;

[[nodiscard]] Eigen::MatrixXd generate(const Eigen::VectorXd& x) const override;
};

}

#endif //CHEBYSHEV_H
18 changes: 18 additions & 0 deletions include/solver/monte_carlo/basis_function/laguerre.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef LAGUERRE_H
#define LAGUERRE_H

#include "solver/monte_carlo/basis_function/base_basis_function_strategy.h"

namespace OptionPricer {

class LaguerreBasisFunction final : public BasisFunctionStrategy {
public:
using BasisFunctionStrategy::BasisFunctionStrategy;
~LaguerreBasisFunction() override;

[[nodiscard]] Eigen::MatrixXd generate(const Eigen::VectorXd& x) const override;
};

}

#endif //LAGUERRE_H
Loading

0 comments on commit 9c8d22f

Please sign in to comment.