orderwave
Compact aggregate order-book simulation for Python, with readable built-in heatmaps.
orderwave keeps the runtime model small: a sparse bid/ask book, bounded mean-reverting fair value, and a dynamic distribution-synthesis engine where multiple latent depth distributions change their mass, location, and variance before aggregate liquidity is revealed, canceled, and swept.
Install
pip install orderwave
Quick Start
from orderwave import Market
market = Market(seed=7, capture="visual")
result = market.run(steps=1_000)
snapshot = result.snapshot
history = result.history
overview = market.plot()
heatmap = market.plot_heatmap()
book = market.plot_book()
Public API
Market(...): create a simulator with an initial price, tick size, visible depth, seed, optionalMarketConfig, andcapture="summary" | "visual".step(): advance one step and return the latest snapshot.gen(steps): run multiple steps and return the latest snapshot.run(steps): returnSimulationResult(snapshot=..., history=...).get(): return the current snapshot as adict.get_history(): return the summary history as apandas.DataFrame.plot(): render the price path with a stable level-ranked signed-depth heatmap. Requirescapture="visual".plot_heatmap(anchor="mid" | "price"): render a standalone heatmap on stable level coordinates. Requirescapture="visual".plot_book(): render the current order book.
capture="summary" keeps the fast path lean. capture="visual" stores a fixed signed-depth window around the moving market center so the heatmap can show sweep, void, and refill structure clearly. Heatmap rows are always fixed visible ranks, laid out as ask N ... ask 1 | bid 1 ... bid N, so they do not drift vertically with price.
Snapshot and History
Snapshot fields:
steplast_pricemid_pricebest_bidbest_askspreadbidsasksbid_depthask_depthdepth_imbalancebuy_aggr_volumesell_aggr_volumefair_price
History columns:
steplast_pricemid_pricebest_bidbest_askspreadbid_depthask_depthdepth_imbalancebuy_aggr_volumesell_aggr_volumefair_price
Model
- Fair price follows a bounded mean-reverting Gaussian process with weak flow coupling.
- Hidden liquidity evolves as stochastic distributions rather than a hand-written rule tree. Total liquidity, side skew, and side-specific depth components move first, then visible limit/cancel/market flow is sampled from the synthesized distributions through Cox-Poisson style intensities.
- Visible depth is not rebuilt with symptom-specific rules. Thin-side recovery comes from dynamically synthesized shortage and near-touch distributions rather than hard visible-level floors.
- Repair is safety-only: it prevents one-sided or crossed books and enforces the spread cap, but it does not cosmetically repad every visible rank.
Realism Profiling
Profile generic microstructure behavior with:
python -m scripts.profile_realism --steps 5000
The profiler reports path balance, spread/impact persistence, flow/return sign agreement, top-rank gap frequency, per-rank depth shape, visible/full-book one-sidedness, near-touch connectivity, and pair-distribution entropy.
Documentation Assets
Regenerate the documentation images with:
python -m scripts.render_doc_images
The image renderer now searches for representative seeds that satisfy drift and path-balance acceptance instead of hard-coding one path.
Render the standalone heatmap example with:
python -m examples.plot_market_heatmap --output artifacts/orderwave_heatmap.png
More docs:
- English: docs/en/README.md
- Korean: README.ko.md
- Release process: docs/en/releasing.md
Metadata
Release files for orderwave 0.6.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| orderwave-0.6.8.tar.gz | 26.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| orderwave-0.6.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.0 kB
Release files / orderwave-0.6.8.tar.gz
| Download URL | orderwave-0.6.8.tar.gz |
|---|---|
| Size | 26.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
841cc3525dd77d0a41cd7949ba02bc8dc4ae558506a2d950b8bc55add1703abd
|
|
BLAKE2b-256 checksum How to use checksums |
f39f36200b7fe28c80ed793f66b6ded1d2523bde73291d21f3f572d9ec9c7c1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 12, 2026.
Transparency logRelease files / orderwave-0.6.8-py3-none-any.whl
| Download URL | orderwave-0.6.8-py3-none-any.whl |
|---|---|
| Size | 22.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5d36244ca8feb05ae999c7ade0f5517600a3f78499f0273c644fa5daa9ac325f
|
|
BLAKE2b-256 checksum How to use checksums |
b1c10313bd82e243453b5acbd78d21649c2a2b9c15ce2abcafe29f19495352fe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 12, 2026.
Transparency log