Finite-difference option pricing in 1-D (Black-Scholes) and 2-D (SABR) with a Douglas-scheme ADI solver.
Project description
finite-difference
Finite-difference option pricing for the SABR stochastic-volatility model via the Douglas-scheme ADI method of in 't Hout & Foulon (2010).
in 't Hout, K., & Foulon, S. (2010). ADI finite difference schemes for option pricing in the Heston model with correlation. International Journal of Numerical Analysis and Modeling, 7(2), 303–320.
What it solves
European call and put options under the SABR model — a four-parameter (α, β, ρ, ν) stochastic-volatility framework — whose pricing PDE is two-dimensional and has no closed form. The package solves that PDE on a Cartesian (S, v, t) grid using the Douglas Alternating Direction Implicit scheme: implicit sweeps in S and v are alternated each step, with the cross-derivative term handled explicitly. One-dimensional Black–Scholes solvers (explicit, implicit, Crank–Nicolson, American) ship as baselines and as the validation reference for the SABR limit.
Installation
pip install mafn-finite-difference
(mafn-finite-difference is a temporary placeholder for the published PyPI name.)
Quick start
from finite_difference import price_sabr_option
# 1-year ATM SABR call: alpha=0.2, beta=1, rho=-0.3, nu=0.4
price, V, S, v = price_sabr_option(
S0=100.0, K=100.0, T=1.0, r=0.05,
alpha=0.2, beta=1.0, rho=-0.3, nu=0.4,
option_type="call",
)
print(f"SABR call price: {price:.5f}")
API reference
price_sabr_option(S0, K, T, r, alpha, beta, rho, nu, ...) -> (price, V, S, v)
High-level pricer. Builds the (S, v, t) grid, runs the Douglas-ADI sweeps, and bilinearly interpolates the value at (S0, alpha).
| Parameter | Type | Description |
|---|---|---|
S0 |
float |
Initial asset price |
K |
float |
Strike |
T |
float |
Time to maturity (years) |
r |
float |
Risk-free rate |
alpha |
float |
Initial SABR vol level (>0) |
beta |
float |
CEV exponent in [0, 1] |
rho |
float |
Correlation in [-1, 1] |
nu |
float |
Vol-of-vol (>0) |
M, L, N |
int |
Grid points in S, v, t (default 80 / 40 / 80) |
S_max, v_max |
float, optional |
Domain bounds (sensible defaults) |
option_type |
str |
"call" or "put" |
theta |
float |
ADI weight; 0.5 is second-order accurate |
verbose |
bool |
Print per-step progress |
Returns:
| Field | Type | Description |
|---|---|---|
price |
float |
Bilinearly-interpolated value at (S0, alpha) |
V |
(M+1, L+1) array |
Full price surface at t = 0 |
S |
(M+1,) array |
Asset-price grid |
v |
(L+1,) array |
Volatility grid |
ADISolver(sabr, grid, K, r, T, option_type)
Lower-level access. Call solve(theta=0.5, verbose=False) to get the full (V, S, v) surface — useful when you need the surface, not just one interpolated price.
1-D Black–Scholes solvers
In finite_difference/solvers/. Each takes (S_max, K, r, sigma, T, M, N, option_type) and returns (S, V) at t = 0.
| Function | Module | Notes |
|---|---|---|
solve_explicit |
explicit |
CFL-limited; fastest per step |
solve_implicit |
implicit |
Unconditionally stable, O(Δt) |
solve_crank_nicolson |
crank_nicolson |
Unconditionally stable, O(Δt²) |
solve_american |
american |
American put via projected CN |
bs_price(S, K, T, r, sigma, option_type) -> float
Closed-form Black–Scholes price; the validation reference for the SABR solver in its β = 1, ν → 0 limit.
License
MIT.
Demo notebook
Full SABR/ADI tutorial — derivation, solver, surface plots, convergence study, parity check, parameter sensitivity, and the implied-volatility smile — is in notebooks/07_sabr_adi.ipynb.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mafn_finite_difference-0.1.0.tar.gz.
File metadata
- Download URL: mafn_finite_difference-0.1.0.tar.gz
- Upload date:
- Size: 17.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e520a9a712cfb8c0e9e17e46808e13ccc0c167d7bf41d34035c74e53ec492c9
|
|
| MD5 |
c0b4201f857a9a72605fcb6ac5ed8fdf
|
|
| BLAKE2b-256 |
901a842960e4447ab1789f6adb468e1ffc5d03e4a64a8ab233207c0418fe1f2b
|
File details
Details for the file mafn_finite_difference-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mafn_finite_difference-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d22d4409be22f4ba9427d50dde8bc726b7a56da328576dc3cb5723ad4f0b63a
|
|
| MD5 |
d71cd3590b5fc87394f9d66f961d437b
|
|
| BLAKE2b-256 |
21418e90a284ecfeab2ac918bd2d02ce9a8aeb1d48b35ad4b5b2c5db8b517f65
|