A modern C++ library for pricing options using various numerical methods, designed for quantitative finance applications.
- Black-Scholes Model: Analytical pricing for European options
- Binomial Tree: Numerical method for pricing American and European options
- Trinomial Tree: Enhanced numerical method with better convergence
- Greeks Calculation: Delta, Gamma, Theta, Vega, Rho
- Implied Volatility: Calculate implied volatility from option prices
- Portfolio Management: Tools for managing options portfolios
-
Additional Option Types
- Digital/Binary options
- Barrier options (knock-in, knock-out)
- Asian options (arithmetic and geometric averages)
- Lookback options
-
Improved Numerical Methods
- Finite difference methods for PDE solutions
- Monte Carlo simulations for path-dependent options
- Control variate techniques for variance reduction
- Antithetic variates for Monte Carlo
-
Volatility Models
- Term structure of volatility
- SABR model implementation
- Local volatility models
- Heston stochastic volatility model
-
Market Data Integration
- Yield curve bootstrapping
- Volatility surface calibration
- Historical data analysis tools
-
Risk Management
- VaR (Value at Risk) calculations
- Historical and Monte Carlo VaR
- Portfolio stress testing
-
Advanced Models and Methods
- Jump-diffusion models (Merton model)
- Rough volatility models
-
Exotic Options
- Bermudan options
- Compound options
- Chooser options
- Basket options on multiple underlyings
- Quanto options with foreign exchange features
-
Calibration Techniques
- Advanced optimization methods for model calibration
- Global optimization techniques (genetic algorithms, simulated annealing)
- Multi-curve calibration framework
-
Regulatory and Compliance Features
- FRTB (Fundamental Review of the Trading Book) calculations
- XVA suite (CVA, DVA, FVA, MVA)
- Back-testing framework for model validation
- C++17 compatible compiler
- Catch2 (for testing only)
This is a header-only library, so no installation is required. Simply include the header file in your project:
// Managing a Portfolio of Options
#include "basic_options_pricing.h"
#include <iostream>
using namespace BasicOptionsPricing;
int main() {
// Create a portfolio
OptionPortfolio portfolio;
// Add different options to the portfolio
auto call = OptionFactory::createOption(
100.0, 100.0, 0.05, 0.2, 1.0, OptionType::Call,
ExerciseType::European, "BlackScholes");
auto put = OptionFactory::createOption(
100.0, 100.0, 0.05, 0.2, 1.0, OptionType::Put,
ExerciseType::American, "BinomialTree", 100);
// Add options with quantities
portfolio.addOption(std::move(call), 1.0);
portfolio.addOption(std::move(put), 2.0);
// Calculate portfolio value and greeks
double value = portfolio.totalValue();
double delta = portfolio.delta();
double gamma = portfolio.gamma();
std::cout << "Portfolio Value: " << value << std::endl;
std::cout << "Portfolio Delta: " << delta << std::endl;
std::cout << "Portfolio Gamma: " << gamma << std::endl;
return 0;
}enum class OptionType { Call, Put };
enum class ExerciseType { European, American };class Option {
public:
Option(double spot, double strike, double riskFreeRate,
double volatility, double timeToMaturity,
OptionType type, ExerciseType exerciseType);
virtual double price() const = 0;
// Getters
double spot() const;
double strike() const;
double riskFreeRate() const;
double volatility() const;
double timeToMaturity() const;
OptionType type() const;
ExerciseType exerciseType() const;
};class BlackScholesOption : public Option {
public:
BlackScholesOption(double spot, double strike, double riskFreeRate,
double volatility, double timeToMaturity,
OptionType type);
double price() const override;
double delta() const;
double gamma() const;
double theta() const;
double vega() const;
double rho() const;
struct Greeks {
double delta;
double gamma;
double theta;
double vega;
double rho;
};
Greeks calculateGreeks() const;
};class BinomialTreeOption : public Option {
public:
BinomialTreeOption(double spot, double strike, double riskFreeRate,
double volatility, double timeToMaturity,
OptionType type, ExerciseType exerciseType,
unsigned int steps = 100);
double price() const override;
double delta() const;
double gamma() const;
double theta() const;
double vega() const;
struct Greeks {
double delta;
double gamma;
double theta;
double vega;
};
Greeks calculateGreeks() const;
};class TrinomialTreeOption : public Option {
public:
TrinomialTreeOption(double spot, double strike, double riskFreeRate,
double volatility, double timeToMaturity,
OptionType type, ExerciseType exerciseType,
unsigned int steps = 80);
double price() const override;
double delta() const;
double gamma() const;
double theta() const;
double vega() const;
struct Greeks {
double delta;
double gamma;
double theta;
double vega;
};
Greeks calculateGreeks() const;
};class OptionFactory {
public:
static std::unique_ptr<Option> createOption(
double spot,
double strike,
double riskFreeRate,
double volatility,
double timeToMaturity,
OptionType type,
ExerciseType exerciseType,
const std::string& pricingMethod,
unsigned int steps = 100);
};class ImpliedVolatilityCalculator {
public:
static double calculateImpliedVolatility(
double targetPrice,
double spot,
double strike,
double riskFreeRate,
double timeToMaturity,
OptionType type,
double tolerance = 1e-6,
unsigned int maxIterations = 100);
};class OptionPortfolio {
public:
void addOption(std::unique_ptr<Option> option, double quantity = 1.0);
double totalValue() const;
double delta() const;
double gamma() const;
};To build and run the examples:
g++ -std=c++17 -o option_pricing_examples main.cpp
./option_pricing_examplesTo run the tests (requires Catch2):
g++ -std=c++17 -o option_pricing_tests tests.cpp
./option_pricing_tests- For European options, the Black-Scholes model provides exact analytical solutions and is significantly faster than tree-based methods.
- For American options, tree-based methods are necessary. The trinomial tree generally provides better accuracy than the binomial tree with fewer steps, but at a higher computational cost per step.
- For large portfolios or high-frequency applications, consider using optimized numerical libraries or GPU acceleration for the tree-based methods.
- Hull, J. (2015). Options, Futures, and Other Derivatives. Pearson.
- Wilmott, P. (2007). Paul Wilmott Introduces Quantitative Finance. Wiley.
- QuantLib: The Quantitative Finance Library (https://www.quantlib.org/)