Skip to content

Commit

Permalink
added MC and QMC
Browse files Browse the repository at this point in the history
  • Loading branch information
anthonymakarewicz committed Aug 10, 2024
1 parent 4addff4 commit effc8b7
Show file tree
Hide file tree
Showing 61 changed files with 55,040 additions and 608 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/pr_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ jobs:
cmake-version: '3.26.3'

- name: Install dependencies
run: sudo apt-get install -y libgtest-dev libgmock-dev clang-tidy lcov #clang-format
run: sudo apt-get install -y libgtest-dev libgmock-dev libboost-all-dev

- name: Configure CMake
run: |
cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_CXX_STANDARD=20 ..
- name: Build Main Executable and Test Executable
run: |
cmake --build build
cmake --build build --target Unit_tests Integration_tests
# - name: Analyze code with clang-tidy
# run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/push_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
cmake-version: '3.26.3'

- name: Install dependencies
run: sudo apt-get install -y libgtest-dev libgmock-dev libboost-all-dev #clang-tidy lcov #clang-format
run: sudo apt-get install -y libgtest-dev libgmock-dev libboost-all-dev

- name: Configure CMake
run: |
Expand Down
8 changes: 7 additions & 1 deletion .idea/Option_pricer.iml

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

3 changes: 3 additions & 0 deletions .idea/misc.xml

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

28 changes: 11 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ find_package(Boost REQUIRED COMPONENTS random)
# Check if random has been found before compiling src
if (Boost_FOUND)
message(STATUS "Boost found: ${Boost_VERSION}")
# Ensure Boost include directories are added
include_directories(${Boost_INCLUDE_DIRS})
else()
message(FATAL_ERROR "Boost not found!")
endif()
Expand All @@ -37,7 +39,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/base_solver.h
)

# Create dynamic library for payoff
Expand Down Expand Up @@ -69,24 +70,16 @@ add_library(option SHARED
src/option/single_path/double_digital_option.cpp
src/option/path_dependent/base_path_dependent_option.cpp
src/option/path_dependent/american_option.cpp
src/option/path_dependent/asian/base_asian_option.cpp
src/option/path_dependent/asian/arithmetic_asian_option.cpp
src/option/path_dependent/asian/geometric_asian_option.cpp
src/option/path_dependent/barrier/base_barrier_option.cpp
src/option/path_dependent/barrier/knock_behavior.cpp
src/option/path_dependent/barrier/double_barrier.cpp
src/option/path_dependent/barrier/base_single_barrier_option.cpp
src/option/path_dependent/barrier/up_single_barrier_option.cpp
src/option/path_dependent/barrier/down_single_barrier_option.cpp
src/option/path_dependent/asian_option.cpp
src/option/path_dependent/barrier_option.cpp
# Factories
src/option/factory_option.cpp
src/option/single_path/factory_european_option.cpp
src/option/single_path/factory_digital_option.cpp
src/option/single_path/factory_double_digital_option.cpp
src/option/path_dependent/factory_american_option.cpp
src/option/path_dependent/asian/factory_arithmetic_asian_option.cpp
src/option/path_dependent/asian/factory_geometric_asian_option.cpp
src/option/path_dependent/barrier/factory_up_single_barrier_option.cpp
src/option/path_dependent/factory_asian_option.cpp
src/option/path_dependent/factory_barrier_option.cpp
)

# Create dynamic library for marketdata
Expand All @@ -99,11 +92,12 @@ add_library(solver SHARED
src/solver/monte_carlo/stock_price_model.cpp
src/solver/monte_carlo/gbm_stock_price_model.cpp
include/solver/monte_carlo/gbm_stock_price_model.h
include/solver/monte_carlo/generator.h

)

# Link random library to the solver ONLY
#target_link_libraries(solver PRIVATE Boost::random)
target_link_libraries(solver PUBLIC Boost::random)

# Link the option library against marketdata and payoff
target_link_libraries(option PUBLIC marketdata payoff)
Expand All @@ -112,12 +106,12 @@ target_link_libraries(option PUBLIC marketdata payoff)
add_executable(Option_pricer main.cpp)

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

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

# Add the examples subdirectory
add_subdirectory(examples)
add_subdirectory(examples)
15 changes: 14 additions & 1 deletion examples/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,14 @@
#find_package(Boost REQUIRED COMPONENTS random)
find_package(Boost REQUIRED COMPONENTS random)

if (Boost_FOUND)
message(STATUS "Boost found: ${Boost_VERSION}")
else()
message(FATAL_ERROR "Boost not found!")
endif()

add_executable(sobol generate_sobol.cpp
generate_sobol.cpp)

target_link_libraries(sobol Boost::random)

set_target_properties(sobol PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/examples)
81 changes: 63 additions & 18 deletions examples/generate_sobol.cpp
Original file line number Diff line number Diff line change
@@ -1,37 +1,82 @@
#include <iostream>
#include <filesystem>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <vector>
#include <fstream>
#include <filesystem>
#include <boost/lexical_cast.hpp>
#include <boost/random/faure.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/sobol.hpp>
#include <boost/random/uniform_01.hpp>

std::filesystem::path createOutputDir() {
std::filesystem::path outputDir = "output";
std::filesystem::path sourceDir = std::filesystem::current_path();
std::filesystem::path destDir = sourceDir.parent_path().parent_path() / "examples" / outputDir;
if (!exists(destDir)) {
create_directory(destDir);
std::cout << "Directory created: " << destDir << "\n";
}
return destDir;
}

int main() {
std::filesystem::path path = "";

std::ofstream csvFile("sobol_sequence_5.csv");
unsigned int N = 0, s = 0;
do {
std::cout << "Enter the number of samples (N): ";
std::cin >> N;
std::cout << "Enter the number of dimensions (s): ";
std::cin >> s;
} while (N <= 0 || s <= 0);

std::string endFileName = boost::lexical_cast<std::string>(s) + ".csv";
std::filesystem::path csvPath = createOutputDir() / ("sequences_" + endFileName);

std::ofstream csvFile(csvPath);

if (!csvFile.is_open()) {
std::cerr << "Failed to open file for writing." << std::endl;
return 1;
}

boost::random::sobol qrng(2); // 3-dimensional Sobol sequence
qrng.seed(42);
unsigned int seed = 42;
boost::mt19937 unifRng(seed); // Mersenne Twister Pseudo-Random Number Generator (PRNG)
boost::random::uniform_01<> uniformGen;

boost::random::sobol sobolQrng(s); // s-dimensional Sobol Quasi Random Number Generator (QRNG)
boost::random::faure faureQrng(s); // s-dimensional Faure Quasi Random Number Generator (QRNG)

std::vector<double> point(2);
sobolQrng.seed(seed);
faureQrng.seed(seed);

csvFile << "x,y\n";
std::vector<double> sobolPoint(s);
std::vector<double> faurePoint(s);

std::cout << "Sobol sequence using Boost:" << std::endl;
for (int i = 0; i < 5; ++i) {
qrng.generate(point.begin(), point.end());
for (auto& coord : point)
coord /= static_cast<double>(boost::random::sobol::max());
// Write header to CSV file
csvFile << "Sample,Dimension,Sobol,Faure,Uniform\n";

csvFile << std::fixed << std::setprecision(8) << point[0] << "," << point[1] << "\n";
std::cout << std::endl;
for (unsigned int i = 1; i <= N; ++i) {
// Generate Sobol and Faure sequences for this sample
sobolQrng.generate(sobolPoint.begin(), sobolPoint.end());
faureQrng.generate(faurePoint.begin(), faurePoint.end());

for (unsigned int d = 1; d <= s; ++d) {
// Normalize Sobol and Faure values to [0, 1)
double sobolVal = sobolPoint[d - 1] / static_cast<double>(boost::random::sobol::max());
double faureVal = faurePoint[d - 1] / static_cast<double>(boost::random::faure::max());
double uniformVal = uniformGen(unifRng);

// Write values to CSV
csvFile << i << "," << d << ","
<< std::fixed << std::setprecision(8)
<< sobolVal << ","
<< faureVal << ","
<< uniformVal << "\n";
}
}

csvFile.close();
std::cout << "Sequences exported to " << csvPath << std::endl;

return 0;
}
}
Loading

0 comments on commit effc8b7

Please sign in to comment.