StochVolModels
Python implementation of pricing analytics and Monte Carlo simulations for stochastic volatility models including log-normal SV model, Heston
> stochvolmodels package implements pricing analytics and Monte Carlo simulations for valuation of European call and put options and implied volatilities of different stochastic volatility models including Karasinski-Sepp log-normal stochastic volatility model and Heston stochastic volatility model. The project is written primarily in Python, distributed under the MIT License license, first published in 2022. Key topics include: fourier-transform, heston-model, heston-stochastic-volatility, lognormal-stochastic-volatility, monte-carlo-simulation.
๐ StochVolModels Package: stochvolmodels
stochvolmodels package implements pricing analytics and Monte Carlo simulations for valuation of European call and put options and implied volatilities of different stochastic volatility models including Karasinski-Sepp log-normal stochastic volatility model and Heston stochastic volatility model.
| ๐ Metric | ๐ข Value |
|---|---|
| PyPI Version | |
| Python Versions | |
| License | |
| CI Status |
๐ Package Statistics
| ๐ Metric | ๐ข Value |
|---|---|
| Total Downloads | |
| Monthly | |
| Weekly | |
| GitHub Stars | |
| GitHub Forks |
StochVolModels
The StochVol package provides:
- Analytics for Black-Scholes and Normal vols
- Interfaces and implementation for stochastic volatility models,
including Karasinski-Sepp log-normal SV model and Heston SV model
using analytical method with Fourier transform and Monte Carlo simulations - Visualization of model implied volatilities
For the analytic implementation of stochastic volatility models, the package provides interfaces for a generic volatility model with the following features.
- Interface for analytical pricing of vanilla options
using Fourier transform with closed-form solution for moment generating function - Interface for Monte-Carlo simulations of model dynamics
Illustrations of using package analytics for research
work is provided in top-level package my_papers
which contains computations and visualisations for several papers
Installation
Install using
pythonpip install stochvolmodels
Upgrade using
pythonpip install --upgrade stochvolmodels
Clone using
pythongit clone https://github.com/ArturSepp/StochVolModels.git
Core Dependencies
python >= 3.8numba >= 0.56.4numpy >= 1.22.4scipy >= 1.10pandas >= 2.2.0matplotlib >= 3.2.2seaborn >= 0.12.2
Optional dependencies:
qis ">=2.3.1" (for running code in my_papers)
Table of contents
- Model Interface
- Running log-normal SV pricer
- Running Heston SV pricer
- Supporting Illustrations for Public Papers
Running model calibration to sample Bitcoin options data
Implemented Stochastic Volatility models <a name="introduction"></a>
The package provides interfaces for a generic volatility model with the following features.
- Interface for analytical pricing of vanilla options using Fourier transform with closed-form solution for moment generating function
- Interface for Monte-Carlo simulations of model dynamics
- Interface for visualization of model implied volatilities
The model interface is in stochvolmodels/pricers/model_pricer.py
Log-normal stochastic volatility model <a name="logsv"></a>
The analytics for Karasinski-Sepp log-normal stochastic volatility model is based on the paper
Log-normal Stochastic Volatility Model with Quadratic Drift by Artur Sepp and Parviz Rakhmonov
The dynamics of the log-normal stochastic volatility model:
$$dS_{t}=r(t)S_{t}dt+\sigma_{t}S_{t}dW^{(0)}_{t}$$
$$d\sigma_{t}=\left(\kappa_{1} + \kappa_{2}\sigma_{t} \right)(\theta - \sigma_{t})dt+ \beta \sigma_{t}dW^{(0)}{t} + \varepsilon \sigma{t} dW^{(1)}_{t}$$
$$dI_{t}=\sigma^{2}_{t}dt$$
where $r(t)$ is the deterministic risk-free rate; $W^{(0)}_{t}$ and $W^{(1)}_t$ are uncorrelated Brownian motions, $\beta\in\mathbb{R}$ is the volatility beta which measures the sensitivity of the volatility to changes in the spot price, and $\varepsilon>0$ is the volatility of residual volatility. We denote by $\vartheta^{2}$, $\vartheta^{2}=\beta^{2}+\varepsilon^{2}$, the total instantaneous variance of the volatility process.
Implementation of Lognormal SV model is contained in
pythonstochvolmodels/pricers/logsv_pricer.py
Heston stochastic volatility model <a name="hestonsv"></a>
The dynamics of Heston stochastic volatility model:
$$dS_{t}=r(t)S_{t}dt+\sqrt{V_{t}}S_{t}dW^{(S)}_{t}$$
$$dV_{t}=\kappa (\theta - V_{t})dt+ \vartheta \sqrt{V_{t}}dW^{(V)}_{t}$$
where $W^{(S)}$ and $W^{(V)}$ are correlated Brownian motions with correlation parameter $\rho$
Implementation of Heston SV model is contained in
pythonstochvolmodels/pricers/heston_pricer.py
Running log-normal SV pricer <a name="paragraph1"></a>
Basic features are implemented in
pythonexamples/run_lognormal_sv_pricer.py
Imports:
pythonimport numpy as np import stochvolmodels as sv from stochvolmodels import LogSVPricer, LogSvParams, OptionChain
Computing model prices and vols <a name="subparagraph1"></a>
python# instance of pricer logsv_pricer = LogSVPricer() # define model params params = LogSvParams(sigma0=1.0, theta=1.0, kappa1=5.0, kappa2=5.0, beta=0.2, volvol=2.0) # 1. compute the price model_price, vol = logsv_pricer.price_vanilla(params=params, ttm=0.25, forward=1.0, strike=1.0, optiontype='C') print(f"price={model_price:0.4f}, implied vol={vol: 0.2%}") # 2. prices for slices model_prices, vols = logsv_pricer.price_slice(params=params, ttm=0.25, forward=1.0, strikes=np.array([0.9, 1.0, 1.1]), optiontypes=np.array(['P', 'C', 'C'])) print([f"{p:0.4f}, implied vol={v: 0.2%}" for p, v in zip(model_prices, vols)]) # 3. prices for option chain with uniform strikes option_chain = OptionChain.get_uniform_chain(ttms=np.array([0.083, 0.25]), ids=np.array(['1m', '3m']), strikes=np.linspace(0.9, 1.1, 3)) model_prices, vols = logsv_pricer.compute_chain_prices_with_vols(option_chain=option_chain, params=params) print(model_prices) print(vols)
Running model calibration to sample Bitcoin options data <a name="subparagraph2"></a>
pythonbtc_option_chain = chains.get_btc_test_chain_data() params0 = LogSvParams(sigma0=0.8, theta=1.0, kappa1=5.0, kappa2=None, beta=0.15, volvol=2.0) btc_calibrated_params = logsv_pricer.calibrate_model_params_to_chain(option_chain=btc_option_chain, params0=params0, constraints_type=ConstraintsType.INVERSE_MARTINGALE) print(btc_calibrated_params) logsv_pricer.plot_model_ivols_vs_bid_ask(option_chain=btc_option_chain, params=btc_calibrated_params)
Comparison of model prices vs MC <a name="subparagraph3"></a>
pythonbtc_option_chain = chains.get_btc_test_chain_data() uniform_chain_data = OptionChain.to_uniform_strikes(obj=btc_option_chain, num_strikes=31) btc_calibrated_params = LogSvParams(sigma0=0.8327, theta=1.0139, kappa1=4.8609, kappa2=4.7940, beta=0.1988, volvol=2.3694) logsv_pricer.plot_comp_mma_inverse_options_with_mc(option_chain=uniform_chain_data, params=btc_calibrated_params, nb_path=400000)
Analysis and figures for the paper <a name="subparagraph4"></a>
All figures shown in the paper can be reproduced using py scripts in
pythonexamples/plots_for_paper
Running Heston SV pricer <a name="heston"></a>
Examples are implemented here
pythonexamples/run_heston_sv_pricer.py examples/run_heston.py
Content of run_heston.py
pythonimport numpy as np import matplotlib.pyplot as plt from stochvolmodels import HestonPricer, HestonParams, OptionChain # define parameters for bootstrap params_dict = {'rho=0.0': HestonParams(v0=0.2**2, theta=0.2**2, kappa=4.0, volvol=0.75, rho=0.0), 'rho=-0.4': HestonParams(v0=0.2**2, theta=0.2**2, kappa=4.0, volvol=0.75, rho=-0.4), 'rho=-0.8': HestonParams(v0=0.2**2, theta=0.2**2, kappa=4.0, volvol=0.75, rho=-0.8)} # get uniform slice option_chain = OptionChain.get_uniform_chain(ttms=np.array([0.25]), ids=np.array(['3m']), strikes=np.linspace(0.8, 1.15, 20)) option_slice = option_chain.get_slice(id='3m') # run pricer pricer = HestonPricer() pricer.plot_model_slices_in_params(option_slice=option_slice, params_dict=params_dict) plt.show()
Supporting Illustrations for Public Papers <a name="papers"></a>
As illustrations of different analytics, this package includes module my_papers
with codes for computations and visualisations featured in several papers
for
- "Log-normal Stochastic Volatility Model with Quadratic Drift" by Artur Sepp
and Parviz Rakhmonov: https://www.worldscientific.com/doi/10.1142/S0219024924500031
pythonstochvolmodels/my_papers/logsv_model_wtih_quadratic_drift
- "What is a robust stochastic volatility model" by Artur Sepp and Parviz Rakhmonov, SSRN:
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4647027
pythonstochvolmodels/my_papers/volatility_models
- "Valuation and Hedging of Cryptocurrency Inverse Options" by Artur Sepp
and Vladimir Lucic,
SSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4606748
pythonstochvolmodels/my_papers/inverse_options
- "Unified Approach for Hedging Impermanent Loss of Liquidity Provision" by
Artur Sepp, Alexander Lipton and Vladimir Lucic,
SSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4887298
pythonstochvolmodels/my_papers/il_hedging
- "Stochastic Volatility for Factor Heath-Jarrow-Morton Framework" by Artur Sepp and Parviz Rakhmonov, SSRN:
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4646925
pythonstochvolmodels/my_papers/sv_for_factor_hjm
Project Structure
StochVolModels/
โโโ stochvolmodels/
โ โโโ pricers/
โ โ โโโ model_pricer.py # Generic model interface
โ โ โโโ logsv_pricer.py # Log-normal SV implementation
โ โ โโโ heston_pricer.py # Heston SV implementation
โ โโโ data/
โ โ โโโ option_chain.py # Option chain data structures
โ โโโ my_papers/ # Research paper implementations
โ โโโ logsv_model_with_quadratic_drift/
โ โโโ volatility_models/
โ โโโ inverse_options/
โ โโโ il_hedging/
โ โโโ sv_for_factor_hjm/
โโโ examples/
โ โโโ run_lognormal_sv_pricer.py
โ โโโ run_heston_sv_pricer.py
โ โโโ run_heston.py
โ โโโ plots_for_paper/
โโโ README.md
Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Citation
If you use this package in your research, please cite the relevant papers:
bibtex@misc{sepp2024stochvolmodels, title={StochVolModels: Python Implementation of Stochastic Volatility Models}, author={Sepp, Artur}, year={2024}, howpublished={\url{https://github.com/ArturSepp/StochVolModels}}, note={Python package for pricing analytics and Monte Carlo simulations} } @article{sepprakhmonov2023, title={Log-normal stochastic volatility model with quadratic drift}, author={Sepp, Artur and Rakhmonov, Parviz}, journal={International Journal of Theoretical and Applied Finance}, volume={26}, number={8}, year={2023}, url={https://www.worldscientific.com/doi/epdf/10.1142/S0219024924500031} } @article{sepprakhmonov2023b, title={What is a robust stochastic volatility model}, author={Sepp, Artur and Rakhmonov, Parviz}, year={2023}, note={Working paper}, url={http://ssrn.com/abstract=4647027} } @article{lucicsepp2024, title={Valuation and hedging of cryptocurrency inverse options}, author={Lucic, Vladimir and Sepp, Artur}, journal={Quantitative Finance}, volume={24}, number={7}, pages={851--869}, year={2024}, url={https://www.tandfonline.com/doi/full/10.1080/14697688.2024.2364804} } @article{sepprakhmonov2024, title={Stochastic volatility for factor Heath-Jarrow-Morton framework}, author={Sepp, Artur and Rakhmonov, Parviz}, year={2025}, journal={Review of Derivatives Research}, note={Accepted}, url={http://ssrn.com/abstract=4646925} }
Acknowledgments
Special thanks to co-authors and collaborators:
- Parviz Rakhmonov
- Vladimir Lucic
- Alexander Lipton
For additional research and advanced analytics, see the companion modules and papers included in this package.
BibTeX Citations for StochVolModels (Stochastic Volatility Models) Package
If you use StochVolModels in your research, please cite it as:
bibtex@software{stochvolmodels2024, author={Sepp, Artur}, title={StochVolModels: Python implementation of pricing analytics and Monte Carlo simulations for stochastic volatility models}, year={2024}, url={https://github.com/ArturSepp/StochVolModels}, }
Contributors
Showing top 5 contributors by commit count.
