# StochVolModels
Implementation of pricing analytics and Monte Carlo simulations for modeling of options and implied volatilities.
The StochVol package provides:
1) Analytics for Black-Scholes and Normal vols
2) Interfaces and implementation for stochastic volatility models,
including log-normal SV model and Heston SV model
using analytical method with Fourier transform and Monte Carlo simulations
3) 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.
1) Interface for analytical pricing of vanilla options
using Fourier transform with closed-form solution for moment generating function
2) Interface for Monte-Carlo simulations of model dynamics
[Illustrations](#papers) 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
```python
pip install stochvolmodels
```
Upgrade using
```python
pip install --upgrade stochvolmodels
```
Close using
```python
git clone https://github.com/ArturSepp/StochVolModels.git
```
# Table of contents
1. [Model Interface](#introduction)
1. [Log-normal stochastic volatility model](#logsv)
2. [Heston stochastic volatility model](#hestonsv)
2. [Running log-normal SV pricer](#paragraph1)
1. [Computing model prices and vols](#subparagraph1)
2. [Running model calibration to sample Bitcoin options data](#subparagraph2)
3. [Comparison of model prices vs MC](#subparagraph3)
4. [Analysis and figures for the paper](#subparagraph4)
3. [Running Heston SV pricer](#heston)
4. [Supporting Illustrations for Public Papers](#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.
1) Interface for analytical pricing of vanilla options using Fourier transform with closed-form solution for moment generating function
2) Interface for Monte-Carlo simulations of model dynamics
3) 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 the log-normal stochastic volatility model is based on the paper
[Log-normal Stochastic Volatility Model with Quadratic Drift](https://www.worldscientific.com/doi/10.1142/S0219024924500031) 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
```python
stochvolmodels/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
```python
stochvolmodels/pricers/heston_pricer.py
```
## Running log-normal SV pricer <a name="paragraph1"></a>
Basic features are implemented in
```python
examples/run_lognormal_sv_pricer.py
```
Imports:
```python
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 ne 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>
```python
btc_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)
```
![image info](docs/figures/btc_fit.PNG)
### Comparison of model prices vs MC <a name="subparagraph3"></a>
```python
btc_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)
```
![image info](docs/figures/btc_mc_comp.PNG)
### Analysis and figures for the paper <a name="subparagraph4"></a>
All figures shown in the paper can be reproduced using py scripts in
```python
examples/plots_for_paper
```
## Running Heston SV pricer <a name="heston"></a>
Examples are implemented here
```python
examples/run_heston_sv_pricer.py
examples/run_heston.py
```
Content of run_heston.py
```python
import 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 packadge includes module ```my_papers```
with codes for computations and visualisations featured in several papers
for
1) "Log-normal Stochastic Volatility Model with Quadratic Drift" by Artur Sepp
and Parviz Rakhmonov: https://www.worldscientific.com/doi/10.1142/S0219024924500031
```python
stochvolmodels/my_papers/logsv_model_wtih_quadratic_drift
```
2) "What is a robust stochastic volatility model" by Artur Sepp and Parviz Rakhmonov, SSRN:
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4647027
```python
stochvolmodels/my_papers/volatility_models
```
3) "Valuation and Hedging of Cryptocurrency Inverse Options" by Artur Sepp
and Vladimir Lucic,
SSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4606748
```python
stochvolmodels/my_papers/inverse_options
```
4) "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
```python
stochvolmodels/my_papers/il_hedging
```
5) "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
```python
stochvolmodels/my_papers/sv_for_factor_hjm
```
Raw data
{
"_id": null,
"home_page": "https://github.com/ArturSepp/StochVolModels",
"name": "stochvolmodels",
"maintainer": "Artur Sepp",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "artursepp@gmail.com",
"keywords": "volatility, options, Black-Scholes, Heston, Monte-Carlo",
"author": "Artur Sepp",
"author_email": "artursepp@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/8d/61/27e5e901a254052513488e087fadf6ed4cda51c77440148990bcaac77003/stochvolmodels-1.0.23.tar.gz",
"platform": null,
"description": "# StochVolModels\n\nImplementation of pricing analytics and Monte Carlo simulations for modeling of options and implied volatilities.\n\nThe StochVol package provides:\n1) Analytics for Black-Scholes and Normal vols\n2) Interfaces and implementation for stochastic volatility models,\nincluding log-normal SV model and Heston SV model \nusing analytical method with Fourier transform and Monte Carlo simulations\n3) Visualization of model implied volatilities\n\nFor the analytic implementation of stochastic volatility models, the package provides interfaces for a generic volatility model with the following features.\n1) Interface for analytical pricing of vanilla options \nusing Fourier transform with closed-form solution for moment generating function\n2) Interface for Monte-Carlo simulations of model dynamics\n\n\n[Illustrations](#papers) of using package analytics for research \nwork is provided in top-level package ```my_papers``` \nwhich contains computations and visualisations for several papers\n\n\n## Installation\nInstall using\n```python \npip install stochvolmodels\n```\nUpgrade using\n```python \npip install --upgrade stochvolmodels\n```\nClose using\n```python \ngit clone https://github.com/ArturSepp/StochVolModels.git\n```\n\n# Table of contents\n1. [Model Interface](#introduction)\n 1. [Log-normal stochastic volatility model](#logsv)\n 2. [Heston stochastic volatility model](#hestonsv)\n2. [Running log-normal SV pricer](#paragraph1)\n 1. [Computing model prices and vols](#subparagraph1)\n 2. [Running model calibration to sample Bitcoin options data](#subparagraph2)\n 3. [Comparison of model prices vs MC](#subparagraph3)\n 4. [Analysis and figures for the paper](#subparagraph4)\n3. [Running Heston SV pricer](#heston)\n4. [Supporting Illustrations for Public Papers](#papers)\n\n\nRunning model calibration to sample Bitcoin options data\n\n## Implemented Stochastic Volatility models <a name=\"introduction\"></a>\nThe package provides interfaces for a generic volatility model with the following features.\n1) Interface for analytical pricing of vanilla options using Fourier transform with closed-form solution for moment generating function\n2) Interface for Monte-Carlo simulations of model dynamics\n3) Interface for visualization of model implied volatilities\n\nThe model interface is in stochvolmodels/pricers/model_pricer.py\n\n### Log-normal stochastic volatility model <a name=\"logsv\"></a>\n\nThe analytics for the log-normal stochastic volatility model is based on the paper\n\n[Log-normal Stochastic Volatility Model with Quadratic Drift](https://www.worldscientific.com/doi/10.1142/S0219024924500031) by Artur Sepp and Parviz Rakhmonov\n\n\nThe dynamics of the log-normal stochastic volatility model:\n\n$$dS_{t}=r(t)S_{t}dt+\\sigma_{t}S_{t}dW^{(0)}_{t}$$\n\n$$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}$$\n\n$$dI_{t}=\\sigma^{2}_{t}dt$$\n\nwhere $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.\n\n\nImplementation of Lognormal SV model is contained in \n```python \nstochvolmodels/pricers/logsv_pricer.py\n```\n\n### Heston stochastic volatility model <a name=\"hestonsv\"></a>\n\nThe dynamics of Heston stochastic volatility model:\n\n$$dS_{t}=r(t)S_{t}dt+\\sqrt{V_{t}}S_{t}dW^{(S)}_{t}$$\n\n$$dV_{t}=\\kappa (\\theta - V_{t})dt+ \\vartheta \\sqrt{V_{t}}dW^{(V)}_{t}$$\n\nwhere $W^{(S)}$ and $W^{(V)}$ are correlated Brownian motions with correlation parameter $\\rho$\n\nImplementation of Heston SV model is contained in \n```python \nstochvolmodels/pricers/heston_pricer.py\n```\n\n## Running log-normal SV pricer <a name=\"paragraph1\"></a>\n\nBasic features are implemented in \n```python \nexamples/run_lognormal_sv_pricer.py\n```\n\nImports:\n```python \nimport stochvolmodels as sv\nfrom stochvolmodels import LogSVPricer, LogSvParams, OptionChain\n```\n\n\n### Computing model prices and vols <a name=\"subparagraph1\"></a>\n\n```python \n# instance of pricer\nlogsv_pricer = LogSVPricer()\n\n# define model params \nparams = LogSvParams(sigma0=1.0, theta=1.0, kappa1=5.0, kappa2=5.0, beta=0.2, volvol=2.0)\n\n# 1. compute ne price\nmodel_price, vol = logsv_pricer.price_vanilla(params=params,\n ttm=0.25,\n forward=1.0,\n strike=1.0,\n optiontype='C')\nprint(f\"price={model_price:0.4f}, implied vol={vol: 0.2%}\")\n\n# 2. prices for slices\nmodel_prices, vols = logsv_pricer.price_slice(params=params,\n ttm=0.25,\n forward=1.0,\n strikes=np.array([0.9, 1.0, 1.1]),\n optiontypes=np.array(['P', 'C', 'C']))\nprint([f\"{p:0.4f}, implied vol={v: 0.2%}\" for p, v in zip(model_prices, vols)])\n\n# 3. prices for option chain with uniform strikes\noption_chain = OptionChain.get_uniform_chain(ttms=np.array([0.083, 0.25]),\n ids=np.array(['1m', '3m']),\n strikes=np.linspace(0.9, 1.1, 3))\nmodel_prices, vols = logsv_pricer.compute_chain_prices_with_vols(option_chain=option_chain, params=params)\nprint(model_prices)\nprint(vols)\n```\n\n\n### Running model calibration to sample Bitcoin options data <a name=\"subparagraph2\"></a>\n```python \nbtc_option_chain = chains.get_btc_test_chain_data()\nparams0 = LogSvParams(sigma0=0.8, theta=1.0, kappa1=5.0, kappa2=None, beta=0.15, volvol=2.0)\nbtc_calibrated_params = logsv_pricer.calibrate_model_params_to_chain(option_chain=btc_option_chain,\n params0=params0,\n constraints_type=ConstraintsType.INVERSE_MARTINGALE)\nprint(btc_calibrated_params)\n\nlogsv_pricer.plot_model_ivols_vs_bid_ask(option_chain=btc_option_chain,\n params=btc_calibrated_params)\n```\n![image info](docs/figures/btc_fit.PNG)\n\n\n\n### Comparison of model prices vs MC <a name=\"subparagraph3\"></a>\n```python \nbtc_option_chain = chains.get_btc_test_chain_data()\nuniform_chain_data = OptionChain.to_uniform_strikes(obj=btc_option_chain, num_strikes=31)\nbtc_calibrated_params = LogSvParams(sigma0=0.8327, theta=1.0139, kappa1=4.8609, kappa2=4.7940, beta=0.1988, volvol=2.3694)\nlogsv_pricer.plot_comp_mma_inverse_options_with_mc(option_chain=uniform_chain_data,\n params=btc_calibrated_params,\n nb_path=400000)\n \n```\n![image info](docs/figures/btc_mc_comp.PNG)\n\n\n### Analysis and figures for the paper <a name=\"subparagraph4\"></a>\n\nAll figures shown in the paper can be reproduced using py scripts in\n```python \nexamples/plots_for_paper\n```\n\n\n## Running Heston SV pricer <a name=\"heston\"></a>\n\nExamples are implemented here\n```python \nexamples/run_heston_sv_pricer.py\nexamples/run_heston.py\n```\n\nContent of run_heston.py\n```python \nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom stochvolmodels import HestonPricer, HestonParams, OptionChain\n\n# define parameters for bootstrap\nparams_dict = {'rho=0.0': HestonParams(v0=0.2**2, theta=0.2**2, kappa=4.0, volvol=0.75, rho=0.0),\n 'rho=-0.4': HestonParams(v0=0.2**2, theta=0.2**2, kappa=4.0, volvol=0.75, rho=-0.4),\n 'rho=-0.8': HestonParams(v0=0.2**2, theta=0.2**2, kappa=4.0, volvol=0.75, rho=-0.8)}\n\n# get uniform slice\noption_chain = OptionChain.get_uniform_chain(ttms=np.array([0.25]), ids=np.array(['3m']), strikes=np.linspace(0.8, 1.15, 20))\noption_slice = option_chain.get_slice(id='3m')\n\n# run pricer\npricer = HestonPricer()\npricer.plot_model_slices_in_params(option_slice=option_slice, params_dict=params_dict)\n\nplt.show()\n```\n\n\n## Supporting Illustrations for Public Papers <a name=\"papers\"></a>\n\nAs illustrations of different analytics, this packadge includes module ```my_papers``` \nwith codes for computations and visualisations featured in several papers\nfor \n\n1) \"Log-normal Stochastic Volatility Model with Quadratic Drift\" by Artur Sepp \nand Parviz Rakhmonov: https://www.worldscientific.com/doi/10.1142/S0219024924500031\n```python \nstochvolmodels/my_papers/logsv_model_wtih_quadratic_drift\n```\n\n\n2) \"What is a robust stochastic volatility model\" by Artur Sepp and Parviz Rakhmonov, SSRN:\nhttps://papers.ssrn.com/sol3/papers.cfm?abstract_id=4647027\n```python \nstochvolmodels/my_papers/volatility_models\n```\n\n\n3) \"Valuation and Hedging of Cryptocurrency Inverse Options\" by Artur Sepp\nand Vladimir Lucic, \nSSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4606748 \n```python \nstochvolmodels/my_papers/inverse_options\n```\n\n4) \"Unified Approach for Hedging Impermanent Loss of Liquidity Provision\" by \nArtur Sepp, Alexander Lipton and Vladimir Lucic, \nSSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4887298 \n```python \nstochvolmodels/my_papers/il_hedging\n```\n\n5) \"Stochastic Volatility for Factor Heath-Jarrow-Morton Framework\" by Artur Sepp and Parviz Rakhmonov, SSRN:\nhttps://papers.ssrn.com/sol3/papers.cfm?abstract_id=4646925\n```python \nstochvolmodels/my_papers/sv_for_factor_hjm\n```\n\n\n",
"bugtrack_url": null,
"license": "LICENSE.txt",
"summary": "Implementation of stochastic volatility models for option pricing",
"version": "1.0.23",
"project_urls": {
"Documentation": "https://github.com/ArturSepp/StochVolModels",
"Homepage": "https://github.com/ArturSepp/StochVolModels",
"Issues": "https://github.com/ArturSepp/StochVolModels/issues",
"Personal website": "https://artursepp.com",
"Repository": "https://github.com/ArturSepp/StochVolModels"
},
"split_keywords": [
"volatility",
" options",
" black-scholes",
" heston",
" monte-carlo"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8d6127e5e901a254052513488e087fadf6ed4cda51c77440148990bcaac77003",
"md5": "18e859985d60572cf47b63e52f00a9e6",
"sha256": "042e716d7c528c0fa99040672bebf51f2924594c58c266200ec24da319189457"
},
"downloads": -1,
"filename": "stochvolmodels-1.0.23.tar.gz",
"has_sig": false,
"md5_digest": "18e859985d60572cf47b63e52f00a9e6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 119302,
"upload_time": "2024-11-17T13:41:46",
"upload_time_iso_8601": "2024-11-17T13:41:46.250605Z",
"url": "https://files.pythonhosted.org/packages/8d/61/27e5e901a254052513488e087fadf6ed4cda51c77440148990bcaac77003/stochvolmodels-1.0.23.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-17 13:41:46",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ArturSepp",
"github_project": "StochVolModels",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "stochvolmodels"
}