← Work
04  ·  Research  ·  Ongoing

Genesis.

A measurement system for financial markets. Pre-registered experiments, a trial ledger that cannot be edited, and eight findings that hold up.

Genesis is a measurement system for financial markets. It establishes what is true about a market from data it has verified itself, with every test declared before it runs and counted afterwards.

The instrument came before the questions: a recorder whose completeness is proven against an independent channel, experiments frozen with a checksum while the data they will use does not yet exist, and a ledger that becomes permanent the moment a question is asked.

In two months it produced eight findings. Three about the data everyone uses, four about the market itself, and one about the limits of what can be known at all.

What it took
3,983,271
Bars verified, not assumed
3
Defects found in public data
27
Trials, each declared first
68 years
History the last question needs
291 ms
Measured latency floor
100%
Order-book sequence contiguity
Python, NumPy, SciPy  ·  ~10,000 lines of code and an equal volume of written record

01  ·  The Question Nobody Asks First

The first thing worth measuring is what it costs to be right.

Fees, spread, market impact and latency all subtract from an edge before it reaches you. Measure that subtraction and you learn the accuracy any strategy must clear at each horizon — a floor that exists whether or not anything predictive is ever found. It is arithmetic, it can be established before a single search begins, and it decides which questions are worth asking at all.

Measuring the cost of being right is unglamorous, and it decides everything that follows.

02  ·  The Data Was Wrong

Before measuring anything I required myself to verify the source against the raw bytes rather than assume it. It felt like a wasted day. It found three things, and each one had already produced a wrong answer.

Bars truncated by trading halts. Binance publishes a short final candle at the instant trading stops, unflagged. One spans 13,524 milliseconds with zero volume, followed by 61 missing bars. Across seven years: 22 halts, 4,089 missing bars. Aggregate across one and you compute a return spanning the halt as though it were a minute.

A field that is simply wrong. close_time is unreliable in the bulk archives — one bar spans 54 seconds with 1,124 trades and no gap after it. An earlier version of my own verifier tested alignment through that field and rejected a perfectly good file.

A silent unit change. Binance switched the spot archives from millisecond to microsecond timestamps. Same layout, same format, three more digits, documented nowhere.

2024-12 2025-01 spot 1733011200000 ms 1735689600000000 us futures/um 1733011200000 ms 1735689600000 ms

The futures archives never switched. The two feeds have used different time units for the same period ever since — so anyone joining spot and futures history after 2024 is aligning two series a factor of 1,000 apart, and nothing anywhere raises an error.

All three produce a plausible wrong answer instead of a failure. That is the expensive kind, and no amount of clever statistics downstream will find it.

03  ·  Freeze the Question Before You Can See the Answer

Every experiment is written as a contract and frozen with a checksum before the data it will use exists. The questions, the grid of parameters, the predictions, the falsification criterion for each, and the condition under which the whole line gets abandoned.

The reason is written into the contract itself. A calibration run had already suggested roughly a third of a certain advantage was being lost — and knowing that number in advance is precisely the condition under which writing predictions down is worth something.

At 30% the result reads as confirmation. At 80% the temptation is to find a reason the sample was unrepresentative. Recording the prediction first removes both moves.

Nothing in a frozen grid may be adjusted after seeing a result. It is a grid rather than a choice precisely so that no price, time or size is ever selected — because a selected order is a strategy, and this is not one.

04  ·  Count Every Test, Including the Abandoned Ones

Run two hundred tests and several will look brilliant by accident. The only defence is an honest count of how many were run — and a count assembled after the searching has begun is fiction, because by then the abandoned tests are unrecoverable.

So every statistical test is declared in an append-only, hash-chained ledger before it runs, and recorded afterwards with its result. A declared trial with no result stays visible forever as outstanding. Deleting or editing a past declaration breaks the chain.

You cannot un-declare. Running twenty tests means twenty declarations exist, and the eighteen that failed are as permanent as the two that worked.

Corrections sit on top of the count: Benjamini-Hochberg for false discovery, and a deflated Sharpe ratio that penalises a result by how many attempts preceded it. Descriptive measurements are recorded separately as context, so the boundary between looking and claiming is itself auditable rather than remembered.

05  ·  What It Costs to Be Right

For a decision that risks and captures a comparable amount, the accuracy you need to break even is:

p* = 1/2 + c / (2 · φ · m) c round-trip cost φ capture fraction m move size

Cost sits in the numerator, so it sets the bar directly. Run it across horizons and fee tiers and the answer is a map of where trading is affordable at all — independent of whether anything predictive exists.

Affordability begins at four hours. Below that, costs consume any plausible edge.

Then the other half: is there structure to act on? A variance ratio tests whether prices depart from a random walk — the general form of the question every technical indicator is a specific answer to. There is structure, at 15 and 60 minutes, consistent across eight of eight years.

Structure lives at minutes. Affordability starts at hours. They do not meet.

At one hour you would need to be right 66.9% of the time. The structure actually present is a variance ratio of 0.893 — real, well-powered, and nowhere near enough to deliver two thirds.

06  ·  Finding the Bug in My Own Statistic

The variance-ratio implementation carried a stray factor in its test statistic. On real data it produced a ratio of 0.38 that went unrejected at p = 0.86 — a large, obvious effect reported as nothing at all. It sat there for a week and looked entirely reasonable.

It was found by running every estimator against synthetic series built with known answers first: a pure random walk must return one, a constructed mean-reverting series must return the value it was constructed to have.

On real data a wrong answer looks exactly as reasonable as a right one. There is no ground truth to check it against — which is why you have to bring your own.

The same practice later caught tests of mine that passed vacuously — assertions guarded so that zero observations counted as success. A test that can pass without testing is a green light over nothing.

07  ·  The Wall

The first write-up concluded that structure and affordability do not overlap. A power analysis run afterwards showed that the second half of that claim was not supported by its own evidence, and the document was corrected to say so.

At four hours and beyond, the measurement sits inside the zone the study could never have resolved. The failure to find anything there is absence of evidence, not evidence of absence. So how much history would settle it?

horizon have for 80% power vs VR 0.95 4h 7.6 y 12 years 1d 7.6 y 68 years 3d 7.6 y 153 years

Sixty-eight years of this instrument does not exist and never will. It is seven years old.

That is not a gap to be closed by working harder. It is a boundary on what this route can ever resolve — the same kind of fact as the 291 millisecond latency floor measured between Nairobi and the exchange.

Correcting my own headline finding was the most valuable thing the project produced. It is also the only reason the remaining conclusions are worth anything.

08  ·  Everything Is Being Competed Away

Four short studies, run against the same verified data, asking unrelated questions. Each was recorded as descriptive context rather than a counted trial, because none of them tests a hypothesis — they describe.

They found the same shape.

2020–21 now minute-scale reversion 8.4 se 0.5 se funding carry, annual 30.6% 1.94% volatility predictability R² 0.50–0.60 R² 0.26–0.39 residual cross-section 22–23 bets 16–19 bets

Three of the four collapsed by an order of magnitude or to nothing. The fourth — how many genuinely independent bets exist across thirty instruments — narrowed by a fifth and survived.

A methodological finding fell out of this that I now apply everywhere: the pooled number was misleading in every single study. One hid a sign flip between years. One inflated an R² by including between-year variation. Both looked precise. Precision over a non-stationary series is not accuracy.

Three unrelated measurements, one shape. The obvious things are being arbitraged out of the market, and you can watch it happen year by year.

09  ·  What It Found

Eight findings, each measured rather than argued, each reproducible from the repository.

About the data everyone uses 1 Bars truncated by trading halts, unflagged — 22 halts, 4,089 missing bars 2 close_time is unreliable in the bulk archives and rejects valid files 3 Spot switched to microsecond timestamps; futures did not — the two archives have disagreed by a factor of 1,000 ever since About the market 4 Affordability begins at four hours; below it, cost consumes any plausible edge 5 Minute-scale structure has a lower boundary as well as an upper one — below five minutes the series is a random walk to four decimal places 6 Volatility stays predictable where direction does not: R² 0.26–0.39 out of sample, in every year, against 0.00 for direction 7 Thirty perps are ~2 independent bets directionally and ~24 once the market factor is removed — the asymmetry is the whole opportunity About the limits 8 Settling the daily horizon needs 68 years of a seven-year-old instrument

And running underneath all of them, a pattern nobody was looking for: three unrelated measurements decaying on the same schedule. That is a market maturing, and it is visible year by year rather than argued about.

Whether any of this becomes a position is a separate question with a separate answer. What Genesis produces is the map — where the ground is solid, where it cannot bear weight, and where no amount of further work will ever tell you.

Every one of these was available to anyone with the same public data. What was missing was the apparatus to establish them and the discipline to believe the result.

Measurement first. Everything downstream of a wrong number is a wrong number.

Key Decisions

Three choices that made the null result trustworthy.

Decision 01
Build the instrument before the experiment

The recorder, the fill simulator and the trial ledger were built and tested before there was anything to measure. The recording it produces holds 100% order-book sequence contiguity across seven days and repeated network loss, and its data-completeness labels are validated statistically against an independent channel rather than asserted.

Building the ledger first is the only moment at which it can be built credibly. Afterwards, the tests you quietly abandoned are already gone.

Rejected: measuring first and formalising once something looked promising
Decision 02
Publish the test that was discarded

A natural-looking check on the data — that each bar opens where the last one closed — fails for 51.8% of adjacent bars. That is ordinary market behaviour, not misalignment, and using it as a validity test would reject every correct file.

It is published alongside the three real defects. Anyone verifying this independently will reach for exactly that check, and the discarded test is most of what makes the other three trustworthy.

Rejected: reporting only the checks that worked
Decision 03
Record what is not known, as data

Gaps in a recording are labelled, never interpolated — an invented bar is an invented observation. Intervals the recorder cannot vouch for are excluded by a rule fixed in advance. Every figure derived from incomplete observation is reported as a floor with its coverage stated.

The same discipline runs through my production work: a monitoring product that reports what it did not see is the only kind whose numbers can be repeated to someone who disagrees with them.

Rejected: filling gaps to produce a continuous series
Built with
Python NumPy SciPy pandas statsmodels websockets Hash-chained event log Moving-block bootstrap Benjamini-Hochberg Deflated Sharpe
Repository → The three defects, in full →

If this way of working resonates —

No brief required · Tell me what you’re trying to make