A Python package for pricing European options using Monte Carlo simulation, featuring variance reduction techniques and publication-quality visualizations. Designed for educational purposes and financial engineering applications.
- European call and put option pricing with Monte Carlo simulation
- Variance reduction using antithetic variates
- Comparison with Black-Scholes analytical solutions
- Publication-quality visualizations:
- Price convergence analysis
- Stock price and payoff distributions
- Parameter sensitivity analysis
- Command-line interface for quick pricing and visualization
- Comprehensive examples for educational purposes
pip install optionmc
from optionmc.models import OptionPricing
# Create option pricing model
model = OptionPricing(
S0=100, # Initial stock price
E=100, # Strike price
T=1.0, # Time to maturity (1 year)
rf=0.05, # Risk-free rate (5%)
sigma=0.2, # Volatility (20%)
iterations=100000 # Number of simulations
)
# Calculate option prices
call_price = model.call_option_simulation()
put_price = model.put_option_simulation()
# Get analytical solutions for comparison
bs_call, bs_put = model.bs_analytical_price()
# Print results
print(f"Call Option Price: ${call_price:.4f} (Black-Scholes: ${bs_call:.4f})")
print(f"Put Option Price: ${put_price:.4f} (Black-Scholes: ${bs_put:.4f})")
# Basic option pricing
optionmc price --s0 100 --strike 95 --volatility 0.25 --time 0.5
# Using antithetic variates for variance reduction
optionmc price --method antithetic --iterations 500000
# Custom output directory
optionmc price --output-dir my_results
The Black-Scholes model provides analytical solutions for European options based on a partial differential equation approach. This package implements the closed-form solution as a benchmark for Monte Carlo simulations.
The derivation starts with several key assumptions:
- Stock prices follow geometric Brownian motion
- Markets are frictionless with no arbitrage opportunities
- Volatility and risk-free rate remain constant
- Trading occurs continuously
- No dividends are paid during the option's life
Under these assumptions, the stock price follows the stochastic differential equation:
Where
The Black-Scholes partial differential equation is:
Solving this equation with appropriate boundary conditions yields the closed-form solutions:
For a European call option:
For a European put option:
Where:
-
$S_0$ is the initial stock price -
$K$ is the strike price -
$r$ is the risk-free rate -
$T$ is the time to maturity (in years) -
$\Phi(\cdot)$ is the cumulative distribution function of the standard normal distribution $d_1 = \frac{\ln(S_0/K) + (r + \sigma^2/2)T}{\sigma\sqrt{T}}$ $d_2 = d_1 - \sigma\sqrt{T}$
This package implements both Monte Carlo simulation and the analytical Black-Scholes solution for several reasons:
- Benchmarking: The analytical solution provides a precise benchmark to validate the accuracy of Monte Carlo simulations
- Educational Value: Comparing both methods helps users understand the trade-offs between analytical and numerical approaches
- Efficiency: For standard European options, the analytical solution is computationally more efficient
- Error Analysis: Having an exact solution allows for precise error measurements in the Monte Carlo implementation
Despite its elegance, the Black-Scholes model has several limitations:
- Constant Volatility: Assumes volatility remains constant throughout the option's life, contradicting observed "volatility smiles" in markets
- Log-normal Distribution: Assumes returns follow a normal distribution, which often understates the probability of extreme market moves
- Continuous Trading: Assumes continuous hedging with no transaction costs, which is impractical in real markets
- Constant Interest Rates: Assumes risk-free rates remain fixed, which may not hold for longer-dated options
- No Early Exercise: Only applies to European options, not American options that allow early exercise
- No Dividends: The basic model doesn't account for dividend payments (though extensions exist)
The Monte Carlo approach for option pricing follows these steps:
-
Simulate stock price paths using Geometric Brownian Motion (GBM):
$$S_T = S_0 \exp\left((r - \frac{\sigma^2}{2})T + \sigma\sqrt{T}Z\right)$$ where
$Z \sim N(0,1)$ is a standard normal random variable. -
Calculate payoffs at maturity:
- Call option:
$\max(S_T - K, 0)$ - Put option:
$\max(K - S_T, 0)$
- Call option:
-
Discount and average the payoffs to get the option price:
- Call price:
$C = e^{-rT} \mathbb{E}[\max(S_T - K, 0)]$ - Put price:
$P = e^{-rT} \mathbb{E}[\max(K - S_T, 0)]$
- Call price:
This package implements the antithetic variates technique, which:
- Uses pairs of negatively correlated random variables
$(Z, -Z)$ in the simulation - Averages the results to reduce variance
- Typically achieves the same accuracy with fewer simulations
models.py
: Core option pricing algorithmsvisualization.py
: Plotting functions for analysiscli.py
: Command-line interfaceutils.py
: Utility functions for saving/loading results
While powerful, the Monte Carlo approach has several limitations to consider:
-
Computational Intensity: Requires many iterations for accurate results, especially for:
- Out-of-the-money options (K/S₀ >> 1 for calls, K/S₀ << 1 for puts)
- Options with low volatility
- Options near expiration
-
Convergence Rate: Monte Carlo error decreases as O(1/√n), meaning:
- To halve the error, you need 4 times more simulations
- Variance reduction techniques help but don't eliminate this issue
-
Model Assumptions:
- Assumes geometric Brownian motion for stock prices
- Constant volatility and interest rates
- No transaction costs or early exercise
- Perfect liquidity and continuous trading
-
Implementation Considerations:
- Random number generator quality affects results
- Numerical precision issues with very small probabilities
- Not suitable for real-time pricing without optimizations
The current implementation of OptionMC has several limitations:
- European Options Only: Limited to European-style options; does not support American or exotic options
- Single-Factor Models: Only models stock price as the underlying stochastic process
- Basic Variance Reduction: Implements antithetic variates but not other techniques like control variates or importance sampling
- No Path-Dependent Features: Cannot handle path-dependent options like Asian options or barrier options
- No Dividend Support: Current implementation does not account for dividend payments
For certain option pricing scenarios, consider alternatives:
-
Analytical Solutions:
- Black-Scholes for standard European options (faster and more accurate)
- Closed-form extensions for simple dividend models or barrier options
-
Lattice Methods:
- Binomial/trinomial trees for American options with early exercise
- Better for visualizing the evolution of option prices over time
-
Finite Difference Methods:
- For solving complex PDEs associated with exotic options
- Often more efficient than Monte Carlo for low-dimensional problems
-
Fourier Transform Methods:
- For options with known characteristic functions
- Often more efficient for certain exotic options
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch:
git checkout -b feature/amazing-feature
- Commit your changes:
git commit -m 'Add some amazing feature'
- Push to the branch:
git push origin feature/amazing-feature
- Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Sandy H. S. Herho [email protected]
- Siti N. Kaban
- Cahya Nugraha
If you use this package in your research, please cite it as:
@misc{herho2025optionmc,
author = {Herho, S and Kaban, S and Nugraha, C},
title = {OptionMC: A Python package for Monte Carlo pricing of European options},
howpublished = {Available at SSRN: \url{https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5224853}},
year = {2025},
note = {Accessed: January 10, 2025}
}