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

Wheels are prebuilt for Linux, macOS and Windows on CPython 3.11+, and the core package has no dependencies.

The engine is also published as a Rust crate, so you can use it without Python at all:

cargo add pretium

Both are built from the same source at the same version, and run the same market: https://crates.io/crates/pretium.

The API may still move before 1.0. What will not move is a published result: anything that changes the simulated trajectory arrives as a new model preset rather than an edit to an existing one, so a run you cited last month reproduces this month.

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 fourteen statistics against real-market bands. At 252 days the shipped pt-v10 preset holds all fourteen in band on thirty calibration seeds, and all fourteen again on a 60-name universe it never saw. That is a market with the right volatility, the right tails, the right co-movement, industries that co-move more than strangers, correlation that stays elevated after a panic, volume that behaves, and volatility episodes it produces itself.

pt-v10 became the default on 2026-08-26, an era boundary: every seeded trajectory changed. Runs recorded before it are not comparable to runs after it unless they name their preset, and every earlier preset from pt-v1 onward stays selectable and reproduces bit for bit forever.

At 504 days pt-v10 holds thirteen of fourteen. The one it misses there, volume-change autocorrelation, is stated as a gap.

Six gaps are measured and named rather than assumed. The certified horizon is 252 days, and nothing beyond 504 days has been measured at all. Volatility memory decays exponentially where real markets decay hyperbolically. Volume-change autocorrelation leaves its band at two years. Scenario response has the right size, measured as a regression gain, but too much noise around it for one run to size a scenario from, and industries hold together in a crisis about a third as tightly as real ones. The endogenous economy cannot reach its own crisis regimes, so an inflation regime has to be driven through a scenario. 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

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

what it covers
00-a-year-in-one-market Start here: one company, one year, two crises, one chart
01-first-simulation Universe, engine, order book, determinism
02-evaluating-a-strategy Specs, baselines, ranking across seeds
03-why-did-the-price-move The nine 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
07-research-workflow.py A whole study in one file: sweep, evaluation, TCA and replay
08-claude-agent.py An LLM agent trading the market through the harness
09-a-pandemic-shaped-market A real 2020-21 macro path, and which fields actually transmit

The two scripts run from the command line rather than a notebook. The whole study takes 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, and RELEASING.md for how a version reaches PyPI and crates.io. 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.2.0

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.2.0
File Size Uploaded
pretium-0.2.0.tar.gz 489.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for pretium 0.2.0
File
pretium-0.2.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
pretium-0.2.0-cp311-abi3-manylinux_2_34_x86_64.whl CPython 3.11 abi3 Linux glibc 2.34+ x86-64 Details
pretium-0.2.0-cp311-abi3-manylinux_2_34_aarch64.whl CPython 3.11 abi3 Linux glibc 2.34+ ARM64 Details
pretium-0.2.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details
pretium-0.2.0-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.2.0.tar.gz

Download URL pretium-0.2.0.tar.gz
Size 489.5 kB
Tags Source
SHA-256 checksum
How to use checksums
45d124b21dc8acaf97224709eb6c96a6686885e157fb2b6bc24ddc436d3a7f8c
BLAKE2b-256 checksum
How to use checksums
0ba239c86b7e4046b593ca7ba4d737c589e3bb5f2640f64d3079b83827d274c4
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 26, 2026.

Transparency log

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

Download URL pretium-0.2.0-cp311-abi3-win_amd64.whl
Size 706.0 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
58292f1c52e389ba562744f9658e83ee5af545a571710559321d4c46cd600d24
BLAKE2b-256 checksum
How to use checksums
edab6b92f6cf0b46c117c908b2da2ef370b961850ea04cf41a037af3a76d78b0
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 26, 2026.

Transparency log

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

Download URL pretium-0.2.0-cp311-abi3-manylinux_2_34_x86_64.whl
Size 808.1 kB
Tags CPython 3.11 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
cebf021c33d2b21f909ddf8dee495a9cb33eb146bddafdf0ab724cd108ef5585
BLAKE2b-256 checksum
How to use checksums
d9e5fc91b0a666d469093aa7e78d741a52de6e991d312e7486c5ef3997c0f662
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 26, 2026.

Transparency log

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

Download URL pretium-0.2.0-cp311-abi3-manylinux_2_34_aarch64.whl
Size 792.5 kB
Tags CPython 3.11 Linux glibc 2.34+ ARM64 abi3
SHA-256 checksum
How to use checksums
7e0cd578baf890843fd4ce002fc04b28b6da059d9d5801692739f8f3c38f5758
BLAKE2b-256 checksum
How to use checksums
189e9c37631c1d2fea3ddb2a4ea300a89bc268876a7fa8d3eb3811b09a71d7a0
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 26, 2026.

Transparency log

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

Download URL pretium-0.2.0-cp311-abi3-macosx_11_0_arm64.whl
Size 759.3 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7e423a6fdd097277116d47c01bc23eefa51498a84bc0d674ca85e7a47927944f
BLAKE2b-256 checksum
How to use checksums
4b3a5fcb3e8d9d1c0e7354d2a0ccc7a2d245aea08c7752d6e9c9fd5aa9a33bd0
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 26, 2026.

Transparency log

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

Download URL pretium-0.2.0-cp311-abi3-macosx_10_12_x86_64.whl
Size 781.5 kB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
c136e705081760c9fc5eecb8804101bad8d3edd1e23fa1ba2e69b6071048fb55
BLAKE2b-256 checksum
How to use checksums
be9bc3f1bb20dbe3ea62f935932736b28b9ba0bd507da9a944b3e260ee6cb91f
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 26, 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

This release

0.2.0 This release

6 release files

0.1.4

6 release files

0.1.3

6 release files

0.1.2

6 release files

0.1.1

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