Repository navigation
Releases: simoncoombes/tradefloor
Release list
v0.10.2
A patch release with three changes for programs that host the engine. No
coefficient, preset or default moves, and every known-answer digest is
0.10.1's.
A restore onto an engine rebuilt on a later day's companies now continues
bit for bit (#268). From pt-v19 the VIX's anchor is derived from the roster
the engine is built on, and a snapshot did not carry it, so the rebuilt
engine's VIX parted from the original's at its next day. Snapshots now
carry vix_anchor, and ones written before still restore.
A host can now write each company's share count, for buybacks and share
issues (#274). set_shares_outstanding resets each market cap at the price
standing, and everything the engine weights by capitalisation reads the new
counts.
A host can now raise the VIX's target without writing the VIX (#275).
set_vix_target_premium adds a premium in VIX points that fades on a
half-life the host chooses, and set_vix_target_floor holds the target at
or above a level until it is cleared. The engine's own reversion carries
the VIX to the raised target; a one-off write of the VIX reverts within
days.
The snapshot and the state hash carry each new input only once a host has
used it, so saves and hashes from a host that never calls them are
unchanged.
Determinism. Every wheel in this release reproduces the
known-answer digest:
4ea1d56340a3357db730764c3e24c131c5e0883efa4cd6f7f56c83ea9674033c
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.10.1
A library and documentation release with no coefficient or default
changes. The browser Sim now numbers its days, so a Sim on pt-v18 or
later runs a different market, and one fixed-simulation probe case moves.
Every other known-answer digest is 0.10.0's.
A repeated pt-v21 build is a copy of the first. Engine keeps the last 16
engines whose build played the market prehistory and serves a later build
from the same seed, universe and model in about 0.2 milliseconds, the same
engine to the bit.
docs/EMBEDDING.md is a new guide for a program that drives the Rust engine
itself: how to open a market, the day loop the certification ran, how much
news and how many shocks of its own the model takes, and which statistics
stay calibrated where. A browser game's loop, rebuilt from its source, read
index volatility of 19.5% a year and a 19.9% fall over two years on
pt-v21, and 14.2% and a 21.3% rise once fixed.
Through 0.10.0 every day of a Sim was day 0, so on pt-v21 its earnings
and dividend calendars never moved. A Sim now runs the days run_days
runs. A negative crisis_epicentre_extra is now refused.
Two realism readings change. The two-year panel grades all 15 of its
statistics, with a new band for how long high correlation lasts. The
one-year table reads the index's return and its 3% falls over 360 seeds,
as the long-run criteria do, and pt-v21 reads 19 of 19.
Determinism. Every wheel in this release reproduces the
known-answer digest:
4ea1d56340a3357db730764c3e24c131c5e0883efa4cd6f7f56c83ea9674033c
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.10.0
pt-v21 is the default model. It is pt-v20 with 104 dials moved. pt-v20
and every older preset keep their values and replay exactly. Every default trajectory moves, and the
known-answer digests are re-based (KAT_VERSION 29).
Populated mode is new: tf.Population puts background traders in the
book beside your strategy. Isolated mode stays the default and is
unchanged.
The MCP server runs any shipped preset, keeps markets open between calls
as sessions, and runs a population on request.
The Rust crate follows semver from 0.10.0 and gains a full snapshot and
restore, a kept opening for host-driven markets, its state widths as
constants, and a check on the shock flow a host adds.
This is a minor release with breaking changes. Python loses the ten
engine internals deprecated in 0.9.0 and the pretium_version keys. Rust
structs and enums a host builds or matches are #[non_exhaustive].
Building a pt-v21 engine takes about 1.5 seconds for 20 names, because the
market lives two years of prehistory first. Each break is listed under
"Breaking changes" below.
Determinism. Every wheel in this release reproduces the
known-answer digest:
4ea1d56340a3357db730764c3e24c131c5e0883efa4cd6f7f56c83ea9674033c
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.9.1
A patch release for the MCP server. No coefficient, default or trajectory
changes, every known-answer digest is 0.9.0's, and pt-v20 stays the
default.
The MCP server's tools describe themselves better. Each of the thirteen now
has a title and annotations saying it only reads, is deterministic and
reaches nothing outside the server, except start_job, which adds a job to
the server's memory. Each description says what the tool does, when to use
it instead of its nearest sibling, what it costs and what it returns.
explain opened with a question and did not say how it differs from
explain_price_move; it now does. The MCP bundle's manifest lists each tool
by the first sentence of the server's own description, and a test keeps the
two in step.
run_stress_scenario takes fork_day: both markets run together to that
day, then split, and the scenario starts on it with its events' spacing
kept. Every day before the split is identical in both arms, so the
difference is the scenario applied to one shared history, the experiment
the README's demo runs in Python. A constructor or a macro path pins the
macro from day 0 and is refused. No model, trajectory or digest changes.
Determinism. Every wheel in this release reproduces the
known-answer digest:
ac004feaa3fecaa325073882a82eb2b5870b6c3ce0d86976a1f91146b1758fb7
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.9.0
A library release, not a model change. No coefficient, default or
trajectory changes: every known-answer digest is 0.8.8's, and pt-v20
stays the default. It adds API and refuses input 0.8.8 accepted, which the
0.8 LTS rules do not allow in a patch, so it is a minor release, and the 0.8
LTS line carries on beside it.
Engine.restore_state now refuses a snapshot that lacks a field, carries an
unknown one or holds a malformed value, and names the field. It used to keep
the engine's own value for a missing field (#184). Snapshots carry
state_schema; those written by 0.8.5 to 0.8.8 restore unchanged, and
earlier ones are refused.
tradefloor.fair_value(..., model=) equals the engine's valuation to the
bit, and without a model it returns what it always has (#176). The new
Engine.fair_values() returns each name's fair value as the next tick
starts from it.
order_flow_depth_law, a new switch that is 0 on every preset, divides
order-flow impact by a name's depth once instead of twice (#182).
Scenario.starting_at(day) and World.apply(scenario, at=day) start a
packaged scenario on a chosen day (#132).
Ten engine internals warn when read from the top level, so import them from
tradefloor._core. They stay until 0.10.0 at the earliest, and a star
import still binds them without a warning.
Determinism. Every wheel in this release reproduces the
known-answer digest:
ac004feaa3fecaa325073882a82eb2b5870b6c3ce0d86976a1f91146b1758fb7
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.8.8
A patch release on the 0.8 long-term support line. No coefficient, default
or trajectory changes, every known-answer digest is 0.8.7's, and pt-v20
stays the default.
tradefloor is listed in the MCP Registry as
io.github.simoncoombes/tradefloor, so an MCP client can find it and start
it with uvx --with "tradefloor[mcp]==0.8.8" tradefloor mcp. The new
tradefloor mcp command runs the same server as tradefloor-mcp. The
release workflow now publishes server.json to the registry after each
PyPI upload.
Determinism. Every wheel in this release reproduces the
known-answer digest:
ac004feaa3fecaa325073882a82eb2b5870b6c3ce0d86976a1f91146b1758fb7
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.8.7
A patch release on the 0.8 long-term support line that changes text only.
No coefficient, default or trajectory changes, every known-answer digest is
0.8.6's, and pt-v20 stays the default.
The doc comments on ModelParams now say what each coefficient does, its
units, and which presets carry which value, in place of the notes on how each
value was chosen. The same goes for the envelope's gap descriptions, the
reasons score returns for an unreadable row, and the docstrings in
facts, fingerprint, loss and render. Several stale claims were
corrected on the way: for example, the comments said pt-v19 ships
market_vol_level_sigma at 0.085, where every preset ships 0.0. A test
checks every value a doc comment claims against the preset table.
Determinism. Every wheel in this release reproduces the
known-answer digest:
ac004feaa3fecaa325073882a82eb2b5870b6c3ce0d86976a1f91146b1758fb7
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.8.6
A patch release on the 0.8 long-term support line. No coefficient, default
or trajectory changes. Every known-answer digest is 0.8.5's, and pt-v20
stays the default.
envelope.check still refuses a sector-concentrated roster on pt-v20, and
now says why. The run behind the pt-v19 grant was repeated on pt-v20 with
tools/calibration/roster_shapes.py: the same four mixes, seeds 101 to 130,
252 and 504 days. At 252 days every mix held every shape row the bands can
grade. At 504 days the S&P-like and technology-heavy mixes read
volume_abs_return_corr at 0.6367 and 0.6332 against a ceiling of 0.63,
where the balanced roster reads 0.6266. The run is committed as
measurements/roster-shapes-pt-v20.json, and the roster-concentration gap
and the refusal quote it. A question that passes preset="pt-v19" keeps the
pt-v19 grant.
Determinism. Every wheel in this release reproduces the
known-answer digest:
ac004feaa3fecaa325073882a82eb2b5870b6c3ce0d86976a1f91146b1758fb7
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.8.5
0.8.5 is the first long-term support release. The 0.8 line gets fixes that
leave every known-answer digest unchanged for 24 months from this tag
(docs/SUPPORT.md). pt-v20 is the default. Its tape follows the model
price, a stock's own news and the market's plain shocks move fair value for
good, fear discounts fair value while the VIX is high, and agents trade in a
book with depth. It passes all 40 rows registered for it.
model="pt-v19" keeps 0.8.1's market; every preset replays as it did.
On pt-v20 macro data is published late, as the agencies publish it. Agents
see a read-only MarketView (trusted_agents=True gives the live engine),
and tampering is flagged. pt-v20 reports no capture ratio; use
versus_buy_and_hold. Seeds take any 64-bit integer.
Universe.random(n, bonds=True) adds three rate indices.
What breaks. Orders reach the market once, not every tick, so traded
results move; run_session(order_flow=...) raises (pass fills= or
flow_per_tick=). Borrowing pays the policy rate, and a bar's volume is
what traded inside it. Older LLM recordings do not replay. The Rust crate
breaks 0.8.1 code; pin =0.8.1.
Nearest the edge. The two-year volume-return correlation at 0.627
against a ceiling of 0.63; a macro timing rule at 92 per cent of its
tolerance; the price trough leading the earnings trough by 10 sessions
against a real 68; the two-year yield's daily move at 3.87 bp against 5.23;
a recession winning back 49 per cent of its fall in a year against 2009's
62. The crisis lever is 5.1x against a real 6.2x.
Determinism. Every wheel in this release reproduces the
known-answer digest:
ac004feaa3fecaa325073882a82eb2b5870b6c3ce0d86976a1f91146b1758fb7
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.
v0.8.1
Text only. No coefficient, default or trajectory changes, and the
known-answer digest stays at 1e683b96. The README, the envelope gap notes
and check() messages, the scenario target notes and the parameter summaries
now describe pt-v19. check() accepts and refuses the same questions.
What 0.8.0 changed and its note left out, if you keep state saved under
0.7.x. ModelParams.from_preset refuses an override that breaks an identity
pt-v19 claims, so from_preset(garch_alpha=0.07) now raises.
from_preset_unchecked skips the check and identity_breaks lists what
breaks. Checkpoint.resume and RunManifest.reproduce refuse anything
written under 0.7.x, and Engine.restore_state refuses a 0.7.x snapshot,
because the engine now has ten random streams where it had eight.
state_hash covers 13 more snapshot fields, so the same prices hash
differently. A custom-XXXXXXXX fingerprint covers every to_dict() entry,
and 0.8.0 added 48 settable dials, so custom names do not carry across. A
transcript recorded under a different preset raises ReplayMiss.
envelope.score, envelope.certified, facts.compare_to_real_markets and
facts.report take a basis argument that defaults to ruled, the
1987-2025 bands, where 0.7.x graded on 2015-2025. New public API:
tf.crisis_epicentre_solve, Engine.noise_split and
Engine.crisis_episode.
Determinism. Every wheel in this release reproduces the
known-answer digest:
c22d4a029b402fe395a9d2be1fec10194a3c28d89f93e7717db33696fc80b6af
Verified on linux-x86_64, linux-aarch64, macos-arm64,
macos-x86_64 and windows-x86_64 before publication.