diff --git a/CMakeLists.txt b/CMakeLists.txt index 9dd4976..cb861e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,9 +10,23 @@ set(Boost_USE_STATIC_LIBS OFF) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) +# Specify the target architecture for macOS +if(APPLE) + # Detect the processor architecture + if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64") + set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "Build architectures for Mac OS X" FORCE) + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for Mac OS X" FORCE) + else() + message(WARNING "Unknown architecture: ${CMAKE_HOST_SYSTEM_PROCESSOR}. Defaulting to x86_64.") + set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for Mac OS X" FORCE) + endif() +endif() + + # Set the Vcpkg toolchain file -set(CMAKE_TOOLCHAIN_FILE "/Users/anthony/.vcpkg-clion/vcpkg/scripts/buildsystems/vcpkg.cmake" - CACHE STRING "Vcpkg toolchain file") +#set(CMAKE_TOOLCHAIN_FILE "/Users/anthony/.vcpkg-clion/vcpkg/scripts/buildsystems/vcpkg.cmake" +# CACHE STRING "Vcpkg toolchain file") find_package(Boost REQUIRED COMPONENTS random) find_package(Eigen3 REQUIRED) @@ -81,6 +95,13 @@ add_library(option SHARED add_library(model SHARED src/model/gbm_model.cpp src/model/base_model.cpp + src/model/heston_model.cpp + src/model/discretization/base_cir_discretization.cpp + src/model/discretization/explicit_euler_cir_discretization.cpp + src/model/discretization/milstein_cir_discretization.cpp + src/model/merton_jump_diffusion_model.cpp + src/model/kou_model.cpp + src/model/variance_gamma_model.cpp ) # Create dynamic library for random @@ -88,10 +109,15 @@ 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/pseudo_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 + src/random/distribution/poisson_distrib.cpp + src/random/distribution/normal_distrib.cpp + src/random/distribution/continuous_uniform_distrib.cpp + src/random/distribution/exponential_distr.cpp + src/random/distribution/gamma_distrib.cpp ) # Create dynamic library for solver @@ -100,14 +126,12 @@ add_library(solver SHARED src/solver/monte_carlo/mc_solver.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 src/solver/monte_carlo/mc_asian.cpp src/solver/monte_carlo/mc_barrier.cpp src/solver/monte_carlo/mc_lookback.cpp src/solver/monte_carlo/mc_american.cpp src/solver/monte_carlo/builder/base_mc_builder.cpp src/solver/monte_carlo/builder/mc_builder_single_path.cpp - 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_american.cpp @@ -124,14 +148,9 @@ add_library(solver SHARED 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 random model Boost::random Eigen3::Eigen) - -target_link_libraries(model PUBLIC option) - +target_link_libraries(model PUBLIC option random) +target_link_libraries(solver PUBLIC option model Boost::random Eigen3::Eigen) # Create main executable add_executable(Option_pricer main.cpp) diff --git a/README.md b/README.md index f4abd23..7b645b0 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ make test │ │ ├── base_generator.cpp │ │ ├── base_quasi_random_generator.cpp │ │ ├── faure_quasi_random_generator.cpp -│ │ ├── random_generator.cpp +│ │ ├── pseudo_random_generator.cpp │ │ └── sobol_quasi_random_generator.cpp │ └── solver │ ├── base_solver.cpp diff --git a/include/model/base_model.h b/include/model/base_model.h index 63f61fa..d5b70be 100644 --- a/include/model/base_model.h +++ b/include/model/base_model.h @@ -2,22 +2,31 @@ #define STOCK_PRICE_MODEL_H #include +#include #include "market_data/interface_market_data.h" namespace OptionPricer { class StockModel { public: - StockModel(const std::string& ticker, std::shared_ptr marketData); - virtual ~StockModel(); + StockModel(const std::string& ticker, + std::shared_ptr marketData, + std::shared_ptr generator); - [[nodiscard]] virtual double simulatePriceAtMaturity(const double& T, const double& z) const = 0; - [[nodiscard]] virtual double simulateStepPrice(const double& dt, const double& z) const = 0; + virtual ~StockModel(); + unsigned int getSteps() const; + [[nodiscard]] std::shared_ptr getGenerator() const; + [[nodiscard]] virtual double simulatePriceAtMaturity(const double& T) const = 0; + [[nodiscard]] virtual std::vector simulatePrices(const double& T) const = 0; + [[nodiscard]] virtual double simulatePriceBackward(const double& S_next, + const double& t_j, + const double& t_jp1) const; protected: std::string ticker_; - std::shared_ptr stockData_; // Cache StockData for consultation std::shared_ptr marketData_; + std::shared_ptr stockData_; // Cache StockData for consultation + std::shared_ptr generator_; }; } diff --git a/include/model/discretization/base_cir_discretization.h b/include/model/discretization/base_cir_discretization.h new file mode 100644 index 0000000..e1a1b8f --- /dev/null +++ b/include/model/discretization/base_cir_discretization.h @@ -0,0 +1,18 @@ +#ifndef BASE_CIR_DISCRETIZATION_H +#define BASE_CIR_DISCRETIZATION_H + +#include + +namespace OptionPricer { + + class CIRDiscretization { + public: + virtual ~CIRDiscretization(); + virtual double apply(const double &v, const double &dt, + const double &kappa, const double &theta, + const double &sigma_v, const double &z) const = 0; + }; + +} + +#endif //BASE_CIR_DISCRETIZATION_H diff --git a/include/model/discretization/explicit_euler_cir_discretization.h b/include/model/discretization/explicit_euler_cir_discretization.h new file mode 100644 index 0000000..8662d7f --- /dev/null +++ b/include/model/discretization/explicit_euler_cir_discretization.h @@ -0,0 +1,17 @@ +#ifndef EXPLICIT_EULER_CIR_DISCRETIZATION_H +#define EXPLICIT_EULER_CIR_DISCRETIZATION_H + +#include "model/discretization/base_cir_discretization.h" + +namespace OptionPricer { + + class CIRExplicitEulerDiscretization : public CIRDiscretization { + public: + double apply(const double &v, const double &dt, + const double &kappa, const double &theta, + const double &sigma_v, const double &z) const override; + }; + +} + +#endif //EXPLICIT_EULER_CIR_DISCRETIZATION_H diff --git a/include/model/discretization/milstein_cir_discretization.h b/include/model/discretization/milstein_cir_discretization.h new file mode 100644 index 0000000..f9c47ef --- /dev/null +++ b/include/model/discretization/milstein_cir_discretization.h @@ -0,0 +1,16 @@ +#ifndef MILSTEIN_CIR_DISCRETIZATION_H +#define MILSTEIN_CIR_DISCRETIZATION_H + +#include "model/discretization/explicit_euler_cir_discretization.h" + +namespace OptionPricer { + + class CIRMilsteinDiscretization : public CIRExplicitEulerDiscretization { + public: + double apply(const double &v, const double &dt, const double &kappa, const double &theta, const double &sigma_v, + const double &z) const override; + }; + +} + +#endif //MILSTEIN_CIR_DISCRETIZATION_H diff --git a/include/model/gbm_model.h b/include/model/gbm_model.h index d0e0b71..e7e1503 100644 --- a/include/model/gbm_model.h +++ b/include/model/gbm_model.h @@ -3,17 +3,20 @@ #include #include -#include -#include +#include "model/base_model.h" namespace OptionPricer { - class GeometricBrownianMotionModel : public StockModel { + class GeometricBrownianMotionModel final: public StockModel { public: - GeometricBrownianMotionModel(const std::string& ticker, std::shared_ptr marketData); + using StockModel::StockModel; + ~GeometricBrownianMotionModel() override; - [[nodiscard]] double simulatePriceAtMaturity(const double& T, const double& z) const override; - [[nodiscard]] double simulateStepPrice(const double& dt, const double& z) const override; + [[nodiscard]] double simulatePriceAtMaturity(const double& T) const override; + [[nodiscard]] std::vector simulatePrices(const double& T) const override; + [[nodiscard]] double simulatePriceBackward(const double &S_next, + const double &t_j, + const double &t_jp1) const override; }; } diff --git a/include/model/heston_model.h b/include/model/heston_model.h new file mode 100644 index 0000000..46b78d9 --- /dev/null +++ b/include/model/heston_model.h @@ -0,0 +1,36 @@ +#ifndef HESTON_MODEL_H +#define HESTON_MODEL_H + +#include "model/base_model.h" +#include "model/discretization/base_cir_discretization.h" + +namespace OptionPricer { + + class HestonModel final : public StockModel { + public: + HestonModel(const std::string& ticker, + std::shared_ptr marketData, + std::shared_ptr generator, + const double& kappa, const double& theta, const double& sigma_v, + const double& rho, const double& v0, + std::shared_ptr varDiscretization = nullptr); + ~HestonModel() override; + + [[nodiscard]] double simulatePriceAtMaturity(const double& T) const override; + [[nodiscard]] std::vector simulatePrices(const double& T) const override; + + private: + double kappa_; // Mean reversion rate + double theta_; // Long-term variance + double sigma_v_; // Volatility of variance + double rho_; // Correlation between the two Brownian motions + double v0_; // Initial variance + std::shared_ptr varDiscretization_; // Discretization scheme for the variance process + }; + +} + + + + +#endif //HESTON_MODEL_H diff --git a/include/model/kou_model.h b/include/model/kou_model.h new file mode 100644 index 0000000..61059fd --- /dev/null +++ b/include/model/kou_model.h @@ -0,0 +1,33 @@ +#ifndef KOU_MODEL_H +#define KOU_MODEL_H + +#include "model/base_model.h" + +namespace OptionPricer { + + class KouModel final: public StockModel { + public: + /* This class implements the Kou model which is an extension of the Merton Jump Diffusion model + * which introduce asymmetry of jumps for modeling the skewness and kurtosis of stock returns. + */ + KouModel(const std::string& ticker, + std::shared_ptr marketData, + std::shared_ptr generator, + const double& lambda, const double& p, + const double& eta1, const double& eta2); + + ~KouModel() override; + + double simulatePriceAtMaturity(const double& T) const override; + std::vector simulatePrices(const double& T) const override; + + private: + double lambda_; // Jump intensity + double p_; // Probability of upward jump + double eta1_; // Rate of upward jumps + double eta2_; // Rate of downward jumps + }; + +} + +#endif //KOU_MODEL_H diff --git a/include/model/merton_jump_diffusion_model.h b/include/model/merton_jump_diffusion_model.h new file mode 100644 index 0000000..9c39a22 --- /dev/null +++ b/include/model/merton_jump_diffusion_model.h @@ -0,0 +1,28 @@ +#ifndef MERTON_JUMP_DIFFUSION_MODEL_H +#define MERTON_JUMP_DIFFUSION_MODEL_H + +#include "model/base_model.h" + +namespace OptionPricer { + + class MertonJumpDiffusionModel final : public StockModel { + public: + MertonJumpDiffusionModel(const std::string& ticker, + std::shared_ptr marketData, + std::shared_ptr generator, + const double& lambda, const double& muJ, const double& sigmaJ); + + ~MertonJumpDiffusionModel() override; + + double simulatePriceAtMaturity(const double& T) const override; + std::vector simulatePrices(const double& T) const override; + + private: + double lambda_; // intensity of the Poisson process (mean number of jumps per unit time) + double muJ_; // mean of the jump size distribution + double sigmaJ_; // standard deviation of the jump size distribution + }; + +} + +#endif // MERTON_JUMP_DIFFUSION_MODEL_H \ No newline at end of file diff --git a/include/model/variance_gamma_model.h b/include/model/variance_gamma_model.h new file mode 100644 index 0000000..dfe6797 --- /dev/null +++ b/include/model/variance_gamma_model.h @@ -0,0 +1,29 @@ +#ifndef VARIANCE_GAMMA_MODEL_H +#define VARIANCE_GAMMA_MODEL_H + +#include "model/base_model.h" + +namespace OptionPricer { + + class VarianceGammaModel : public StockModel { + public: + VarianceGammaModel(const std::string& ticker, + std::shared_ptr marketData, + std::shared_ptr generator, + const double& sigma, const double& nu, const double& theta); + + ~VarianceGammaModel() override; + + [[nodiscard]] double simulatePriceAtMaturity(const double& T) const override; + [[nodiscard]] std::vector simulatePrices(const double& T) const override; + + private: + double sigma_; // Volatility parameter + double nu_; // Variance rate of the Gamma process + double theta_; // Drift of the Brownian motion + double omega_; // Drift correction term + }; + +} + +#endif //VARIANCE_GAMMA_MODEL_H \ No newline at end of file diff --git a/include/payoff/base_payoff.h b/include/payoff/base_payoff.h index f049f07..fb6f7c5 100644 --- a/include/payoff/base_payoff.h +++ b/include/payoff/base_payoff.h @@ -5,15 +5,19 @@ #include namespace OptionPricer { + enum class PayoffType { - Call, Put, DoubleDigital + Call, + Put, + DoubleDigital }; inline std::string PayoffTypeToString(const PayoffType& type) { switch (type) { - case PayoffType::Call: return "Call"; - case PayoffType::Put: return "Put"; - case PayoffType::DoubleDigital: return "DoubleDigital"; + using enum PayoffType; + case Call: return "Call"; + case Put: return "Put"; + case DoubleDigital: return "DoubleDigital"; // Add other cases as needed default: return "Unknown"; } diff --git a/include/random/distribution/base_distribution.h b/include/random/distribution/base_distribution.h index fb869f6..91d55f1 100644 --- a/include/random/distribution/base_distribution.h +++ b/include/random/distribution/base_distribution.h @@ -5,11 +5,12 @@ namespace OptionPricer { + // Maybe inheriting discrete and continuous and make operator() return either int or double class Distribution { public: virtual ~Distribution(); [[nodiscard]] virtual double inv_cdf(const double& quantile) const = 0; - virtual double operator()(std::mt19937& gen) = 0; + virtual double operator()(std::mt19937& gen) const = 0; }; } diff --git a/include/random/distribution/continuous_uniform_distrib.h b/include/random/distribution/continuous_uniform_distrib.h new file mode 100644 index 0000000..7c1e049 --- /dev/null +++ b/include/random/distribution/continuous_uniform_distrib.h @@ -0,0 +1,24 @@ +#ifndef CONTINUOUS_UNIFORM_DISTRIB_H +#define CONTINUOUS_UNIFORM_DISTRIB_H + +#include "random/distribution/base_distribution.h" + +namespace OptionPricer { + + class ContinuousUniformDistribution : public Distribution { + public: + explicit ContinuousUniformDistribution(const double& a = 0.0, const double& b = 1.0); + ~ContinuousUniformDistribution() override; + + [[nodiscard]] double inv_cdf(const double& quantile) const override; + double operator()(std::mt19937& gen) const override; + + protected: + double a_; // Lower bound + double b_; // Upper bound + mutable std::uniform_real_distribution<> uniform_dist_; + }; + +} + +#endif //CONTINUOUS_UNIFORM_DISTRIB_H diff --git a/include/random/distribution/exponential_distr.h b/include/random/distribution/exponential_distr.h new file mode 100644 index 0000000..bcea0cf --- /dev/null +++ b/include/random/distribution/exponential_distr.h @@ -0,0 +1,23 @@ +#ifndef EXPONENTIAL_DISTR_H +#define EXPONENTIAL_DISTR_H + +#include "random/distribution/base_distribution.h" + +namespace OptionPricer { + + class ExponentialDistribution : public Distribution { + public: + explicit ExponentialDistribution(const double& lambda); + ~ExponentialDistribution() override; + + [[nodiscard]] double inv_cdf(const double& quantile) const override; + double operator()(std::mt19937& gen) const override; + + protected: + double lambda_; // Intensity rate + mutable std::exponential_distribution<> exponential_dist_; + }; + +} + +#endif //EXPONENTIAL_DISTR_H \ No newline at end of file diff --git a/include/random/distribution/gamma_distrib.h b/include/random/distribution/gamma_distrib.h new file mode 100644 index 0000000..7cd09ea --- /dev/null +++ b/include/random/distribution/gamma_distrib.h @@ -0,0 +1,24 @@ +#ifndef GAMMA_DISTRIB_H +#define GAMMA_DISTRIB_H + +#include "random/distribution/base_distribution.h" + +namespace OptionPricer { + + class GammaDistribution : public Distribution { + public: + GammaDistribution(const double& alpha, const double& beta); + ~GammaDistribution() override; + + [[nodiscard]] double inv_cdf(const double& quantile) const override; + double operator()(std::mt19937& gen) const override; + + protected: + double alpha_; // Shape parameter + double beta_; // Rate parameter + mutable std::gamma_distribution<> gamma_dist_; + }; + +} + +#endif //GAMMA_DISTRIB_H diff --git a/include/random/distribution/normal_distrib.h b/include/random/distribution/normal_distrib.h new file mode 100644 index 0000000..fbd22ec --- /dev/null +++ b/include/random/distribution/normal_distrib.h @@ -0,0 +1,25 @@ +#ifndef NORMAL_DISTRIBUTION_H +#define NORMAL_DISTRIBUTION_H + +#include +#include "random/distribution/base_distribution.h" + +namespace OptionPricer { + + class NormalDistribution : public Distribution { + public: + explicit NormalDistribution(const double& mu, const double& sigma); + ~NormalDistribution() override; + + [[nodiscard]] double inv_cdf(const double& quantile) const override; + double operator()(std::mt19937& gen) const override; + + protected: + double mu_; + double sigma_; + mutable std::normal_distribution<> normal_dist_; + }; + +} + +#endif //NORMAL_DISTRIBUTION_H diff --git a/include/random/distribution/poisson_distrib.h b/include/random/distribution/poisson_distrib.h new file mode 100644 index 0000000..6998b10 --- /dev/null +++ b/include/random/distribution/poisson_distrib.h @@ -0,0 +1,23 @@ +#ifndef POISSON_DISTRIB_H +#define POISSON_DISTRIB_H + +#include "random/distribution/base_distribution.h" + +namespace OptionPricer { + + class PoissonDistribution final: public Distribution { + public: + explicit PoissonDistribution(const double& lambda); + ~PoissonDistribution() override; + + [[nodiscard]] double inv_cdf(const double& quantile) const override; + double operator()(std::mt19937& gen) const override; + + private: + double lambda_; + mutable std::poisson_distribution<> poisson_dist_; + }; + +} + +#endif //POISSON_DISTRIB_H \ No newline at end of file diff --git a/include/random/distribution/standard_normal_distribution.h b/include/random/distribution/standard_normal_distribution.h index 1dba829..6faf563 100644 --- a/include/random/distribution/standard_normal_distribution.h +++ b/include/random/distribution/standard_normal_distribution.h @@ -2,20 +2,16 @@ #define STANDARD_NORMAL_DISTRIBUTION_H #include -#include "random/distribution/base_distribution.h" +#include "random/distribution/normal_distrib.h" namespace OptionPricer { - class StandardNormalDistribution final: public Distribution { + class StandardNormalDistribution final: public NormalDistribution { 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_; }; } diff --git a/include/random/number_generator/base_generator.h b/include/random/number_generator/base_generator.h index 78bea22..66bfff6 100644 --- a/include/random/number_generator/base_generator.h +++ b/include/random/number_generator/base_generator.h @@ -5,19 +5,19 @@ namespace OptionPricer { - // MAYB PUTTING THE CREATION INSIDE A STOCKMODEL FACTORY THAT WOULD REQUIRE A THE DIM PARAMETER - // TO BE PASSED TO BOTH THE QUASI RANDOM NUMBER GENERATOR AS WELL AS THE STOCKPRICEMODEL CLASS class NumberGenerator { public: - explicit NumberGenerator(std::shared_ptr dist); - explicit NumberGenerator(std::shared_ptr dist, const unsigned int& seed); + explicit NumberGenerator(const unsigned int &dim); + explicit NumberGenerator(const unsigned int &dim, const unsigned int& seed); virtual ~NumberGenerator(); - virtual double generate(const int& step) = 0; + virtual double operator()(Distribution &dist) const = 0; + unsigned int getDim() const; protected: - std::shared_ptr dist_; + void validateDim() const; + unsigned int dim_; unsigned int seed_; }; diff --git a/include/random/number_generator/base_quasi_random_generator.h b/include/random/number_generator/base_quasi_random_generator.h index ecd2541..1cb2124 100644 --- a/include/random/number_generator/base_quasi_random_generator.h +++ b/include/random/number_generator/base_quasi_random_generator.h @@ -7,18 +7,14 @@ namespace OptionPricer { class QuasiRandomNumberGenerator : public NumberGenerator { public: - explicit QuasiRandomNumberGenerator(std::shared_ptr dist, const unsigned int& dim); - QuasiRandomNumberGenerator(std::shared_ptr dist, const unsigned int& seed, const unsigned int& dim); + explicit QuasiRandomNumberGenerator(const unsigned int& dim); + QuasiRandomNumberGenerator(const unsigned int& dim, const unsigned int& seed); ~QuasiRandomNumberGenerator() override; - unsigned int getDim() const; - protected: - void validateDim() const; - - unsigned int dim_; - std::vector point_; // Maybe use array + mutable int step_; + mutable std::vector point_; // Maybe use array }; } diff --git a/include/random/number_generator/faure_quasi_random_generator.h b/include/random/number_generator/faure_quasi_random_generator.h index 10d2ab3..6700ebf 100644 --- a/include/random/number_generator/faure_quasi_random_generator.h +++ b/include/random/number_generator/faure_quasi_random_generator.h @@ -8,15 +8,15 @@ namespace OptionPricer { class FaureGenerator final: public QuasiRandomNumberGenerator { public: - explicit FaureGenerator(std::shared_ptr dist, const unsigned int& dim); - FaureGenerator(std::shared_ptr dist, const unsigned int& seed, const unsigned int& dim); + explicit FaureGenerator(const unsigned int& dim); + FaureGenerator(const unsigned int& seed, const unsigned int& dim); ~FaureGenerator() override; - [[nodiscard]] double generate(const int& step) override; + double operator()(Distribution& dist) const override; private: - boost::random::faure faureQrng_; + mutable boost::random::faure faureQrng_; }; } diff --git a/include/random/number_generator/pseudo_random_generator.h b/include/random/number_generator/pseudo_random_generator.h new file mode 100644 index 0000000..3ffc680 --- /dev/null +++ b/include/random/number_generator/pseudo_random_generator.h @@ -0,0 +1,21 @@ +#ifndef PSEUDO_RANDOM_NUMBER_GENERATOR_H +#define PSEUDO_RANDOM_NUMBER_GENERATOR_H + +#include "random/number_generator/base_generator.h" + +namespace OptionPricer { + + class PseudoRandomNumberGenerator final: public NumberGenerator { + public: + using NumberGenerator::NumberGenerator; + ~PseudoRandomNumberGenerator() override; + + double operator()(Distribution& dist) const override; + + private: + mutable std::mt19937 generator_; // Mersenne Twister PRNG + }; + +} + +#endif //PSEUDO_RANDOM_NUMBER_GENERATOR_H diff --git a/include/random/number_generator/random_generator.h b/include/random/number_generator/random_generator.h deleted file mode 100644 index 7750964..0000000 --- a/include/random/number_generator/random_generator.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef RANDOM_NUMBER_GENERATOR_H -#define RANDOM_NUMBER_GENERATOR_H - -#include "random/number_generator/base_generator.h" - -namespace OptionPricer { - - class RandomNumberGenerator final: public NumberGenerator { - public: - explicit RandomNumberGenerator(std::shared_ptr dist); - RandomNumberGenerator(std::shared_ptr dist, const unsigned int& seed); - - [[nodiscard]] double generate(const int& step) override; - - private: - std::mt19937 generator_; // Mersenne Twister PRNG - }; - -} - -#endif //RANDOM_NUMBER_GENERATOR_H diff --git a/include/random/number_generator/sobol_quasi_random_generator.h b/include/random/number_generator/sobol_quasi_random_generator.h index 8610801..d9caee6 100644 --- a/include/random/number_generator/sobol_quasi_random_generator.h +++ b/include/random/number_generator/sobol_quasi_random_generator.h @@ -8,15 +8,15 @@ namespace OptionPricer { class SobolGenerator final: public QuasiRandomNumberGenerator { public: - explicit SobolGenerator(std::shared_ptr dist, const unsigned int& dim); - SobolGenerator(std::shared_ptr dist, const unsigned int& seed, const unsigned int& dim); + explicit SobolGenerator(const unsigned int& dim); + SobolGenerator(const unsigned int& dim, const unsigned int& seed); ~SobolGenerator() override; - [[nodiscard]] double generate(const int& step) override; + double operator()(Distribution& dist) const override; private: - boost::random::sobol sobolQrng_; + mutable boost::random::sobol sobolQrng_; }; } diff --git a/include/solver/monte_carlo/base_mc.h b/include/solver/monte_carlo/base_mc.h index a83a13e..b040f3a 100644 --- a/include/solver/monte_carlo/base_mc.h +++ b/include/solver/monte_carlo/base_mc.h @@ -9,10 +9,7 @@ namespace OptionPricer { class MCPricer { public: - MCPricer(std::shared_ptr marketData, - std::shared_ptr stockModel, - std::shared_ptr generator); - + MCPricer(std::shared_ptr marketData, std::shared_ptr stockModel); virtual ~MCPricer(); [[nodiscard]] virtual double calculatePrice(const unsigned long& N) const = 0; @@ -20,7 +17,6 @@ namespace OptionPricer { protected: std::shared_ptr marketData_; std::shared_ptr stockModel_; - std::shared_ptr generator_; }; } diff --git a/include/solver/monte_carlo/base_mc_path_dependent.h b/include/solver/monte_carlo/base_mc_path_dependent.h deleted file mode 100644 index 6c86b14..0000000 --- a/include/solver/monte_carlo/base_mc_path_dependent.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef BASE_MC_PATH_DEPENDENT_H -#define BASE_MC_PATH_DEPENDENT_H - -#include "solver/monte_carlo/base_mc.h" - -namespace OptionPricer { - - class PathDependentMCPricer : public MCPricer { - public: - PathDependentMCPricer(std::shared_ptr marketData, - std::shared_ptr stockModel, - std::shared_ptr generator, - const unsigned int& steps); - - protected: - unsigned int steps_; - }; - -} - -#endif //BASE_MC_PATH_DEPENDENT_H diff --git a/include/solver/monte_carlo/builder/base_mc_builder.h b/include/solver/monte_carlo/builder/base_mc_builder.h index 791a7b5..a8ff909 100644 --- a/include/solver/monte_carlo/builder/base_mc_builder.h +++ b/include/solver/monte_carlo/builder/base_mc_builder.h @@ -2,9 +2,10 @@ #define BASE_MC_BUILDER_H #include "solver/monte_carlo/base_mc.h" +#include "option/base_option.h" #include "model/base_model.h" +#include #include "model/gbm_model.h" -#include "option/base_option.h" namespace OptionPricer { @@ -15,7 +16,6 @@ namespace OptionPricer { MCBuilder& setMarketData(std::shared_ptr marketData); MCBuilder& setStockPriceModel(std::shared_ptr stockModel); - MCBuilder& setNumberGenerator(std::shared_ptr generator); virtual MCBuilder& setOption(std::shared_ptr