Code Monkey home page Code Monkey logo

pysabr's Introduction

pysabr

Python implementation of SABR model.

Lognormal SABR vs Normal SABR

Introduction

SABR (Stochastic Alpha Beta Rho) is a financial volatility smile model widely used for interest rates options such as swaptions or cap/floors. This Python library implements its Hagan 2002 specification. For more information about the model itself, please consult the original paper or Wikipedia.

Requirements

Core pySABR functions require numpy & scipy to run. The web microservice is based on falcon, which can itself be run with waitress (Windows) or gunicorn (Linux). Finally, the Excel function wrapper for the web microservice requires Windows and Excel 2013+.

Installation

pip install pysabr

Examples

pysabr provides two interface levels:

  • A high-level, SABR model object interface, that lets the user work with the standard market inputs (ATM normal vol) and easily access model results (SLN or N vols, option premiums, density).
  • A low-level interface to the Hagan expansions formulas and to the Black Scholes model.

Notebook: Lognormal vs Normal SABR

This example notebook runs an interesting comparison between the Lognormal and Normal SABR expansions available in Hagan's 2002 paper. Make sure to check it out!

SABR model object

Interpolate a volatility using ATM normal vol input:

from pysabr import Hagan2002LognormalSABR
# Forward = 2.5%, Shift = 3%, ATM Normal Vol = 40bps
# Beta = 0.5, Rho = -20%, Volvol = 0.30
sabr = Hagan2002LognormalSABR(f=0.025, shift=0.03, t=1., v_atm_n=0.0040,
                              beta=0.5, rho=-0.2, volvol=0.30)
k = 0.025
sabr.lognormal_vol(k) * 100
# returns 7.27
sabr.normal_vol(k) *1e4
# returns 40

Calibrate alpha, rho and volvol from a discrete shift-lognormal smile:

from pysabr import Hagan2002LognormalSABR
import numpy as np
sabr = Hagan2002LognormalSABR(f=2.5271/100, shift=3/100, t=10, beta=0.5)
k = np.array([-0.4729, 0.5271, 1.0271, 1.5271, 1.7771, 2.0271, 2.2771, 2.4021,
              2.5271, 2.6521, 2.7771, 3.0271, 3.2771, 3.5271, 4.0271, 4.5271,
              5.5271]) / 100
v_sln = np.array([19.641923, 15.785344, 14.305103, 13.073869, 12.550007, 12.088721,
              11.691661, 11.517660, 11.360133, 11.219058, 11.094293, 10.892464,
              10.750834, 10.663653, 10.623862, 10.714479, 11.103755])
[alpha, rho, volvol] = sabr.fit(k, v_sln)
# returns [0.025299981543599154, -0.24629917636394097, 0.2908005625794777]

Hagan 2002 lognormal expansion

Interpolate a shifted-lognormal volatility:

from pysabr import hagan_2002_lognormal_sabr as hagan2002
[s, k, f, t, alpha, beta, rho, volvol] = [0.03, 0.02, 0.025, 1.0, 0.025, 0.50, -0.24, 0.29]
hagan2002.lognormal_vol(k + s, f + s, t, alpha, beta, rho, volvol)
# returns 0.11408307

Calibrate alpha from an ATM lognormal vol:

from pysabr import hagan_2002_lognormal_sabr as hagan2002
[v_atm_sln, f, t, beta, rho, volvol] = [0.60, 0.02, 1.5, 1.0, 0.0, 0.0]
hagan2002.alpha(v_atm_sln, f, t, beta, rho, volvol)
# returns 0.60

Black Scholes

Compute an option premium using Black formula:

from pysabr import black
[k, f, t, v, r, cp] = [0.012, 0.013, 10., 0.20, 0.02, 'call']
black.lognormal_call(k, f, t, v, r, cp) * 1e5
# returns 296.8806106707276

Web microservice

pySABR includes a web microservice exposing the two main functions of the library: volatility interpolation and alpha calibration. Those two functions are available through a simple REST API:

# Returns a lognormal vol
curl http://127.0.0.1:5000/sabr?k=1.0&f=1.0&t=1.0&a=0.20&b=1.0&r=0.0&n=0.2

# Returns a calibrated alpha parameter
curl
http://127.0.0.1:5000/alpha?v=0.6&f=1.0&t=1.0&b=1.0&r=0.0&n=0.2

To run the microservice on Linux:

gunicorn -b '0.0.0.0:5000' web.app:app &>> pysabr_web.log &

To run the microservice on Windows:

python -mwaitress --port=5000 web.app:app

Excel wrapper

The web microservice can conveniently be called from Excel 2013+ using the WEBSERVICE spreadsheet function. For even more convenience, pySABR provides a small VBA wrapper mapping directly to the /sabr and /alpha resources. VBA code is available under pySABR_web.bas

Run the tests

$ python -m pytest

pysabr's People

Contributors

ynouri avatar v-tsepelev avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.