Skip to main content

An order-flow-driven synthetic market simulator.

Project description

orderwave

PyPI version Python versions Release workflow

Order-flow-driven aggregate order-book market-state simulation for Python, with built-in visualization.

orderwave models a sparse aggregate order book, participant-conditioned limit flow, marketable flow, adverse quote revision, passive refill, latent meta-orders, exogenous shocks, and session-aware state changes. Price is still an outcome of book mechanics rather than a directly random-walked process.

orderwave is an aggregate order-book market-state simulator. It is built for believable intraday path generation, book-state diagnostics, preset comparison, and sandbox experimentation. It is not an order-level matching or fill-precision simulator.

English Docs | 한국어 README | 한국어 문서

orderwave overview

Why orderwave

  • Minimal public entry point: from orderwave import Market
  • Market is the supported public API; engine and model internals stay private
  • Price changes only through quote improvement, depletion, marketable flow, and refill dynamics
  • Internal microphases shape open release, midday lull, power-hour activity, and closing imbalance behavior
  • Same seed, same path
  • Built-in overview, current-book, and diagnostics figures
  • Thin public history plus richer event-aligned debug history when you want the latent state

Installation

pip install orderwave

For local development:

pip install -e .[dev]

Quick Start

from orderwave import Market

market = Market(seed=42, preset="trend")
result = market.run(steps=1_000)

snapshot = market.get_snapshot()
history = market.get_history()
events = market.get_event_history()
debug = market.get_debug_history()
overview = market.plot()
book = market.plot_book()
diagnostics = market.plot_diagnostics()

print(snapshot.session_phase, snapshot.mid_price, snapshot.best_bid, snapshot.best_ask)
print(history.tail())
print(events.tail())
print(debug[["microphase", "maker_stress", "quote_revision_wave", "refill_pressure"]].tail())

overview.savefig("orderwave-overview.png")

For long runs where compact history and plotting are enough:

fast_market = Market(seed=7, preset="balanced", logging_mode="history_only")
summary = fast_market.run(steps=10_000).history
figure = fast_market.plot()

Core Realism Model

  • Aggregate visible book levels rather than per-order FIFO
  • Participant mix: passive_lp, inventory_mm, noise_taker, informed_meta
  • Market-first step cycle with structural pre-withdrawal and post-refill behavior
  • Regime persistence plus hazard-like switching between calm, directional, and stressed
  • Session phase and internal microphase structure: open_release, morning_trend, midday_lull, power_hour, closing_imbalance
  • Event-aligned latent diagnostics including flow_toxicity, maker_stress, quote_revision_wave, and refill_pressure

API Surface

API Purpose
step() Run one micro-batch and return the latest snapshot
gen(steps=n) Run n micro-batches and return the latest snapshot
run(steps=n) Run n micro-batches and return a bundled typed result
get() Return the current snapshot
get_snapshot() Return the current snapshot as a typed dataclass
get_history() Return compact pandas.DataFrame history
get_event_history() Return the applied event log as a pandas.DataFrame
get_debug_history() Return event-aligned latent debug history
get_labeled_event_history() Return event history joined with latent debug labels
plot() Render price, spread, trade strength, and signed visible-depth heatmap
plot_book() Render the current order book on a real price axis
plot_diagnostics() Render session, excitation, imbalance, spread/volatility, resiliency, occupancy, microphase, and revision/refill diagnostics

Advanced configuration is available through orderwave.config.MarketConfig. Common settings can also be passed directly as Market(..., preset="trend", logging_mode="history_only", liquidity_backstop="off").

logging_mode="history_only" keeps summary history plus overview/book plotting data, but disables get_event_history(), get_debug_history(), and plot_diagnostics(). Default liquidity_backstop="on_empty" restores a missing side without forcing minimum visible depth after every step. Use "always" for more aggressively stabilized books or "off" to allow thinner post-step liquidity.

Built-in Visualization

All plotting methods return matplotlib.figure.Figure and leave save/show control to the caller.

  • plot() renders the main overview: mid/last price, spread band, trade strength, and signed visible-depth heatmap
  • plot_book() renders the current order book on a real price axis
  • plot_diagnostics() renders: session phase profile, imbalance lead, market-flow excitation, spread-volatility coupling, depletion resiliency, regime/shock occupancy, microphase stress profile, and revision/refill pressure

orderwave current book

orderwave diagnostics

The overview heatmap keeps signed depth. Ask liquidity is red, bid liquidity is blue, 0 maps to a light gray midpoint, and missing levels render as blank background.

Performance Measurement

Use the single performance runner for throughput, memory, and full vs history_only logging comparison.

python -m scripts.measure_performance --preset balanced --seeds 20 --steps 20000 --outdir artifacts/performance

The runner writes:

  • performance_metrics.csv
  • performance_summary.csv
  • performance_logging_modes.csv
  • performance_summary.md

Validation Sweep

The repository also ships a validation runner for preset sweeps, sensitivity checks, reproducibility, and soak tests.

python -m scripts.validate_orderwave --profile quality_regression --jobs 4 --outdir artifacts/validation

The runner writes:

  • validation_summary.md
  • run_metrics.csv
  • preset_summary.csv
  • sensitivity_summary.csv
  • invariant_failures.csv
  • acceptance_decision.md
  • diagnostics_<preset>_<seed>.png when diagnostics rendering is enabled

Release builds use a shorter smoke workload:

python -m scripts.validate_orderwave --profile release_smoke --outdir artifacts/validation-release --baseline-json tests/golden/validation_release_baseline.json --fail-on-baseline-drift

Core Semantics

  • mid_price moves when quotes improve, cancel, or get depleted
  • last_price only changes on realized trades
  • day, session_step, and session_phase expose the synthetic session clock
  • trade_strength is a realized-trade signed imbalance from aggressor buy/sell EWMA
  • get_debug_history() adds latent fields such as microphase, flow_toxicity, maker_stress, quote_revision_wave, and refill_pressure

Core guarantees:

  • Price is never random-walked directly
  • Quote improvement, best-quote depletion, and market trades are the only price-moving mechanisms
  • Visible history starts at step == 0 with the seeded initial book
  • Applied limit, market, and cancel events are available through get_event_history()
  • Aggregate depth is modeled without exposing per-order FIFO complexity in v1

Docs

orderwave.validation is also a supported advanced API for reproducibility checks, sensitivity sweeps, and validation pipelines.

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

orderwave-0.5.1.tar.gz (86.1 kB view details)

Uploaded Source

Built Distribution

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

orderwave-0.5.1-py3-none-any.whl (85.8 kB view details)

Uploaded Python 3

File details

Details for the file orderwave-0.5.1.tar.gz.

File metadata

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

File hashes

Hashes for orderwave-0.5.1.tar.gz
Algorithm Hash digest
SHA256 1a960c99400b84624646b6534811640d81d63ff36188c4c0ace5c245da698375
MD5 1fbbaf4152872e4217b3182917f01935
BLAKE2b-256 16e00a446cf992dd59c1f51b6aa852297abe54ffc04d59528214b5bd3dd6807a

See more details on using hashes here.

Provenance

The following attestation bundles were made for orderwave-0.5.1.tar.gz:

Publisher: workflow.yml on smturtle2/quoteflow

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

File details

Details for the file orderwave-0.5.1-py3-none-any.whl.

File metadata

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

File hashes

Hashes for orderwave-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e535bf0b51206ee6f85d622b643e7a1e7a24ac939b54b655f299e1f9d50c08db
MD5 4ff9c9dc06a5340b06f2cc93377664a2
BLAKE2b-256 85b163b9d4e092b36b4aaec483cc611ce3e1a23be317326b8baf9c9f34c3f04c

See more details on using hashes here.

Provenance

The following attestation bundles were made for orderwave-0.5.1-py3-none-any.whl:

Publisher: workflow.yml on smturtle2/quoteflow

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