Legible

Draft. We are still working on this page.

A receipt · quantitative research

Did the backtest's state ever see the future?

A fund shows its allocator a backtest. Every number in it rests on a state built up day by day: a covariance of the market's factors. If that state at any date was shaped by a later day, the backtest saw the future, and its results are worth nothing. Today the fund says it did not, in a document. Here the claim is a receipt anyone can recompute.

Verdict
GREEN every date's state is rebuilt from its own past alone, byte for byte
Dates checked
1,258 of 1,258
The brake test
RED when one future day is folded in on purpose, the record breaks at that date and every date after
Final state digest
be07f3713ccc406cfd6e880a6b92dadedf6950f503e326ebc2bdfd9f897b2472
Who can check it
Anyone, on their own machine, with Python and numpy. Nothing is uploaded.
1 · The record

Real market data, pinned

The daily research factors from the Ken French Data Library: market, size, value and the risk-free rate. 1,259 trading days, 2 January 2018 to 30 December 2022. The vendor's own archive ships inside the kit, fixed by its SHA-256 (af8aec07…), fetched 8 July 2026. The vendor restates its data monthly; this pin is the record.

The dates were taken in strictly increasing order. The history went in the way it happened.

2 · The state at each date

One state per day, built only from the days before it

At each date the state is the geometry of everything recorded up to that date: a covariance of the four factors, made invertible with a small fixed ridge, g = (Σ + 0.01·I)⁻¹. A backtest that reads these states at each date reads only what was known on that date, if each state really was built from its own past.

That "if" is the whole question. It is answered by rebuilding every state from its own past and comparing bytes.

3 · Green

All 1,258 states rebuild exactly

For each of the 1,258 dates, the kit takes the record up to that date, and only that, and rebuilds the state. Each rebuilt state's digest equals the digest the history recorded, with no tolerance: byte for byte. The last one is be07f371….

index 1index 1,258 502 As recorded A future dayfolded in Bad daysdropped later 23 green: the state at that date rebuilds byte for byte · red: it does not
Each row is the same 1,258 dates. Drawn to scale from the kit's published results.
4 · Red, on purpose

A brake test the receipt has to fail

A test that cannot fail proves nothing, so the kit commits the crime itself. It takes 16 March 2020, the worst day in the record's future (market factor −12.01), and folds it into the state for 31 December 2019, index 502.

The digests break at index 502 and at all 756 indices after it. The state moves by max|Δg| 0.2808, about 1.69× the record's own floor of 0.1657, which is what re-entering a day the state already held would cost. Had the history peeked, the green above was impossible.

5 · Two more controls

What else the kit checks, and says plainly

An ordinary future day. A statistically unremarkable later day (20 October 2022) also breaks the bytes at every date after it: detection is byte by byte. But it moves the state by about 0.032× the floor, inside the record's own noise. It changes bytes, not substance, and the kit says so beside the headline.

A cleaned-up history. Drop the five worst days before the peek, after the fact, and the chain fails to rebuild from index 23, the first dropped day, onward. A history tidied up later cannot forge this receipt.

6 · The receipt

One small file anyone can check

The published receipt records the question, the verdict and the two digests: the final state's, and the kit's own. It carries its own SHA-256, so a changed character shows.

{
  "case": "point-in-time",
  "question": "Did the backtest’s state ever see the future?",
  "domain": "quantitative research",
  "register": "detection",
  "status": "frontier",
  "verdict": "valid",
  "geometry_digest_v3": "be07f3713ccc406cfd6e880a6b92dadedf6950f503e326ebc2bdfd9f897b2472",
  "kit_sha256": "982ec9f9ca86bc70c9a93f7056f6a67c4e4e05dea39015d511bb9c739db4aeaf",
  "page": "/point-in-time/",
  "note": "Public register only — the verdict and the two digests already shown on this case. This receipt's own SHA-256 is recomputable here in your browser; the geometry g-digest is recomputable from the kit on your bench. No engine mechanism is disclosed, and nothing here is asked to be taken on trust."
}

Receipt SHA-256 7825b964e9b045eb4f33498fd5be32f2cb4759fc9b078f632c3fb934494c88f6

In Habitat's shared receipt format, the same result is a second receipt that also names what it read (the kit and the vendor's file, each by its SHA-256), the window of dates, and every measure above. Its digest is e6fbe490e840a56329e9d3089b4e2403be03a676352456505ab28643081ec56a.

7 · On the Desk

The receipt opened and checked, the data never sent

The fund runs the kit on its own machine. Its allocator opens the receipt on Habitat Desk, which shows the verdict and checks the receipt in the browser. Desk never accepts the data itself.

The receipt on Habitat Desk: GREEN, the planted peek at index 502, what it read, the receipt digests. CHECK finds it intact and matching the kit as published. Below, a receipt opened from a file, changed after it was sealed, fails CHECK in red.
The receipt on Habitat Desk. CHECK finds it intact, and its kit and final digest match what was published with the kit. At the foot, a receipt changed after it was sealed is opened from a file and fails CHECK in red.
8 · What this does not prove

The limits, stated

Optional

Run it yourself

Most readers can stop above. These two checks are for anyone who wants to see it hold.

  1. Check the receipt here, in this page. Your browser recomputes the receipt's SHA-256 and compares it with the published one. Nothing is sent.
  2. Rebuild every state on your own machine. Ask for the point-in-time kit at habitat.ooo/point-in-time; a person sends it. Then, with Python 3.9 or later and numpy:
    shasum -a 256 recompute-kit-point-in-time.tar.gz
    # must print 982ec9f9ca86bc70c9a93f7056f6a67c4e4e05dea39015d511bb9c739db4aeaf
    tar xzf recompute-kit-point-in-time.tar.gz
    cd recompute-kit-point-in-time
    python3 verify.py --require v3_fsum

    PASS means every state rebuilt byte for byte from the vendor's own archive, the brake test failed where it must, and the final digest is be07f371….