Published with figures from earlier studies on licence-restricted data redacted; the sha256 is of the unredacted file.
sealed.toml edit, no network call. Written by Claude Opus 5.5 (claude-opus-5-5) under owner decision fintech-wiki/decisions/2026-10-25-owner-direction.md item 3 ("freeze trend").spec.toml, strategy.py and tests/test_e1f_futures.py. Its sha256 goes into the family event (§10), which the orchestrator logs from a clean main. After that commit, a changed rule is a new family. A bug fix that changes no rule is disclosed in a dated amendment line at the end of this file before the slice is opened, and the family event names it (amendments).research/2026-10-14-e1-trend-carry/E1-prereg.md (family 1). That file froze a rule for ETF and rate *proxies* and was KILLed (§6 "Seen before"). This SPEC keeps E1's mechanism. It takes the rule from published defaults alone, and it is tested on real contracts.carver rule (§4), traded on the licensed futures universe (§3), earns a positive net excess return after costs (§5) on the sealed span (§6) and in the forward record (§8).library/papers/method/19-Moskowitz2012.pdf, Table 1, journal pp. 231–232]. Hurst, Ooi & Pedersen (2017, "HOP") find it in 67 markets from 1880 to 2016, with an average single-market Sharpe ratio of "approximately 0.4" [V, 20-Hurst2017.pdf PDF p. 5]. HOP also note that cross-market correlations rose "from late 2008 until the middle of 2014" [V, PDF p. 11].21-Koijen2018.pdf PDF p. 4]. Commodity carry compares the nearest and next-nearest contracts [V, PDF p. 13]. The paper notes that carry "faces larger transaction costs" [V, PDF p. 24].library/books/: trend and carry correlate at 0.36 (PDF p. 259). Their 60:40 combination earns Sharpe 1.27 against 1.14 for trend and 0.94 for carry, on 100+ instruments with costs included (Table 55, PDF p. 271; restated in Table 56, PDF p. 272) [V].fintech-wiki/research/consolidated.md §3, record P08) [V].Anchor: Carver's post-2013 Jumbo results. These are the latest out-of-sample-in-time figures for this exact rule family. Trend scores 0.79 and carry 0.56, net of spread and commission, since 2013 (AFTS Table 131, PDF pp. 491–492) [V]. 2013 is after MOP's publication (2012) and after Carver's EWMAC rules appeared in *Systematic Trading* (2015) [A: year from memory].
fintech-wiki/research/2026-10-25-adaptive-bar.md ("the ×0.5 haircut is applied twice … loosen the search side and keep the claim side honest"): one ×0.5, once.1. Breadth. Carver uses 100+ instruments chosen with hindsight; the universe here is at most MOP's list (§3), and at least the 13 minimum CME roots. His median single instrument earns 0.27 against 1.27 for the whole portfolio (Table 56, PDF p. 272; the 0.27 median is also Table 54's last column, PDF p. 270) [V]. So breadth carries most of the Sharpe, and a portfolio of 13 to 50 markets keeps roughly √(N_eff / 22) of it [I]. That is about 0.55 for N_eff ≈ 7 and 0.8 for N_eff ≈ 14 [I].
2. Parameters fitted in the span. The book was written in 2022–23, so its "since 2013" window is in-sample for Carver's choices of speeds, spans and scalars [I].
3. Costs. Ours are a flat per-contract cost. His are spread plus commission per instrument [I].
sweep.power (call it with haircut=0 on this number), and no shrink of P(PASS) toward a base rate. The shrink in fintech-wiki/decisions/2026-10-24-futures-data-REQUEST.md "Power case" is not repeated here.carver rule: S = 0.42 (0.84 × 0.5) [I].Power (fintech.claim.p_pass, one-sided p ≤ 0.05, SE 1/√T). All figures below were run on this branch [V]:
``` uv run --locked python -c "from fintech.claim import p_pass; print(p_pass(0.42, 15.5))" # 0.503
```
| Span (years) | 8 (a 2018 split) | 13.5 | 14.6 | 15.5 | 16.5 |
|---|---|---|---|---|---|
| P(PASS) at S = 0.42 | 0.324 | 0.460 | 0.484 | 0.503 | 0.524 |
registry GATES_FROM: p_pass ≥ 0.5). The margin is thin, and nothing here was tuned to clear it: S = 0.42 was fixed above before the span was looked at.fintech-wiki/research/2026-10-25-adaptive-bar.md and option G3-B of fintech-wiki/decisions/2026-10-24-proof-bar-REQUEST.md ("Haircut only … no shrink").claim.p_pass (registry.py _rules), so the gate as coded is met at 0.503.trial()["years"].open (§10 step 4).WARM = 256 sessions and first_scored.claim.p_pass(0.42, span) < 0.5 on the day of the opening, the slice is not opened. E1F then runs forward-only, with "slot": false (§8). S is never revised to clear the gate.sweep.py BAR_Z; oracle bettor, log E grows S²/2 a year, iteration plan §1.2):Data. Daily data per individual outright contract, bought only under a recorded owner grant (fintech-wiki/decisions/2026-10-24-futures-data-REQUEST.md, "Data spec", and the quote draft fintech-wiki/research/2026-10-24-futures-quote-request.md). Fields needed: settlement price, open interest, and contract definitions (expiry, first notice, multiplier, tick value). OHLC and volume are stored but not used by the rule. For the forward record, a daily feed under the same licence is also needed (§11 Q2).
Input schema (strategy.py docstring; inputs() builds it):
contract, date, settle, open_interest:data/internal/tables/futures/daily_pre2010/, warm-up only);data/internal/tables/futures/contracts.parquet (tier 1, no prices): contract, root, cls, currency, expiry, first_notice, multiplier, tick_value, commission.tick_value and commission are in the contract's currency. commission is §5's $2.50 converted at the definitions file's FX date.data/internal/tables/futures/fx.parquet (tier 1): date, currency, usd_per_unit.strategy.py docstring), so zero and negative settlements are ordinary prices: no price ratio or log is taken anywhere.test_sizing_converts_to_usd checks it.Universe (fixed now, by name):
19-Moskowitz2012.pdf journal pp. 231–232]:contracts.parquet. They are taken from the vendor's definitions, the exchange calendars or MOP's "most liquid contract" (journal p. 231), and are committed before any price file is read.WARM). The universe therefore grows as markets list.Both variants decide at each close from data up to that close. strategy.signals executes at the next close, the same lag as E1-prereg §5. The output is a target number of contracts per USD of equity on each root's held contract.
Roll and return chain (shared):
carver (PRIMARY, the verdict variant). This is AFTS strategy eleven with Carver's own defaults.
| Parameter | Value | Source [V unless tagged] |
|---|---|---|
| Volatility | σ_price: EWMA std of daily price changes (price units), span 35, × √252 for annual. Carver's blend with a long-run average is left out [U: its weights were not read] | AFTS PDF p. 204 ("span of 35 days"); price units, PDF pp. 240–241 |
| Trend rules | EWMAC(16,64), (32,128), (64,256) on the back-adjusted price, divided by daily σ_price | AFTS PDF pp. 203–204; the faster speeds are dropped as too costly for expensive instruments (PDF p. 203, n. 120) |
| Trend scalars | 4.10, 2.79, 1.91 | AFTS Table 29, PDF p. 204 |
| Carry rules | annualised carry ÷ annualised σ_price (both price units: an expected Sharpe ratio), EWMA-smoothed with spans 5, 20, 60, 120 | AFTS PDF pp. 240–241 (risk adjustment), p. 247 (spans) |
| Carry scalar | 30, the same for all four spans | AFTS PDF p. 247 |
| Forecast weights | 0.20 for each EWMAC, 0.10 for each carry span (60:40) | AFTS Table 51, row "EWMAC16, 32, 64 / Carry5, 20, 60, 120", PDF p. 268 |
| FDM | 1.29 (7 rules) | AFTS Table 52, PDF p. 269 |
| Cap | ±20 for each forecast and for the combined forecast | AFTS PDF p. 248 |
| Risk target | τ = 20 % a year | AFTS PDF p. 79 |
| Instrument weights | equal risk across the classes present, equal within a class | §3, MOP's groups [I: the user brief's "equal risk across asset classes"] |
| IDM | by the number of eligible roots: 1.00, 1.20, 1.48, 1.56, 1.70, 1.90, 2.10, 2.20 (8–14), 2.30 (15–24), 2.40 (25–29), 2.50 (30+) | AFTS Table 16, PDF p. 135 |
| Position | contracts per USD of equity = forecast/10 × τ × IDM × w_i / (σ_price,annual × multiplier × fx) | AFTS strategy-three sizing [U: the page was not re-read]; FX as §3 |
| Buffer | trade only when the position leaves ±10 % of the forecast-10 position, and then only to the buffer edge | AFTS strategy eight [U: 10 % from memory] |
| Rebalance | daily, through the buffer | AFTS |
mop12 (reported, no decision role). This is MOP's diversified rule, eq. (5) [V, journal p. 236].
Why only two variants.
carver is the one published rule with post-2013 evidence (§2).mop12 is the literal post-publication test of MOP. Its cost is one trial of N.trials.jsonl). It is not revived here.Ported from E1-prereg §6 [V, research/2026-10-14-e1-trend-carry/E1-prereg.md "6. Costs"]. Costs are charged per contract per side on the unrounded research book (strategy._run):
1. Commission and fees: $2.50 per contract per side, all in. It is converted to the contract's currency in contracts.parquet (§3) and back to USD at the day's fx.
2. Spread and slippage: 1 tick per side, at the contract's tick value. Daily data carry no quotes, so this is an assumption [A], not a measurement.
3. Roll cost: a roll is two trades, a sale of the old contract and a purchase of the new. Each pays items 1 and 2 (E1-prereg §6 item 3 [A: a conservative stand-in for a calendar spread]). _run charges it because both contracts' targets change.
4. Stress: all components × 2 (_run(x, w, 2.0)). The PASS rule (§7) needs the 2× mean > 0.
Reported, not gated: gross (k = 0) and 2× Sharpe; cost drag in Sharpe units, gross minus net, against E1-prereg's PF-3 speed limit of 0.13; 3× and the break-even cost multiple.
sealed.toml amendment)The split.
verification.json L04) [V].Proposed amendment block. The orchestrator commits it to sealed.toml on main with the data grant and before the first pull. It is not edited here:
```toml [slice.futures_daily_post2010] source = "futures" # the licensed vendor, named in licences.toml at purchase (decision file of the grant) tables = "futures/daily" # partitions under data/sealed/tables/, listed by tables.open_slice start = 2010-06-01 rule = """Every per-contract daily row (open, high, low, close, settlement, volume, open interest) of every futures contract from the licensed futures vendor, dated from 2010-06-01 to the last session before family 39's forward start (SPEC research/2026-10-25-e1-futures-trend-carry/SPEC.md §8). The ingest writes these rows straight to data/sealed/tables/futures/daily/. It checks only schema, row counts and date coverage per contract, and computes or prints no price statistic. Rows from the forward start on are forward data. Rows before 2010-06-01 and the contract definitions (no prices) are tier 1.""" valid_for = """Futures price mechanisms (trend, carry, curve). Not valid for any mechanism tested on ETF or rate proxies of the same markets: families 1 and 6 saw 2005-2025 ETF analogues (E1-prereg F1; loop 01). Such a family must count their trials (joint_with). The period 2010-2025 is publicly known (it is post-publication, not blind)."""
```
Seen before (disclosed).
The rule is applied to the carver trial's net daily returns from first_scored (the first session ≥ 2010-06-01 at which the book holds every class present, +2 sessions) to the slice end. Before any number is computed, the structural checks are run on dates and definitions only.
1. FAIL (structural, p = 1) if any of these holds:
2. PASS iff both hold:
fintech.stats.spa, the claim series against 0, 10,000 reps, seed 20261025, the default stationary-bootstrap block);3. KILL otherwise.
tier2 event: p = the SPA p (1 on FAIL), and e2 = claim.e_value(p) = 0.5·p^−½.mop12, gross and 2× Sharpe, per-class P&L, and the share of P&L per year and per root. A PBO between two variants that differ by design is not computed (E1's PBO KILL came from near-identical variants, E1 note §6 lesson 2).forward_start event is logged before that day, with start set to it. The record starts whatever the tier-2 outcome; the tier-2 result is recorded on its own.research/<arrival date>-e1f-forward/:spec.toml with family = 39, [grid] rule = ["carver"], [forward] lam = 1.0, decay = 1.67e-4;strategy.py that loads this folder's strategy.py by path and pins its sha256, as S07 v7 does with its screen.dates() and refresh() (the daily feed through fintech.data.Client) are new code. They are plumbing, not rule.fintech.forward.run appends each finished day and never rewrites one. Parity must be ≥ 99 %.fintech.forward, fintech.claim):claim.anytime_p).forward.events also checks decay < the tier-2 mean. If that check fails, the event is written by hand with these frozen values, and the failure is disclosed."slot": false.claim.family_n on the registry at 440 lines) = 27 [V]. The global count rises by 2.claim.slots) [V]. A slot-taking open gives E1F slot 2 in cohort 0: α_0 = 0.025, K = 8.futures_daily_post2010, 1 of 3 for family 39.1. Commit this folder and tests/test_e1f_futures.py (the freeze commit). just check passes.
2. Merge to main. On a clean main the orchestrator appends the family event. The payload is in REGISTER.json (second commit: it holds this file's sha256 and the freeze commit, which cannot sit inside the file they hash). The command:
``` cd <main checkout> && git status --short # must print nothing uv run --locked python -c 'import json; from fintech import fingerprint, registry; e = json.load(open("research/2026-10-25-e1-futures-trend-carry/REGISTER.json")); assert fingerprint.sha256(e["spec"]) == e["spec_sha256"]; print(registry.append(e.pop("kind"), None, **e))'
`` The payload has this form: {"kind": "family", "family": 39, "joint_with": [1, 6], "name": "...", "spec": "research/2026-10-25-e1-futures-trend-carry/SPEC.md", "spec_commit": "<freeze commit>", "spec_sha256": "<sha256 of SPEC.md>", "spec_toml_sha256": "...", "strategy_sha256": "..."}`. If another branch takes 39 first, the number moves to the next free one, in a commit that changes only that number (as family 38 did).
3. Owner grant → data:
licences.toml entry;sealed.toml amendment (§6);fintech.data.Client; rows ≥ 2010-06-01 go straight to data/sealed/tables/futures/daily/;contracts.parquet with the mapping (§3), committed by its sha256.4. Structural checks (§7 item 1) from dates and definitions only, then tables.open_slice(39, "futures_daily_post2010", p_pass=claim.p_pass(0.42, <scored years>), spec_sha256=<SPEC sha256>).
5. python -m fintech.sweep run research/2026-10-25-e1-futures-trend-carry, then collect (2 trials, slice), then the §7 decision as a tier2 event from the same commit.
6. The forward_start event (§8), before the first month-end after arrival.
Nothing in steps 3–6 is authorised by this SPEC: each needs the owner's data grant first.
1. Grant scope. Does the purchase include pre-2010 history (warm-up only here, no trial) and a daily feed? Without a feed there is no forward record.
2. Licence. Will the vendor allow derived results on delta.morphonomos.com? Decision 2026-10-25 item 7 allows numbers only for public data, our own captures or synthetic data. Until the vendor's terms allow display, this family shows its verdict and reason only.
3. Account size. The research book is unrounded. On $100k most bond and grain roots round to zero contracts (E1-prereg §7). An investable rounded book, with micros where they exist, is a later, separate decision.
4. Seen period. Is a PASS on 2010–26 (seen through proxies) worth one opening, given P(PASS) is only 0.50? The alternative is forward-only, with "slot": false, saving the opening for a book (iteration plan M5).
5. Unverified parameters. Carver's vol blend weights and his 10 % buffer were not read this session [U]. Both are frozen as written. Confirming them changes nothing unless they differ, and if they do, the frozen values still stand.
library/papers/method/19-Moskowitz2012.pdf: Table 1 (journal pp. 231–232), vol estimator (p. 233), 40 % sizing eq. (5) (p. 236) [V]library/papers/method/20-Hurst2017.pdf: construction PDF p. 3; average single-market Sharpe ≈ 0.4, PDF p. 5; correlations 2008–14, PDF p. 11 [V]library/papers/method/21-Koijen2018.pdf: Sharpe 1.1, PDF p. 4; nearest vs next-nearest, PDF p. 13; costs, PDF p. 24 [V]library/books/Robert Carver - Advanced Futures Trading Strategies (2023).pdf: PDF pp. 79, 135 (Table 16), 203–204 (Table 29), 247–249, 259, 268–269 (Tables 51, 52), 272 (Table 56), 491–492 (Table 131) [V, pdftotext this session]research/2026-10-14-e1-trend-carry/ (E1-prereg.md, trial-ledger.md) [V]fintech-wiki/decisions/2026-10-24-futures-data-REQUEST.md; fintech-wiki/research/2026-10-24-futures-quote-request.md [V]fintech-wiki/research/2026-10-25-adaptive-bar.md; fintech-wiki/research/2026-10-23-iteration-plan.md §1–2 [V]src/fintech/claim.py, registry.py, sweep.py, forward.py, tables.py [V]1825c857…, and it was never registered. 1. Carry and all signal arithmetic moved to Carver's price-unit form: arithmetic carry, σ in price units, a back-adjusted price, sizing in contracts with USD conversion, and P&L from contract counts. The draft's log and ratio of prices fail at zero or negative settlements. This changes the inputs (an fx column) and the signal arithmetic, not the published parameters.
2. A cost section (§5) was added and the cross-references fixed; the old §5–§10 are now §6–§11.
3. §2 now gives the span dates without pre-2010 data, the 0.35 pp margin over the gate, and the unsigned G3-B basis for dropping the base-rate shrink.
4. Citations: Jumbo results are Table 55 (PDF p. 271); the median vs Jumbo comparison is Table 56 (PDF p. 272); the 0.27 median also appears in Table 54 (PDF p. 270). Table 56 does exist: the review's "does not exist" was wrong.
5. FX: sizing now converts explicitly to USD (§3). The draft sized notional weights in USD on percent returns, which was currency-neutral too, but had no FX input to convert costs.