High-performance SDE solver with JIT compilation and parallel execution
Project description
PyIto
High-performance SDE solver with JIT compilation and parallel execution.
PyIto is a Python library for simulating Stochastic Differential Equations (SDEs). Built on the Numba compiler, it translates Python model definitions into optimized machine code (LLVM) and automatically parallelizes Monte Carlo simulations across all available CPU cores.
It is designed for quantitative finance and research applications where execution speed and memory efficiency are critical.
✨ Key Features
- 🚀 JIT Compilation: Compiles drift and diffusion functions to machine code for C-like performance.
- 🔥 Auto-Parallelism: Automatically distributes paths across CPU cores using
numba.prange. - 📉 Zero-RAM Noise Generation: Generates Brownian motion on-the-fly, allowing for millions of paths without memory overhead.
- 🧠 Derivative-Free Milstein: Achieves Strong Order 1.0 accuracy without requiring manual calculation of diffusion derivatives.
- 📊 Flexible Memory Management: Choose to store full path histories or only terminal states to optimize RAM usage.
🛠️ Installation
pip install pyito
Requirements: numpy, numba*
⚡ Quick Start
Here is a minimal example simulating a mean-reverting Ornstein-Uhlenbeck process: $$ dX_t = \theta(\mu - X_t)dt + \sigma dW_t $$
import numpy as np
from numba import njit
from pyito import SDE, integrate
# 1. Define Physics (Must be JIT-compatible)
@njit
def drift(t, x, args):
theta, mu, sigma = args
return theta * (mu - x)
@njit
def diffusion(t, x, args):
theta, mu, sigma = args
return sigma # Constant volatility
# 2. Setup Model
# Params: theta=0.7, mu=1.5, sigma=0.3
sde = SDE(drift, diffusion, args=(0.7, 1.5, 0.3))
# 3. Run Simulation
# Simulates 100,000 paths in parallel
# Returns only the final state (at t=1.0) to save memory
results = integrate(sde, y0=0.0, tspan=(0, 1.0), dt=0.01, n_paths=100_000)
print(f"Mean: {np.mean(results):.4f}")
print(f"Std: {np.std(results):.4f}")
🧮 Supported Algorithms
PyIto supports the following solvers via the method argument:
| Method | Strong Order | Description |
|---|---|---|
euler_maruyama |
0.5 | The standard, efficient default solver. |
milstein |
1.0 | Higher accuracy for multiplicative noise. Requires providing diffusion_deriv. |
df_milstein |
1.0 | Derivative-Free Milstein. Approximates derivatives numerically. Recommended for high accuracy without the math overhead. |
📚 Advanced Usage
1. Derivative-Free Milstein
To get higher accuracy without calculating manually, use the derivative-free solver. It uses a finite-difference approximation inside the kernel.
results = integrate(sde, ..., method='df_milstein')
2. Correlated Noise (Multi-Dimensional)
PyIto natively handles correlated noise for systems like the Heston model. If your diffusion function returns a matrix, the solver infers a correlated structure.
- Scalar Output: Single-factor noise.
- Vector Output: Independent diagonal noise.
- Matrix Output: Correlated noise (Diffusion Matrix such that ).
3. Memory Optimization
For large-scale Monte Carlo (e.g., 10 million paths), storing the full history is impossible. PyIto allows you to control output verbosity:
# Returns array of shape (Steps, Paths, Dims) - RAM Heavy
history = integrate(..., output='all')
# Returns array of shape (Paths, Dims) - RAM Efficient
terminal_values = integrate(..., output='final')
⚠️ Performance Note
PyIto is optimized to saturate your CPU.
- Laptop Users: Ensure your OS power plan is set to "Best Performance". In "Power Saver" mode, operating systems often park high-performance cores, significantly throttling the parallel speedup.
- Warm-up: The first call to
integratewill take an extra 1-2 seconds while Numba compiles your functions. Subsequent runs will be instant.
🤝 Contributing
Contributions are welcome!
- Fork the repository.
- Create your feature branch.
- Install dev dependencies:
pip install -e .[dev] - Run tests:
pytest tests/
📄 License
Distributed under the MIT License. See LICENSE for more information.
Project details
Release history Release notifications | RSS feed
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 pyito-0.1.0.tar.gz.
File metadata
- Download URL: pyito-0.1.0.tar.gz
- Upload date:
- Size: 20.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9c93e8b844e25381b375718556c9546a054e6ebe830db8af297c7a52f23a849
|
|
| MD5 |
a20a7204ccdb83c89550ca9b6dfd2863
|
|
| BLAKE2b-256 |
31c8e5f688c23da9ad5f81760008674aef78d48bfd0e0c9aa64ff45ff5c61a93
|
File details
Details for the file pyito-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyito-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee1bd0f09beac490bf11198d286685d598dae380df83181541971839c8f23ae3
|
|
| MD5 |
67ba853696e4eb32dac1ddbd4c037c46
|
|
| BLAKE2b-256 |
5e60d86ea5a60d3c7f2ec48f17444046a41623f2bea2049037ce9b7331c1961e
|