The measures we tested had nothing in common: taker flow, on-chain supply, candle geometry, volatility. No direct link between them. Yet every one failed at the same gate — and that says something more interesting than nineteen separate failures.
The way to find out whether a measure moves before price is to put a lag between them. You compare the measure against price in the same bar (lag 0), then one bar ahead, two bars, eight bars. The shape of the resulting curve tells you everything.
A genuinely leading measure produces a humped curve: the effect grows as the lag opens, peaks somewhere, then decays. That peak is how far ahead of price the measure moves.
None of our candidates produced that hump. Every one of them was strongest at lag zero.
| Candidate | Lag 0 | With lag |
|---|---|---|
| CVD slope | +0.054 | −0.011 (sign flipped) |
| Stablecoin supply | +0.303 | ~0 (peak at 0) |
| Cross-asset (S&P 500) | +0.334 | −0.051 |
| Volume regime | +0.101 | −0.045 |
| Drawdown recovery | −9.58pp | −0.54pp |
They all see it while it happens — not before it happens.
These measures share nothing. Different sources, different quantities. Yet they all move with price at the same time — and there are three distinct reasons why.
The measure already contains the closing price of the bar it's measured on. At lag zero you're looking at the same bar; the resulting link is mathematical, not information about the market.
This group isn't a finding, it's a measurement error — a roundabout way of comparing price to itself.
Both variables are downstream of a third thing. Neither causes the other.
Stablecoin supply is the cleanest example: supply rises and price rises. But neither pushes the other — when demand enters the market, stablecoins get minted and price goes up. The correlation is real, the causation isn't, and neither is the predictive value.
This is the important one. If a measure carried information ahead of price, that information would already be priced in. Everything observable enters price the moment it becomes observable.
A correlation at lag zero is telling you: the market has already processed that information, no delay remains. If any had remained, there would be money sitting there — and someone would have taken it.
This isn't nineteen failures — it's a measurement of market efficiency. We ran an efficiency test without meaning to, and the market passed. Anyone running the same tests would get the same result. The difference is that most people don't look at the lag curve; they see a correlation and mistake it for a signal.
An explanation only becomes useful if it can be applied before the measurement. These three mechanisms became three questions to ask whenever a new candidate turns up:
A candidate that answers "no" to all three isn't worth measuring. This filter comes before the lag curve — before you gather data or spend hours on it.
Looking back, of four candidates we measured in a single day, two would not have passed this filter. They could have been eliminated without measuring.
What's described above is an explanation. And explanations are dangerous, because they can account for any outcome.
Consider: if a measure with a time gap does predict, we say "the structural gap was there, the theory holds." If it doesn't, we say "arbitrage closed it, the theory still holds." Both outcomes confirm the theory.
An unfalsifiable framework carries no information. An explanation only becomes a real framework if it produces a prediction in advance — one that might not hold.
So we turned the anatomy into a rankable prediction and locked it before measuring any candidate:
The longer the structural gap, the further from zero the lag curve's peak should sit.
| Candidate | Structural gap | Predicted peak |
|---|---|---|
| On-chain transfers | minutes – hours | lag ≈ 1 |
| Exchange reserves / netflow | hours | lag 2–4 |
| ETF flows | unclear (reporting delay) | separation required |
| Stablecoin minting event | undefined | diffuse or 0 |
| CVD, candle geometry, recovery | zero | 0 — as observed ✓ |
Why does an on-chain transfer have a gap? Because the timestamps separate: coins are sent to an exchange → the block confirms → the holder decides to sell → the order goes in. Those are distinct moments. CVD has no such separation — a taker buy is the transaction. Measurement and event are the same instant.
These were written in advance too. If any of them occurs, the anatomy is declared wrong or incomplete:
A candidate being rejected does not falsify the anatomy. The anatomy doesn't claim "these candidates work"; it claims "if there's a gap, the peak sits further out." A candidate with a weak effect but a peak in the right place: the candidate fails, the anatomy passes. Two separate questions.
The anatomy's own rule says: no verdict until at least two candidates have been measured. So far one has.
Exchange netflow (structural gap: hours, predicted peak: 2–4) failed three of five gates — unstable sign, null test not cleared, direction flipped in a disjoint window. As a candidate it was rejected.
But the anatomy asks a different question: where was the peak? Not at lag zero — at lag 1. Slightly below the predicted range (2–4), but away from zero.
That alone isn't confirmation. The real test comes when the strongest candidate — on-chain transfers — is measured. That measurement hasn't been done yet.
The ranking, the rejection conditions and the confirmation criterion were written before measuring and cannot be changed. If the anatomy is rejected, that gets published too — there will be no "but it holds if you look at it this way." The value of an explanation lies in its ability to be wrong.
Does volume profile create support? — the first article in this series: a candidate that passed the null test and collapsed under a volatility control.