CoolFace
Apppublic

Ankit3445/options_pricing

sourceHugging Faceupdated 3mo agoView on Hugging Face
0likes
PricingEngine.hpp87 linesDownload Raw Back to root
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