Ankit3445/options_pricing
0
1#pragma once2 3#include "Common.hpp"4#include <vector>5 6struct ConvergencePoint {7 unsigned int paths;8 double bs_price;9 double mc_price;10 double error;11 double std_error;12};13 14class PricingEngine {15public:16 virtual ~PricingEngine() = default;17 virtual Greeks calculate(const MarketTick& tick) = 0;18};19 20class BlackScholesEngine : public PricingEngine {21public:22 Greeks calculate(const MarketTick& tick) override;23 24 static double price(double S, double K, double T, double r, double sigma, OptionType type);25 static Greeks greeks(double S, double K, double T, double r, double sigma, OptionType type);26 static double implied_volatility(double market_price, double S, double K,27 double T, double r, OptionType type);28 29private:30 static double cum_norm(double x);31 static double norm_pdf(double x);32 static double bs_price(double S, double K, double T, double r, double sigma, OptionType type);33 static Greeks bs_greeks(double S, double K, double T, double r, double sigma, OptionType type);34 static double implied_vol_newton(double target, double S, double K, double T, double r, OptionType type);35 static double implied_vol_bisection(double target, double S, double K, double T, double r, OptionType type);36};37 38class MonteCarloEngine : public PricingEngine {39public:40 explicit MonteCarloEngine(unsigned int num_paths = 100000);41 Greeks calculate(const MarketTick& tick) override;42 43 // Exotic option pricing44 Greeks calculate_asian(double S, double K, double T, double r, double sigma, OptionType type, unsigned int steps = 52) const;45 Greeks calculate_barrier(double S, double K, double T, double r, double sigma, OptionType type, double barrier, bool down_and_out) const;46 Greeks calculate_lookback(double S, double K, double T, double r, double sigma, OptionType type) const;47 48 // Convergence analysis: run MC at multiple path counts49 std::vector<ConvergencePoint> convergence(double S, double K, double T, double r, double sigma,50 OptionType type, unsigned int max_paths = 100000) const;51 52private:53 unsigned int num_paths_;54 55 // Standard European MC56 double run_mc(double S, double K, double T, double r, double sigma,57 OptionType type, const std::vector<double>& z) const;58 59 // Asian MC: payoff = max(avg(S) - K, 0) for call60 double run_mc_asian(double S, double K, double T, double r, double sigma,61 OptionType type, unsigned int steps,62 const std::vector<std::vector<double>>& paths) const;63 64 // Barrier MC: payoff if barrier not touched65 double run_mc_barrier(double S, double K, double T, double r, double sigma,66 OptionType type, double barrier, bool down_and_out,67 const std::vector<double>& z) const;68 69 // Lookback MC: payoff = max(max(S) - K, 0) for call70 double run_mc_lookback(double S, double K, double T, double r, double sigma,71 OptionType type, const std::vector<double>& z) const;72 73 Greeks fd_greeks(double S, double K, double T, double r, double sigma,74 OptionType type, const std::vector<double>& z) const;75 76 Greeks fd_greeks_exotic(double S, double K, double T, double r, double sigma,77 OptionType type, unsigned int style,78 double barrier, bool down_and_out,79 const std::vector<double>& z,80 const std::vector<std::vector<double>>& paths) const;81 82 // Helper: generate standard normal random numbers83 void generate_normals(std::vector<double>& z) const;84 // Helper: generate correlated normals for multi-step paths85 void generate_paths(std::vector<std::vector<double>>& paths, double S, double T, double r, double sigma) const;86};87 