Skip to main content

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

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.

Open In Colab

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

mafn_finite_difference-0.1.2.tar.gz (17.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mafn_finite_difference-0.1.2-py3-none-any.whl (15.3 kB view details)

Uploaded Python 3

File details

Details for the file mafn_finite_difference-0.1.2.tar.gz.

File metadata

  • Download URL: mafn_finite_difference-0.1.2.tar.gz
  • Upload date:
  • Size: 17.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for mafn_finite_difference-0.1.2.tar.gz
Algorithm Hash digest
SHA256 7ae90caf2792db982e8a798312ca91e03923b8412f3e0ccfa29b31b10f8f25f7
MD5 d41086cd73ec1d53cb7a492f4e54b09e
BLAKE2b-256 3a7f179a231cffbabcbe028f395907c18394c6bb254824016b00d52b0b5b4ebb

See more details on using hashes here.

File details

Details for the file mafn_finite_difference-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for mafn_finite_difference-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c322d04cfbcc240ea39758919588369df8ad6949c9b57820b8b424e973ce0096
MD5 e8de8d74affbf029de5e58b9b226033d
BLAKE2b-256 6657c25b3aec100487843d5b10a823da4f0aebbc9978eef94085a52c412cb868

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page