// // Created by David Doebel on 27.03.2026. // #include "BSWrapper.hpp" #include "BlackScholesClosedFormEngine.hpp" #include "BlackScholesProcess.hpp" #include "Instrument.hpp" #include "Option.hpp" #include "FlatVolatilitySurface.hpp" #include "FlatYieldCurve.hpp" #include #include class FlatYieldCurve; double BSWrapper::bs_price_wrapper(double S, double K, double T, double r, double sigma, bool is_call) { std::shared_ptr flat_curve = std::make_shared(r); auto flat_vol_surface = std::make_shared(sigma); MarketData data(S,flat_curve, flat_vol_surface); std::unique_ptr process = std::make_unique(data); std::unique_ptr pricing_engine = std::make_unique(std::move(process)); std::unique_ptr payoff; if (is_call) payoff = std::make_unique(K); else payoff = std::make_unique(K); EuropeanExercise exercise(T); VanillaOption option(T,std::make_unique(exercise), std::move(payoff),std::move(pricing_engine)); return option.price(); } std::vector BSWrapper::batch_bs_price_wrapper(const std::vector &S, const std::vector &K, const std::vector &T, const std::vector &r, const std::vector &sigma, const std::vector &is_call) { assert(K.size() == S.size() && K.size() == T.size() && K.size() == r.size() && K.size() == sigma.size() && K.size() == is_call.size()); std::size_t n = K.size(); std::vector result(n); for (std::size_t i = 0; i < n; ++i) { result[i] = bs_price_wrapper(S[i], K[i], T[i], r[i], sigma[i], is_call[i]); if (i % 100 == 0) std::cout << "i = " << i << " result = " << result[i] << std::endl; // ( i % 1000 == 0) } return result; }