Release notes
What changed, what it means for a run you already have, and how to pin the old behaviour if you need it. Full history in CHANGELOG.md.
0.5.0
The library is now tradefloor. Formerly pretium, which published through 0.4.3 and stays on PyPI and crates.io forever: published results cite those versions, and reproducibility is the point. Install tradefloor, import tradefloor, crate tradefloor, MCP server tradefloor-mcp. The rename changes no behaviour — this release reproduces 0.4.3's known-answer digest on every platform, and the release gate proves it before publishing. Preset names stay pt-v1 through pt-v15: they are citation identifiers, frozen under the old prefix.
pt-v15: the first preset to hold both crisis instruments everywhere. pt-v14 plus six numbers: the two-timescale variance mixture (slow weight 0.35, persistence 0.98, gain 0.05, VIX damp 0.374), the daily credit floor at 1.0, and sector-loading dispersion at 0.5. Over thirteen thirty-seed qualification blocks it ties pt-v14's panel on every block, compresses the crisis co-movement range from 0.0774 to 0.0464 — inside the 0.0630 band width — holds crisis co-movement in range on 13 of 13 blocks and the crisis lever on 13 of 13 at median 6.152 against the real 6.16. Selectable by name; not the default, which remains pt-v14.
0.4.3
2026-08-280.4.2 changed pt-v13 and pt-v14, and it should not have. If you pinned either preset, this puts them back exactly as they were in 0.4.0 and 0.4.1: all fourteen certified statistics are bit-identical to their pre-0.4.2 values.
The 0.4.2 fix pointed the dollar's safe-haven gate at crisis_vix_threshold, and both presets override that parameter, so their gate moved and their trajectories moved with it. No result computed under 0.4.2 is wrong, since every statistic stayed in band, but a run recorded under pt-v14 before 0.4.2 does not replay under it, and the preset name is what a citation carries.
The dollar gate is its own dial now, usd_crisis_vix_threshold. A preset that wants both gates to move together sets both.
0.4.2
2026-08-28Three reported defects, no trajectory change. Every preset runs exactly as it did in 0.4.1.
Moving crisis_vix_threshold gated the gold crisis premium at your level and left the dollar's safe-haven drift at the default, silently. The two describe one regime, and both read the parameter now.
A held meeting now reports what it decided. advance_day computed the central bank's decision and announcement variant and discarded both; DayAdvanceOutcome carries them.
Between meetings the corporate bond yield goes stale while the treasury keeps moving, so the credit spread can drift under its floor and quote an investment-grade yield below the risk-free curve. daily_credit_floor_gain corrects it and ships at 0.0, because that code path is shared by every preset and a trajectory change belongs at a preset boundary.
0.4.1
2026-08-28pt-v13 and pt-v14 now report the mispricing half-life they run. Both said 68.26 days and both decayed at 60. Nothing you ran was wrong and no trajectory moves in this release: the number the engine reads is mispricing_phi, which was always the 60-day value.
What was wrong is a published fact. tf.model_preset() reported the 68.26, a manifest records it, and anyone setting a half-life from that number got a different market than the preset runs. If you pinned either preset in 0.4.0, your results are unaffected and need no rerun.
0.4.0
2026-08-28pt-v14 is now the default. It beats pt-v12 by a wider margin than any preset before it, and it is never worse on any of the thirteen seed blocks it was measured on.
| Over 13 seed blocks | Before (pt-v12) | Now (pt-v14) |
|---|---|---|
| two-year panel, blocks fully in band | 3 of 13 | 11 of 13 |
| crisis correlation outside its real range | 4 of 13 | 2 of 13 |
| roster shapes in band | 131 of 138 | 137 of 138 |
Industry-level volatility now carries more of the market's shared movement, and the market's own volatility memory was retuned to pay for it. Stocks in different industries stop moving together quite so uniformly in a crisis, which is what real markets do.
One thing got slightly worse. Volume and volatility still arrive together, but less tightly: the measure falls from 0.56 to 0.52 in a band that runs 0.46 to 0.66. It never leaves the band at the resolution this project certifies.
The documentation is rebuilt as a learning path. Old URLs still work: twelve redirect to the page that replaced them, and four pages were retired.
0.3.0
2026-08-26pt-v12 is now the default. It is the first preset that looks like a real market over two years, not just one.
| In band | Before (pt-v10) | Now (pt-v12) |
|---|---|---|
| over one year | 14 of 14 | 14 of 14 |
| over two years | 13 of 14 | 14 of 14 |
| on a roster it was never tuned on | 14 of 14 | 14 of 14 |
Thirty-seed medians. Only the two-year row moved, and it was not paid for at one year or on a fresh roster.
If you have a result to reproduce
Results recorded without naming a preset will differ from here on. Every earlier preset still exists and still reproduces bit for bit:
eng = tf.Engine(seed=42, universe=u, model="pt-v10") # exactly as before
What was actually wrong, and what it cost
Volume stopped responding to a move at four percent: a stock down twelve traded exactly like one down four. That single cap had been in the engine since the first version and nobody had chosen it. Raising it to twelve percent fixed the one statistic out of band over two years and cost nothing measurable elsewhere.
One thing got worse: driven by a real macro path, daily swings now run 1.57x as wide as the real stock they are compared against, against 1.555x before. That is written up as the scenario-magnitude gap on the realism envelope page.