Skip to main content

pretium

determinism licence: MIT OR Apache-2.0 python 3.11+

A market simulator you can run a strategy against. Rust core, Python API.

Give it a seed and a set of companies and it runs a market forward: prices, a limit order book, fills, and an economy that advances itself daily. Your orders match against real depth, so trading moves the price the way it would anywhere else.

It exists because historical data can't answer two questions. What would have happened if I'd traded differently, and what actually caused this price move.

Install

pip install pretium

0.1.1 is the current release, and 0.1.0 was the first. The API may still move before 1.0, and anything that changes the simulated trajectory arrives as a new model preset rather than an edit to an existing one, so a published result stays reproducible.

In thirty seconds

import pretium as pt

universe = pt.Universe.random(40, seed=111)

spec = pt.StrategySpec.momentum(lookback_days=1.0, top_k=5)
scores = pt.evaluate({"mine": spec}, seed=7, universe=universe, days=10)

scores["mine"].return_pct            # what it made
scores["mine"].impact_bps            # what its own footprint cost
scores["mine"].strategy_fingerprint  # sha256, cite this

That's one market draw, which tells you as much about the seed as about the strategy. pt.rank runs many seeds and compares them with a paired sign test.

What makes it different

Determinism that's checked. The crate ships its own exp, log, sin and cos instead of calling the platform libm. Every release builds five targets, runs one fixed simulation inside each, and compares digests. A disagreement fails the release. A WebAssembly build produces the same digest as the native one.

Ground truth you can read. The simulator computed every price, so it can tell you why. One row per instrument per tick, with seven factor contributions that sum to the move and a residual around 1e-16. No historical dataset carries those labels. You can see that a stock fell, never that 60% of the fall was order-flow pressure.

Counterfactuals you can run. The same seed runs with and without your orders, so every fill is priced against the market where you never traded. That's the number TCA vendors approximate.

Results someone else can check. A StrategySpec is a declarative, hashable document rather than an arbitrary callable. A RunManifest carries the seed, universe, macro conditions, scenario, model and strategy together with the expected digest. reproduce() refuses on a mismatch and names the culprit, because a manifest that quietly reproduced a different market would be worse than no manifest.

Driving it from an agent

pip install "pretium[mcp]"
claude mcp add pretium -- pretium-mcp

Eleven read-only tools over the simulator, so a coding agent can ask whether a momentum strategy beats buy-and-hold here, and whether the difference is real. Strategies, universes and scenarios are composed as data. There's no path from a tool argument to code execution.

Every result carries computed caveats and full provenance. A model summarising a result has the tool output and nothing else, and will otherwise report return_pct: 88.7 as "the strategy made 88.7%". The MCP server has the tool list and the client configuration.

What it's bad at

Good results here don't predict real returns. The price process comes from a known model, so a strategy that fits that model's structure will look excellent and teach you nothing. A strategy that fails here is more informative, because it broke against a live order book under honest impact costs.

Realism is a stated envelope, not a score. pt.facts.measure() reports ten statistics against real-market bands. At 252 days the shipped pt-v3 preset holds nine of the ten in band, and holds the same nine on axes the calibration never saw: fresh seeds, and a fresh 60-name universe.

The tenth is the autocorrelation of volume changes, which misses by 13.7 seed-standard-deviations. It's excluded from the calibration objective deliberately, because an optimiser pointed at an unreachable target doesn't fail cleanly, it distorts every other parameter chasing it. In practice a volume forecast here is never wrong twice running, so an execution algorithm faces an easier scheduling problem than the one it was written for.

Six gaps are measured and named rather than assumed. The certified horizon is 252 days and the model doesn't hold beyond it. Volatility memory decays exponentially where real markets decay hyperbolically. Tails are too thin over multi-year windows. Scenario response is directionally right but not calibrated in magnitude. And certification was measured on a sector-balanced roster, which no real index is. The realism envelope states each gap and what it forbids. pt.envelope.check() refuses to certify a question that falls outside one.

Single venue, no latency, no strategic counterparties. Orders arrive instantly, there's one book per name, and you trade against a market maker and aggregate flow rather than agents that adapt to you.

Worked examples

Six notebooks and two scripts in examples/, numbered in reading order and executed as part of the test suite:

what it covers
01-first-simulation Universe, engine, order book, determinism
02-evaluating-a-strategy Specs, baselines, ranking across seeds
03-why-did-the-price-move The seven factors that sum to every move
04-how-realistic-is-this The realism panel and the gaps
05-training-an-agent The Gymnasium environment, and what size costs
06-execution-and-impact TCA and the counterfactual run

Or a whole study in one file. Sweep, evaluation, TCA and replay in about five seconds:

python examples/07-research-workflow.py

Documentation

Full docs: simoncoombes.github.io/pretium

Getting started and core concepts. Agents, evaluation and the RL environment. Scenarios and macro paths, strategy specs, model presets, checkpointing and forking, sharing a run, Arrow output and streaming sweeps, SEC EDGAR loading, transaction cost analysis, the MCP server, running in the browser, the realism envelope and metrics, and the conventions worth reading before you hit them.

Contributing

See CONTRIBUTING.md. One rule shapes the rest: a change to the simulated trajectory is a breaking change, whatever its size. A market that runs differently from the same seed invalidates every published result that cited it.

Citing this

See CITATION.cff, or cite a specific result by its manifest. The seed, the universe fingerprint, the model fingerprint and the strategy fingerprint together identify exactly what ran.

Licence

MIT OR Apache-2.0, at your option. See LICENSE-MIT and LICENSE-APACHE.

Metadata

Release files for pretium 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pretium 0.1.1
File Size Uploaded
pretium-0.1.1.tar.gz 539.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for pretium 0.1.1
File
pretium-0.1.1-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
pretium-0.1.1-cp311-abi3-manylinux_2_34_x86_64.whl CPython 3.11 abi3 Linux glibc 2.34+ x86-64 Details
pretium-0.1.1-cp311-abi3-manylinux_2_34_aarch64.whl CPython 3.11 abi3 Linux glibc 2.34+ ARM64 Details
pretium-0.1.1-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details
pretium-0.1.1-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details

Total release size: 4.3 MB

Release files / pretium-0.1.1.tar.gz

Download URL pretium-0.1.1.tar.gz
Size 539.5 kB
Tags Source
SHA-256 checksum
How to use checksums
9b2d29ed0291011aa2bc5f1fb115a4331507c36a2d317e20ae67b840d5e00abc
BLAKE2b-256 checksum
How to use checksums
dfe0a55afb2c30d8dc21c0f62b74b2b845e945276907a76f420ad192fd37c143
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 25, 2026.

Transparency log

Release files / pretium-0.1.1-cp311-abi3-win_amd64.whl

Download URL pretium-0.1.1-cp311-abi3-win_amd64.whl
Size 692.1 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
5f596efe7831fc4a196b9e63e9d6cc4330ac3490948c1df2c96cd2c04de43e0f
BLAKE2b-256 checksum
How to use checksums
3c1233ebeb7f3da3272c8bf23c714d3e37645cb8e0f9056085020663da23645a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 25, 2026.

Transparency log

Release files / pretium-0.1.1-cp311-abi3-manylinux_2_34_x86_64.whl

Download URL pretium-0.1.1-cp311-abi3-manylinux_2_34_x86_64.whl
Size 794.0 kB
Tags CPython 3.11 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
b4c12014675b47509ce129a54f7a811bab5cafc0017db2fbf3584a0fa7d8c358
BLAKE2b-256 checksum
How to use checksums
722a9757a60c5118646e0ce504a97a7e759fa2d26df0b44d236a2348148f2dd5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 25, 2026.

Transparency log

Release files / pretium-0.1.1-cp311-abi3-manylinux_2_34_aarch64.whl

Download URL pretium-0.1.1-cp311-abi3-manylinux_2_34_aarch64.whl
Size 777.9 kB
Tags CPython 3.11 Linux glibc 2.34+ ARM64 abi3
SHA-256 checksum
How to use checksums
d0bca50041e770f132cfc3c1174853d320774538ae44d08318defab171ad6d32
BLAKE2b-256 checksum
How to use checksums
b50860e88f900b6f13b810f3c1a167fceeda9eab545e8587aa03eba614e66cd0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 25, 2026.

Transparency log

Release files / pretium-0.1.1-cp311-abi3-macosx_11_0_arm64.whl

Download URL pretium-0.1.1-cp311-abi3-macosx_11_0_arm64.whl
Size 746.1 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
499d87eb7db99c5ba5bda00dff49df30a816075de609930f72fc76c97189f8c2
BLAKE2b-256 checksum
How to use checksums
7af593ca2eb74bdc946d959c3413653a0c6b4e69ed40505fb71d6d747bbc6d6d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 25, 2026.

Transparency log

Release files / pretium-0.1.1-cp311-abi3-macosx_10_12_x86_64.whl

Download URL pretium-0.1.1-cp311-abi3-macosx_10_12_x86_64.whl
Size 767.0 kB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
5c24b12635b2622ea3dad2c2fe740db1ed08161fa7e2c8f68f856c78e616e1db
BLAKE2b-256 checksum
How to use checksums
19b879bdc06bdfa78b6adab865512b3b820321dac4677dfac8dd34f91db7daa3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Aug 25, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.3

6 release files

0.4.2

6 release files

0.4.1

6 release files

0.4.0

6 release files

0.3.0

6 release files

0.2.0

6 release files

0.1.4

6 release files

0.1.3

6 release files

0.1.2

6 release files

This release

0.1.1 This release

6 release files

0.1.0

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page