stochvolmodels


Namestochvolmodels JSON
Version 1.0.17 PyPI version JSON
download
home_pagehttps://github.com/ArturSepp/StochVolModels
SummaryImplementation of stochastic volatility models for option pricing
upload_time2024-04-14 15:39:38
maintainerArtur Sepp
docs_urlNone
authorArtur Sepp
requires_python<3.11,>=3.8
licenseLICENSE.txt
keywords volatility options black-scholes heston monte-carlo
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # StochVolModels

Implementation of pricing analytics and Monte Carlo simulations for modeling of options and implied volatilities.

The StochVolPackage 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
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


## Installation
```python 
pip install stochvolmodels
```

# 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://papers.ssrn.com/sol3/papers.cfm?abstract_id=2522425) 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 Sepp A and Rakhmonov P, SSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2522425
```python 
stochvolmodels/my_papers/logsv_model_wtih_quadratic_drift
```


2) "What is a robust stochastic volatility model" by Sepp A and Rakhmonov P,
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 Sepp A and Lucic V, 
SSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4606748 
```python 
stochvolmodels/my_papers/inverse_options
```




            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ArturSepp/StochVolModels",
    "name": "stochvolmodels",
    "maintainer": "Artur Sepp",
    "docs_url": null,
    "requires_python": "<3.11,>=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/74/3c/fb39ae9df8371aab0352d077b149e6f7bde5c3b6deba356b6941daad9800/stochvolmodels-1.0.17.tar.gz",
    "platform": null,
    "description": "# StochVolModels\n\nImplementation of pricing analytics and Monte Carlo simulations for modeling of options and implied volatilities.\n\nThe StochVolPackage provides:\n1) Analytics for Black-Scholes and Normal vols\n2) Interfaces and implementation for stochastic volatility models including log-normal SV model and Heston SV model\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 using Fourier transform with closed-form solution for moment generating function\n2) Interface for Monte-Carlo simulations of model dynamics\n\n\n## Installation\n```python \npip install stochvolmodels\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://papers.ssrn.com/sol3/papers.cfm?abstract_id=2522425) 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 Sepp A and Rakhmonov P, SSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2522425\n```python \nstochvolmodels/my_papers/logsv_model_wtih_quadratic_drift\n```\n\n\n2) \"What is a robust stochastic volatility model\" by Sepp A and Rakhmonov P,\nSSRN: https://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 Sepp A and Lucic V, \nSSRN: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4606748 \n```python \nstochvolmodels/my_papers/inverse_options\n```\n\n\n\n",
    "bugtrack_url": null,
    "license": "LICENSE.txt",
    "summary": "Implementation of stochastic volatility models for option pricing",
    "version": "1.0.17",
    "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": "743cfb39ae9df8371aab0352d077b149e6f7bde5c3b6deba356b6941daad9800",
                "md5": "d08290e792dd9e5c2aeb49bd5dce8637",
                "sha256": "dd3a437badff05badae651b9c543a06200842cfc4aaadd12d6edacd984e50e1b"
            },
            "downloads": -1,
            "filename": "stochvolmodels-1.0.17.tar.gz",
            "has_sig": false,
            "md5_digest": "d08290e792dd9e5c2aeb49bd5dce8637",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.11,>=3.8",
            "size": 82794,
            "upload_time": "2024-04-14T15:39:38",
            "upload_time_iso_8601": "2024-04-14T15:39:38.328515Z",
            "url": "https://files.pythonhosted.org/packages/74/3c/fb39ae9df8371aab0352d077b149e6f7bde5c3b6deba356b6941daad9800/stochvolmodels-1.0.17.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-14 15:39:38",
    "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"
}
        
Elapsed time: 0.24710s