mean-reversion-24h

Pre-registered evaluation report · generated 2026-08-18T18:45:19.747832+00:00 by nullbar 0.6.0

1The frozen registration

Registered2026-08-18T18:44:54.484739+00:00
Fileexperiments/mr24.json
sha256ab75e78262c94949b79cbc89e9907050b08bda60c4772c7728f882beed37d6fb
Test look spent2026-08-18T18:45:19.596663+00:00
Look bound to this fileyes
Registered cell budget64

The sha256 above is of exactly the text below, with no trailing newline. Re-hash it to confirm the design and the bar are the ones that were frozen.

{
  "bar": {
    "gross_2x_cost": {
      "metric": "gross",
      "op": ">=",
      "value": 0.46
    },
    "null_flat": {
      "metric": "null_max_abs_t",
      "op": "<",
      "value": 3.0
    },
    "t3": {
      "metric": "t",
      "op": ">=",
      "value": 3.0
    },
    "year_2022_positive": {
      "metric": "y2022",
      "op": ">",
      "value": 0.0
    }
  },
  "cells_budget": 64,
  "created_at": "2026-08-18T18:44:54.484739+00:00",
  "design": {
    "cost_pct_rt": 0.23,
    "hold_bars": 24,
    "oos": "excl 2024-10-01..2026-01-01",
    "signal": "dist_ma168 <= expanding shifted q10",
    "universe": [
      "BTC-EUR",
      "ETH-EUR",
      "SOL-EUR",
      "XRP-EUR",
      "ADA-EUR",
      "LINK-EUR",
      "LTC-EUR",
      "AVAX-EUR"
    ]
  },
  "hypothesis": "bottom-decile dist_ma168 vs own history mean-reverts over 24h on the 8-symbol EUR universe",
  "name": "mean-reversion-24h"
}

2The search

Trials on the ledger64
Ledgerexperiments/trials.jsonl
Registered cell budget64
Over budgetno
Sharpe spread across trials (variance)0.013397

Deflation counts cells the way |t| does: a signal tested long and short is one two-sided cell, not two. Cells used below: recorded on the test look.

3The null control

Machinery verdictyes
Composition-matched expectation0.0975
Worst |t| vs that expectation2.5627
Unconditional hold, same clustering0.0960
Seeds3
Measuredyes

A machinery check, not an edge: it asks whether the pipeline invents an effect on scrambled returns beyond what the assets it holds pay unconditionally.

4The held-out result

Trades1,815
Clusters (the unit of inference)560
Gross, per trade0.2347
Cluster mean0.5969
Clustered t2.4159
YearMean per block
2019-0.7368
2020-0.4368
20211.4604
2022-0.6160
20230.5439
20240.6392
2026-0.0555
Unconditional hold, same clustering0.0960
Hold clusters2,178

5Fill realism

Fill assumptionnGross
assumed23,8720.0148
touch22,977-0.0354
through22,081-0.0637
Touch / assumed-2.3920

Under resting-fill pricing this record has no gross left to haircut: the touch leg is negative. The ratio above crosses zero and is not a fraction that survived.

The entries that never fill are disproportionately the good ones, so the assumed row is an upper bound on what any of this could have executed at.

6Deflation

Cells searched32
Degrees of freedom (clusters − 1)559
Observed |t|2.4159
Noise clears this 5% of the time (95th pct)3.1736
Median of the noise maximum2.3095
Observed clears the 5% lineno
Deflated Sharpe probability0.0000

The record claims 32 cells against 64 ledger rows (two-sided pairing counts one cell per signal tested in both directions); the threshold below is the smaller, weaker deflation. Thresholds are simulated at report time from the recorded cell and cluster counts (100,000 draws, seed 0) — seeded, so they reproduce. Sharpe: recorded. Deflated Sharpe: recorded. The MEAN of the noise maximum is not a bar — pure noise beats its own expected maximum about 45% of the time. The 5% line is.

7The bar, as graded

ConditionAs registeredObservedGraded
gross_2x_costgross >= 0.460.2347computed from the recorded metricsFAIL
null_flatnull_max_abs_t < 3.02.5627computed from the recorded metricsPASS
t3t >= 3.02.4159computed from the recorded metricsFAIL
year_2022_positivey2022 > 0.0-0.6160computed from the recorded metricsFAIL
Cells registered64
Cells spent64
Within budgetyes

Graded against the file on disk. Unregistered conditions are ignored: adding one until something passes is the failure this library exists to prevent.

8Anchoring

WhatCommitCommitted (self-reported)Seen by remote
registration4f36b2f505502026-08-18T20:44:54+02:00noneIN HISTORY
test_look9134410043b32026-08-18T20:45:19+02:00noneIN HISTORY
Registration and test look in different commitsyes
Registration commit precedes the test lookyes

Local only. No remote branch contains these commits, so nothing outside this machine has seen them and the whole history could be rebuilt in a minute.

What a git anchor proves: that the bytes committed are the bytes graded, that the registration commit precedes the test-look commit, and that both are still reachable from HEAD. What it does NOT prove: wall-clock time — commit dates are self-reported and one environment variable forges them, so only a push to a host the researcher does not control was witnessed by anyone else. It also cannot show that the researcher had not already seen the test window: ordering of documents is not ordering of knowledge.

9The rest of the record

assumed_gross0.014808
dsr0.000025
fill_haircut-2.391981
hold_gross0.096029
n_cells32
null_expected_gross0.097509
null_max_abs_t2.562709
null_okyes
sr0.102092
through_gross-0.063713
touch_gross-0.035419
y2022-0.616050

Every remaining top-level entry of the test-look payload, so nothing recorded is hidden by this rendering.