Skip to main content

A Python library for simulating stochastic processes in finance.

Project description


PyPI Latest Release PyPI Downloads License - MIT Python Version CI Typing

What is it?

FinStoch is a Python library for simulating stochastic processes commonly used in quantitative finance. It provides clean, consistent interfaces for Monte Carlo path simulation using Euler-Maruyama discretization, with built-in analytics, seed control for reproducibility, and pandas integration.

Table of Contents

Main Features

  • Nine parametric stochastic process models covering equity prices, interest rates, jump diffusions, and stochastic volatility
  • Bootstrap Monte Carlo simulation from historical data (i.i.d. and block bootstrap)
  • Milstein scheme for higher-order discretization accuracy via method="milstein"
  • Reproducible simulations via seed control on all processes
  • Flexible time grids with configurable granularity (daily, hourly, minute-level) and business day support
  • Built-in analytics including VaR, CVaR, max drawdown, confidence bands, and summary statistics
  • pandas integration with to_dataframe() for seamless downstream analysis
  • Consistent API across all models: every process exposes simulate(), plot(), and the full analytics suite

Supported Processes

Model Class Description
Geometric Brownian Motion GeometricBrownianMotion Log-normal asset price dynamics with constant drift and volatility
Merton Jump Diffusion MertonJumpDiffusion GBM extended with Poisson-driven jumps for sudden price shocks
Ornstein-Uhlenbeck OrnsteinUhlenbeck Mean-reverting process with constant volatility
Cox-Ingersoll-Ross CoxIngersollRoss Mean-reverting, non-negative process with square-root volatility
Constant Elasticity of Variance ConstantElasticityOfVariance GBM generalization where volatility scales as a power of price
Heston Stochastic Volatility HestonModel Asset price with mean-reverting stochastic variance and correlation
Vasicek VasicekModel Mean-reverting interest rate model (allows negative rates)
Bates BatesModel Heston stochastic volatility combined with Merton-style jumps
Variance Gamma VarianceGammaProcess Pure-jump process via time-changed Brownian motion with heavier tails

All parametric processes return NumPy arrays of shape (num_paths, num_steps). Heston and Bates return a tuple (S, v) of price and variance paths. Discretization uses Euler-Maruyama by default; pass method="milstein" for higher-order accuracy.

Non-parametric

Method Class Description
Bootstrap Monte Carlo BootstrapMonteCarlo Resamples historical log returns (i.i.d. or block bootstrap)

Where to Get It

# PyPI
pip install FinStoch

Dependencies

Package Minimum Version Purpose
NumPy 1.23 Array operations and random number generation
pandas 2.0 Time grid generation and DataFrame conversion
matplotlib 3.7 Path visualization
SciPy 1.9 Statistical functions for analytics
python-dateutil 2.9 Date range duration calculation

Quick Start

Simulate and plot

from FinStoch import GeometricBrownianMotion

gbm = GeometricBrownianMotion(
    S0=100, mu=0.05, sigma=0.2,
    num_paths=10,
    start_date='2023-09-01',
    end_date='2024-09-01',
    granularity='D',
)

# Reproducible simulation
paths = gbm.simulate(seed=42)
gbm.plot(paths=paths, title='GBM Simulation', ylabel='Price')

Convert to DataFrame

df = gbm.to_dataframe(paths)
# DataFrame with DatetimeIndex columns, one row per path

Heston model (stochastic volatility)

from FinStoch import HestonModel

heston = HestonModel(
    S0=100, v0=0.04, mu=0.05, sigma=0.3,
    theta=0.04, kappa=2.0, rho=-0.7,
    num_paths=10,
    start_date='2023-09-01',
    end_date='2024-09-01',
    granularity='D',
)

prices, variance = heston.simulate(seed=42)

# Convert either component to DataFrame
df_prices = heston.to_dataframe((prices, variance), variance=False)
df_var = heston.to_dataframe((prices, variance), variance=True)

Milstein scheme

Use the higher-order Milstein discretization for improved accuracy:

# Euler-Maruyama (default)
paths_euler = gbm.simulate(seed=42, method='euler')

# Milstein scheme
paths_milstein = gbm.simulate(seed=42, method='milstein')

The Milstein scheme is available on all Euler-Maruyama-based processes. For OU and Vasicek (constant diffusion), it is identical to Euler. For Variance Gamma (time-changed Brownian motion), it raises ValueError.

Bootstrap Monte Carlo

Simulate from historical data without assuming a parametric model:

from FinStoch.bootstrap import BootstrapMonteCarlo
import numpy as np

# Historical daily prices (e.g. from yfinance)
prices = np.array([100, 102, 99, 103, 101, 104, 98, 105, 107, 103])

model = BootstrapMonteCarlo(
    historical_prices=prices,
    num_paths=1000,
    start_date='2024-01-01',
    end_date='2024-06-01',
    granularity='D',
    # S0 defaults to last price; block_size=5 for block bootstrap
)

paths = model.simulate(seed=42)
model.var(paths, alpha=0.05)  # all analytics inherited

Analytics

All processes inherit a suite of analytics methods from the base class:

paths = gbm.simulate(seed=42)

# Descriptive statistics at each time step
stats = gbm.summary_statistics(paths)  # dict: mean, std, skew, kurtosis, min, max

# Central tendency
mean_path = gbm.expected_path(paths)     # mean across paths
median = gbm.median_path(paths)          # median across paths

# Uncertainty
lower, upper = gbm.confidence_bands(paths, level=0.95)

# Risk measures (computed at terminal time step)
gbm.var(paths, alpha=0.05)    # Value at Risk
gbm.cvar(paths, alpha=0.05)   # Conditional VaR (Expected Shortfall)

# Drawdown analysis
drawdowns = gbm.max_drawdown(paths)  # max peak-to-trough per path

# Distribution visualization
gbm.terminal_distribution(paths, bins=50)  # histogram + fitted normal

Development

# Install in editable mode with dev dependencies
pip install -e ".[dev]"

# Run tests
python -m unittest discover -s tests -p "*_test.py"

# Format
ruff format

# Lint
flake8 --max-line-length 127

# Type check
mypy . --exclude venv --exclude build --ignore-missing-imports

License

MIT

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

finstoch-0.7.1.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

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

finstoch-0.7.1-py3-none-any.whl (25.0 kB view details)

Uploaded Python 3

File details

Details for the file finstoch-0.7.1.tar.gz.

File metadata

  • Download URL: finstoch-0.7.1.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for finstoch-0.7.1.tar.gz
Algorithm Hash digest
SHA256 b835cb3a6747d59d8c76c0a5e723b1c57d29b9c1c7d3a3cd82c0c860258cba0d
MD5 66bb5403b72443bee0040020618c4f3d
BLAKE2b-256 f8e02ff6a4ea7d724d786675974d0bc7c16e000255e88a1c6e4e2006de923ced

See more details on using hashes here.

Provenance

The following attestation bundles were made for finstoch-0.7.1.tar.gz:

Publisher: cd.yml on Yosri-Ben-Halima/FinStoch

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file finstoch-0.7.1-py3-none-any.whl.

File metadata

  • Download URL: finstoch-0.7.1-py3-none-any.whl
  • Upload date:
  • Size: 25.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for finstoch-0.7.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3a6ecaccb3f67e13e01a635e877f7c60080b0bcc27a57c9038f55a2a112c6ccc
MD5 92cbd157a8c056c2c91213393b267284
BLAKE2b-256 c9e1749bca43de7823fb2ae3a561b1d03acb3abaf3530b9085c345ca5b12f23e

See more details on using hashes here.

Provenance

The following attestation bundles were made for finstoch-0.7.1-py3-none-any.whl:

Publisher: cd.yml on Yosri-Ben-Halima/FinStoch

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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