AI-First Crypto Trading Principles
An optimistic backtest can show Sharpe 5 where live reality is negative, and an AI-first crypto trading system graded by it will optimise into the gap with total conviction — because inside that simulator the strategy genuinely works.
The simulator is not a test. It is the model's reward function. That is the sharpest trap I know, and the rest of this post is what I found while walking into it.
Here is the shape of what I found. Give a router a third action — quote, cross, or abstain — and it takes the third. Doing nothing scores zero; every alternative scores less; and zero wins 11 of 11 panels without the signal being consulted at all. The fitted policies that do trade pick about 1.6% of rows and still end below zero. A model that has learned to almost-not-play is not broken. It is reporting the absence of an edge — the one output no trade-count metric will ever reward.
Everything that decides whether such a system makes money on a perp lives in the coupling between model and market: fees, funding, regime, and the evidence you are willing to accept. A round trip costs 4–14 bps before the model says a word.
I went looking for that edge at sub-minute horizons and did not find it. What the search produced instead was thirty-eight principles about how to run a model against a market — each ending with the condition that breaks it, each carrying the measured number behind it, and several carrying the number that killed an earlier version of the same claim. They are worth more than the strategy would have been.
Where these come from
Every first-person number below was produced by a named experiment in my own tree, and the appendix quotes each experiment's own figures, so any number here can be traced back to the run that produced it. They come from a research programme aimed at sub-minute perpetual-futures trading, which the arithmetic closed — against a maximum gross of 1.4457 bps anywhere measured, break-even needs a taker fee — the charge for crossing the spread rather than resting an order — of 0.8078 bps per side at best, against a 1.7 bps published floor and a 5 bps VIP0 charge. The principles are what survived that result, and none of them depends on it. The screen I used on the codebase is a two-leg removal test: delete the AI and the claim must go vacuous, delete the market and it must go inapplicable. Run over my own tree, 0 of 108 modules survived both legs. Some of the principles below pass that test and some are plain measurement discipline that would hold without a model in the loop; I have not pretended otherwise. Everything below is enforced in a running system or measured in one, and the numbers are mine unless a paper is named.
I. What the market does to the model
Edge is denominated in fees, and the model inherits the denomination
Before any model runs, the venue has already priced the game. On a Binance USDT-M perpetual at VIP0, maker is ≈2 bps a side and taker ≈5 bps (published fee schedule). The full round trip therefore lands between 4 and 14 bps depending on the leg mix: maker-in/maker-out ≈4–5 bps, maker-in/taker-out ≈8–9, taker both ways 12–14.
My minimum-viable-edge rule is pinned to the maker leg, because that is the leg the strategy is built around: an expected move must clear 1.5× the 5 bps maker round-trip hurdle, which is a 7.5 bps viability threshold written into the gate as a constant so it cannot be argued down after the fact.
The trade geometry is a separate choice and a more conservative one — +15 bps take-profit against a −6 bps stop. Its realised numbers come from the fee table rather than from the rule: a maker-exit win nets 15 − 4 = +11 bps, a taker-exit loss nets −6 − 9 = −15 bps, and breakeven is therefore 15/(11+15) = 57.7%. Note which way the conservatism runs. The gate would admit an edge of 7.5 bps; the geometry only pays out at 15.
It is tempting to file this under costs and move on, but the market-design literature says it is closer to the rules of the game. Budish, Cramton and Shim (2015) argue that the continuous limit order book is not a neutral venue but a mechanism whose arms race is structural. Their proposed replacement is frequent batch auctions — uniform-price double auctions run roughly every tenth of a second. The fee schedule is the visible surface of that mechanism.
Nor should you expect it to improve on its own. Budish, Lee and Shim, modelling exchange competition and the rents from selling speed, find a wedge between private and social incentives to innovate. That wedge "supports the persistence of an inefficient market design in equilibrium." The venue's economics are not a transient you can wait out.
Even in slower asset classes the erosion is severe. Implicit market-impact costs "may substantially erode a strategy's expected excess returns," in Li, Chow, Pickard and Garg's accounting for factor strategies. A high-turnover strategy pays that toll on every one of far more round trips.
The AI-first consequence is that this arithmetic is not advice the model receives. It is the shape of the model's vocabulary. My proposer may move exactly three numbers. Their walls were computed from the fee table before any model was ever called: tp_bps in [10, 25], sl_bps in [4, 10], time_stop_s in [20, 120]. A proposal outside a wall is refused by name, never clipped. The AI cannot propose the trade the fee schedule already killed, because the fee schedule was compiled into its cage.
There is a cleaner way to state how binding this is, and it took two hundred iterations to think of asking. Rather than raising the forecast until it clears the toll, invert the requirement and ask what toll the forecast I actually measured would clear. Fitting the correlation separately at each horizon — on a non-overlapping stride, so the sample count is honest — it decays +0.24653 at one second to +0.15401 at ten, +0.07162 at sixty, +0.03656 at three hundred and +0.04448 at nine hundred, resolving against its own error bar only at the first two. The feasible toll runs 0.17414, 0.34250, 0.30710, 0.23569 and 0.70420 bps against a 3.4 bps incumbent, and clears on 0 of 7 instrument-days at every horizon. The best point on the curve is ten seconds, and it is 9.9× short. That is a far more useful sentence than "the edge was too small", because it names the quantity that would have to change and it is not one a model can touch.
The first version of that inversion is also worth keeping, because it was wrong in the most seductive way available. It borrowed a single one-second correlation and reused it across horizons, and at nine hundred seconds that produced a row which formatted like the first profitable configuration in two hundred and eight iterations. Fitting the correlation where the row actually lives gives +0.04448 against the borrowed +0.24731 — wrong by 5.6×, and unresolved besides. A number carried sideways into a horizon it was not measured at will not announce itself; it will look like the result you were hoping for.
One honest adjustment in the other direction, measured on the way: the sub-minute volatility exponent is +0.5399 and +0.5371 across 0.1 to 900 seconds, slightly above the random-walk 0.5 the arithmetic had assumed. The short end is marginally kinder than I had been treating it. It moves the wall; it does not move it 24-fold.
Breached when the model's proposal space contains geometries that lose to fees — or when a band is widened without redoing the fee arithmetic that set it.
The queue you are standing in evaporates; it does not trade
Every fill-rate estimate I had made rested on a picture of the queue draining through trades, with my order advancing as the orders ahead of it get executed. That picture is wrong by an order of magnitude. Decomposing depth changes at the touch shows 94.1% to 97.9% of depletion is cancellation, not trade — 0.9785 on BTCUSDT, 0.9696 on ETHUSDT, 0.9616 on XRPUSDT, 0.9414 on DOGEUSDT — and the touch churns 1.48× to 4.56× more depth than trades through it. The queue ahead of you mostly leaves without ever transacting.
The first consequence is that a correction I expected to be small is instead indeterminate. Admitting cancellations relaxes the fill-rate bound to 0.0424 / (1 − c), and at these values that expression saturates at 1.0 on three of the four instruments. It does not raise my fill rate by some modest amount; it stops constraining the fill rate at all. What the data would need in order to say anything is queue position — where my order sits among the orders ahead — and a best-bid-offer feed does not carry it. A bound whose generous version is vacuous is not a bound, it is a statement that this dataset cannot answer the question.
The second consequence is worse, because it runs the opposite way from the one I assumed. These are stages of one correction rather than competing claims, and the order matters: ignoring the queue entirely gives a fill rate of 0.496; requiring the queue ahead to clear by trading cuts it to 0.034; admitting that it also clears by cancellation pushes it back up, into the region where the bound stops binding. So cancellations raise the fill rate relative to the trade-only model — the queue clears faster than trades alone would clear it, and I get filled more often than that model implies. With a per-fill edge measured at −0.72 bps, more fills is not good news. Ignoring cancellations therefore understated the loss, which makes the earlier figure an upper bound on the maker's result rather than a lower one. A conservative assumption is only conservative with respect to a particular axis, and on this axis mine had been flattering me the whole time.
The follow-up experiment is worth reporting because it failed instructively. I ran a check on whether mid-interval refilling inflates that 96% share, and it returned agreement to five decimal places on all four instruments — a change of 0.00000. That looked like strong corroboration and was nothing of the kind: the correction is algebraically identical to the original formula, verified to 1.776 × 10⁻¹⁵ over 100,000 random pairs. Four agreements to five decimals were one tautology reported four times. The hazard it was built to measure remains unmeasured; what the run established is that the proposed check could never have measured it.
It did surface something real, and the honest label for it is hypothesis. Only 2.05% to 3.84% of decreasing intervals have trades exceeding depletion, and those few intervals carry 57.3% to 73.2% of all trade volume in decreasing intervals — trading at the touch concentrates in exactly the moments when the level is refilling faster than it drains. It was not pre-registered, it fell out of a clipping step, and it belongs in a designed experiment rather than in a conclusion.
The literature has been pointing at the missing variable for years. Donnelly and Gan show how a limit order's position in the queue governs the decision to cancel or rest, using ultra-high-frequency Nasdaq data — the decision my feed cannot inform. Muni Toke's treatment of the order book as a queueing system builds the lifetime distribution of cancellations directly into the model rather than treating them as noise around the trades. Both are describing the same fact from the other side: in a modern book, cancellation is the dominant dynamic, and a model that treats it as a correction has mistaken the main term for a perturbation.
Breached when a fill-rate estimate assumes the queue ahead clears by trading — or when a relaxed bound is reported without checking whether it saturates, so a vacuous interval reads as a generous one — or when a correction is called conservative without naming the axis it is conservative on — or when agreement between two formulas is treated as corroboration before checking they are not the same formula.
A longer horizon buys beta, not edge
When cost dominates a signal, the reflex is to hold longer. Fees are charged per round trip and the move should grow with time, so somewhere out along the horizon axis the arithmetic ought to flip. It does flip. It flips for the wrong reason, and the way it flips is the most expensive near-miss in my record.
I swept the holding horizon and the table read like a solved problem. Gross per fill runs −0.7512 bps at 800 ms, −0.6876 at 10 s, −0.7126 at 60 s, then turns: +0.3965 at ten minutes, +2.7464 at one hour, +8.3162 at six hours. The six-hour cell clears the 3.4 bps round-trip toll — the first and only cell in the entire investigation to do so — at a t-ratio of 35.7.
It is beta. On 2024-03-28 the market moved +187.8 bps; on 2024-03-29 it moved −132.0. Decomposed against that drift, the six-hour cell is 99.0% market and 0.0831 bps of residual, and the residual does not resolve. At one hour it is 88.3% market; at ten minutes, 50.1%. The apparent edge was the market's direction arriving inside my holding period, sampled by a strategy that happened to be holding.
The selection underneath it is the part worth stealing. The rising day produced 89,750 fills against the falling day's 60,708 — 48% more — so the fill-weighted drift is positive even though the two days nearly cancel. A strategy does not sample days uniformly. It samples them in proportion to how often its own conditions fire, and those conditions fire more when the market is moving its way. Beta does not arrive as an obvious market-long position. It arrives as a sampling bias in which days you traded.
What survives the decomposition is the actual answer, and it is flat. The residual reads −0.7424 bps at 800 ms, −0.7076 at 10 s, −0.7719 at 60 s — resolved at 73.8×, 25.0× and 12.2× its own bar — and stays flat across a 75× horizon range. That is the signature of a fixed cost, not a decaying signal.
The cost has a name and a fifty-year-old derivation. A resting order is filled by whoever wants to trade against it, and that population is enriched in people who know something you do not — so the fills you receive are worse than the fills you would have chosen. Glosten and Milgrom (1985) derived the entire bid-ask spread from that mechanism alone, with no inventory cost and no transaction fee: the maker must charge the uninformed enough to survive the informed. The modern instrumented version is order-flow toxicity, formalised as VPIN, which measures how adversely selected a given flow is rather than assuming a constant.
My own number is that constant, measured: adverse selection costs about −0.72 bps paid at the fill, flat across the whole horizon range, and everything above it was the market. The best residual anywhere is +0.3202 bps at one hour, which is 10.6× short of the toll and only 1.10× its own error bar, on two days.
So the horizon lever does not work, and it fails in a way that would have published. A sweep across horizons is a search, and the cell it returns is the one where beta is largest — reported with a t-statistic that grows as the contamination grows. A t of 35.7 on an unadjusted number is not strong evidence. It is a very precise measurement of the market.
The correction is procedural rather than statistical, and it is cheap: a directional claim names its horizon, its raw figure, the benchmark, and the benchmark's unconditional move over the same window. The literature has had the machinery for this for years — Liu, Liang and Cui identify market, size and momentum as common risk factors across 78 cryptocurrencies, and a return not adjusted against at least the market factor is not a result about a strategy. What is new here is only how fast an automated sweep finds the contaminated cell and hands it to you with a compelling t-statistic attached.
Breached when a horizon sweep reports its best cell without decomposing it against the benchmark's unconditional move over the same window — or when a rising-market sample is allowed to contribute more fills than a falling one without that asymmetry being measured.
A signal can be real, transferable, and still an order of magnitude too small
For most of this investigation the binding constraint was the sample: two days of book data could not resolve the effects being argued about. That changed when I acquired 1,247 days of one-minute bars for ETHUSDT and BTCUSDT — 2023-01-01 to 2026-05-31, 1,795,680 rows each, 0.0% of minutes missing. The resolution floor at a ten-minute horizon fell from 0.1463 to 0.00829, which is the first time in this work that the thing standing between me and an answer was the market rather than the data.
So the question became answerable, and the answer was yes. The ten-minute forward return is forecastable out of sample: 11 of 12 chronological folds positive, median correlation 0.0199 on ETHUSDT and 0.0212 on BTCUSDT, about 2.4× the 0.0083 resolution floor. That is the first well-powered return result in the entire investigation, and it is positive.
It also transfers, which is the test that usually kills a fitted signal. BTCUSDT's ten-minute coefficients, applied verbatim to three instruments they were never fitted on, come back positive in 9 of 9 held-out cells across three balancing schemes. Under the strictest of those — net exposure held at exactly 0.500 long, so market drift cannot contribute anything — 21 of 24 folds are positive.
Now the arithmetic that ends it. Against a 3.4 bps round-trip toll, the ten-minute edge is 7.9× to 9.7× too small, and the transferred version runs a median 0.1342 bps against that same 3.4 — 25× short. Sweeping seven horizons from ten minutes to twenty-four hours does not rescue it: no horizon is both profitable and resolvable, and the best edge-over-toll ratio anywhere is 0.429, sitting 12× below its own detection bar.
None of this is unusual as a magnitude. Return predictability in equities lives at correlations of the same order, and the argument that such a signal is worth anything at all is an old one — Cochrane's defence of return predictability rests on what a near-zero coefficient implies rather than on a large one. The difference is that an equity investor holding for a quarter pays the toll once, and I would pay it every ten minutes.
I want to be precise about the shape of that result, because "the signal is real but too small" is a different finding from "there is no signal", and only one of them is what I measured. A real signal that misses by 8× is not evidence of a market inefficiency waiting for better execution. At that ratio the cost would have to fall by an order of magnitude, and no fee schedule available to me does that.
The sweep also produced the sharpest methodological lesson in this whole corpus, by nearly fooling me. Edge appeared to climb with horizon, and two symbols independently produced a crossing point at 19.9 and 21.0 hours — the kind of agreement that normally settles an argument. It was agreement about a shared artefact. At long horizons the forecast simply goes one-sided: the long fraction runs 0.46–0.63 at ten minutes and 0.94 to 1.000 at twenty-four hours, and the residual is exactly 0.0000 at twelve and twenty-four hours because sign(prediction) has become constant and the strategy is the benchmark. Both models degenerated the same way, which is precisely the failure independent confirmation is supposed to rule out.
Two limits belong with all of it. One-minute bars cannot see the spread, so nothing here prices execution — it establishes that a signal exists worth executing, and a correlation that cleared the bar would still have to survive the touch. And the 3.4 bps toll is an assumption carried forward, not a measurement — one that has never been verified against the venue. It also sits below the 4 to 14 bps the published schedule implies for a real leg mix, so every "N times short of the toll" figure in this post, including this one, is computed against a hurdle that is generous to the strategy. The true shortfalls are larger than the ones quoted.
Breached when a resolved signal is promoted without dividing its size by the cost of acting on it — or when two models agreeing is treated as independent confirmation before checking whether they degenerate the same way.
The trade's sign is an experiment, not a parameter
My strategy template enters after a liquidity sweep — a burst of aggressive orders clearing one side of the book — and follows it, betting on continuation. The best live evidence on the venue says the money is in counter-trading it — reversal. That disagreement is genuine and current. It is also exactly the kind of question an AI operator will try to resolve by quietly flipping a parameter. So the sign is structurally not proposable. direction carries no clamp band, and the proposer's no-band branch refuses it by name the moment a proposal mentions it.
The reason a flip cannot be a tuning step is arithmetic, and it is easy to get wrong. Long gross is dmid − 2·half; short gross is −dmid − 2·half. Inverting the signal reflects the mid move and keeps the cost — the round-trip spread is paid in both directions. So a large negative result is not a large positive result waiting to be turned around. It is mostly the cost, and the cost does not have a sign.
I have the measurement that makes this concrete, and it is a trap I would otherwise have walked into. On XRPUSDT, CVD comes back resolved negative in 10 of 10 cells, at −1.4073 to −1.7343 bps — which reads irresistibly like an inverted edge of the same magnitude. It is not. XRPUSDT's round-trip spread is 1.6076 bps, so the mid move actually hiding behind that −1.4073 is 0.2003 bps.
Flip the signal and the best short gross is −1.4809 bps: still negative, because you kept the spread and gained two-tenths of a basis point. Across all four instruments the best short gross is +0.0423 on BTCUSDT, −0.0158 on ETHUSDT, −0.0427 on DOGEUSDT and −1.4809 on XRPUSDT. The short side is worse than the long side on three of four, and the single positive is 80× short of the 3.4 bps floor it would need to clear.
The underlying signal is real, which is what makes the trap live rather than academic. Cont, Kukanov and Stoikov (2013) established that order flow imbalance relates linearly to price change over short intervals. The slope is inversely proportional to market depth. The result holds across time scales, stocks and intraday seasonality. Volume imbalance predicts the sign of the next market order on Nasdaq data, and HFT trading direction predicts price changes over seconds while correlating with book imbalance.
Against that, The Market Maker's Dilemma — a live experiment on the Binance BTC perpetual — concludes the opposite for a maker: counter-trade the imbalance. Both can be true. Direction-of-price and profitability-of-a-resting-order are different questions, and the depth-scaled slope means the same imbalance implies a different move on a book of a different thickness. So the sign gets settled the only way a sign should: one pre-registered experiment, continuation and reversal as each other's control, spending one holdout read, on my venue at my latency. Until that run, both templates exist and neither is believed. The model may move numbers inside declared walls.
The model may move numbers inside declared walls; it may not change what the strategy is while nobody is looking. A flipped sign is not a tuned strategy. It is a different strategy wearing the old one's track record.
Breached when the model can flip long/short semantics — or when a sign is adopted from a paper instead of from a pre-registered run on your own venue — or when a large negative result is read as an edge in waiting, without first subtracting the cost that is paid in both directions.
Crypto's native state is an input advantage, not an edge
The inputs that make crypto crypto have no equities analogue: the funding countdown, the mark-versus-index basis, liquidation flow — and a strange algorithmic clock. The Quarter-Hour Effect (arXiv:2607.09426) documents that clock as periodic bursts of volatility and volume at the 1-, 5- and 15-minute marks on Binance perpetuals, measured across six contracts. Opening order imbalance predicts returns over a 4–12 hour horizon, with "much weaker effects at finer clock-time frequencies." These are the only inputs that could put a trading model at the AI × crypto intersection, so they are the ones worth testing properly.
The mechanism itself is well understood, which is the first reason to be suspicious of easy edges in it. Perpetual Futures Pricing derives explicit no-arbitrage prices for linear, inverse and quanto contracts, and identifies the funding specifications that guarantee spot-futures price coincidence and dynamic replication. Later work builds replicating portfolios directly and proposes path-dependent funding as a practical way to hold prices to target. Meanwhile the exploitable gaps have been closing for years: crypto arbitrage opportunities are well documented, but their magnitude fell sharply from April 2018 onward and existing price differences are now barely exploitable.
Then the trap, and it is the most instructive negative result I know in this space. Funding-Aware Optimal Market Making for Perpetual DEXs (arXiv:2605.06405) treats the funding rate as a stochastic state variable. The coupling it adds to classical market making is that inventory now creates both mark-to-market exposure and a state-dependent funding cash flow. A reduced inventory-funding control problem is formulated and solved with a monotone finite-difference Hamilton-Jacobi-Bellman scheme, with bid and ask quote offsets recovered from discrete inventory value differences. The control problem is solved with a monotone finite-difference HJB scheme. No learned model anywhere.
The holdout runs 100 seeds, calibrated on Hyperliquid ETH, BTC and SOL data. The result: "the funding-aware HJB improves mean ETH/BTC performance while lowering inventory RMS relative to classical Avellaneda-Stoikov" (arXiv:2605.06405). That is better performance and less inventory risk than the 2008 baseline — from adding one state variable to forty-year-old machinery.
So the crypto-native mechanism my specs had carried as a design, and never tested, was finally built and measured. The task: forecast the next 8-hour Binance funding print for BTCUSDT and ETHUSDT. The data: 2,091 settlements each from the public funding-rate archives, on six funding lags plus settlement hour and day-of-week. Persistence, trailing mean, AR(1), ridge and gradient-boosted trees all ran on an identical expanding-window five-fold walk-forward.
Before the data was touched, the bar was fixed: beat persistence on both out-of-sample MAE and directional accuracy in ≥4 of 5 folds, pooled sign test p < 0.05. BTCUSDT returned 3/5 and 3/5 at p = 0.095 — fails. ETHUSDT returned 5/5 on MAE but 3/5 on direction — fails the conjunction. Ridge carried the better MAE in 4 of 5 BTCUSDT folds. The classical arm won the disjunction my own spec had left open.
The economics are the part that should have been checked first, and this is the discipline the whole result taught me. Mean funding is 0.4577 bps per 8 hours on BTCUSDT (std 0.586) and 0.448 on ETHUSDT. Against a hurdle of one side's fee, every policy nets ≤ 0 at 2, 5 and 10 bps per side — including the oracle.
With perfect foreknowledge, BTCUSDT makes zero position changes and ETHUSDT's oracle loses 5.02 bps net over roughly two years. The mechanism is economically inert at any realistic fee before forecast quality even enters the question. The forecasting bar was carefully specified, pre-registered and run — against a quantity that could not have paid for itself however well it was predicted.
There is a sharper caveat sitting under any funding model, and it deserves to be load-bearing rather than a footnote. Funding is a print, not a price — and prints have an attack surface. In commit-then-reveal encrypted mempools, the funding signal sets a transfer rate while receiver-side open interest is the transfer base, and a corrective transaction cannot enter an already-committed batch. Skill at predicting a manipulable print is not the same thing as skill at predicting a market, and only one of them survives contact with whoever is doing the manipulating.
The same question went somewhere else entirely, in case the failure was the instrument rather than the thesis. The data: 833,098 resolved pump.fun launches, launch-time features only, chronological split. AUPRC was pre-registered as the metric, because a 0.18–0.23% base rate makes AUC misleading.
Both models beat random by four to eight times, so the structure is genuinely there. But the classical logistic scored 0.01778 AUPRC against the boosted trees' 0.00878 — the learned arm 50.6% worse in relative terms, and failing its +10% bar by a wide margin.
The metric choice inverts the answer: on AUC the trees look better, 0.824 to 0.696. Rank the whole distribution and the learned model wins; ask which candidates to actually act on and it loses by half. That is the textbook imbalance lesson, and it is exactly the lesson a dashboard reporting AUC would have hidden.
What did finally occupy the intersection is worth stating precisely, because it is not an edge. The first genuine crypto-native × learned object in my corpus is a measurement instrument. It is a cost-attribution probe that needed a model reading a classified funding column in order to run at all. It ran to completion for the first time here.
The model powering it is the same one that had just failed its own skill bar. Both facts belong in the ledger together.
The sharpest version of this arrived later, once there was enough data to ask it properly. Take the ten-minute signal — the one genuinely well-powered positive return forecast in this work — and ask which features carry it. Dropping the entire crypto-venue block, taker imbalance and trade count included, moves the residual from 0.1167 to 0.0847 bps median, with the delta positive on two instruments and negative on two. What carries the signal is lagged returns, realised volatility and clock phase: inputs that exist on any instrument anywhere.
Then the test that settles it. Fitted on BTCUSDT and applied unchanged to foreign exchange — 450,153 EURUSD rows and 429,761 USDJPY rows over 2,556 days, both powered to detect the crypto-sized effect — the coefficients come back positive in 6 of 6 cells and 6 of 6 fold means, p = 0.0312. The magnitude attenuates to a median 0.0311 bps, about 0.37× the crypto figure, and sits more than 2.8σ below it on two of six cells. Sign transfers, size attenuates.
Be careful what that licenses, because the record is careful: every individual FX cell is unresolved, the arms were powered for a crypto-sized effect rather than the smaller one they found, and the removal-test verdict itself is reserved to a human rather than written by the loop. One more caveat belongs here by this post's own standard, and I add it having failed the same test elsewhere: that p = 0.0312 is a fold-count statistic over six folds of one period on two pairs that share a dollar leg. It treats six as six. When the effective count was actually measured on four perpetual contracts it came back at barely one, and nobody has measured it for these folds. What is measured is that the one real signal here is not made of crypto. A crypto-native input does not make an AI-native edge, and in this case it did not even make a crypto-native signal — the model leg has to be earned separately, on data, with the classical scheme as the baseline it must beat.
Breached when "we use funding/on-chain/liquidation data" is offered as evidence the strategy is AI-first without a classical control fitted on the same inputs — or when a crypto-native period is stratified on without testing a portable period that divides into it — or when a forecasting bar is set on a quantity whose economics were never checked against the fee — or when a ranking metric is chosen that flatters the model on the part of the distribution nobody trades.
A period that divides a known period cannot be told apart from it
There is a sharper version of this test, and it took 115 experiments before anyone ran it. Search my read-out before that point and the word "settlement" appears zero times. The single most perp-specific structure available — the eight-hour funding cycle — had never been tested against the maker result at all, despite the whole investigation being organised around finding something crypto-native.
The period is what makes it a clean test. A 24-hour structure is a session effect and equities have one, so any result there is portable and proves nothing about crypto. An eight-hour structure is a funding cycle, and a share has no such boundary. A signal at eight hours would have been cleanly attributable.
It resolved. The two hours adjacent to a documented settlement ran −0.0262 bps against +0.0216 mid-cycle — a difference of −0.0477 with an MDD of 0.0462. Resolved, in the one structure a share does not have. That would have been the investigation's first genuinely crypto-native effect.
It is not one, and the reason is arithmetic rather than statistical: 24 is a multiple of 8. Funding phases 0 and 7 aggregate UTC hours 23 while mid-cycle aggregates 20 — different times of day. A pure day effect produces that exact contrast through an eight-hour lens. Running the control settles it: at the same degrees of freedom, the funding phase explains 0.04303 of the variance and the 24-hour day block explains 0.27654 — the control explains 6.4× more, hour-of-day more still at 0.35185, and none of the eight phases resolves individually. There is no eight-hour structure in the data. The pattern is a day, wearing a funding cycle's clothes.
The general form is worth more than the funding result, and econometrics has a name for its cousin: spurious periodicity introduced by inappropriate detrending, where a processing choice manufactures a cycle that was never in the data. Here the processing choice is the stratification itself. When a candidate period divides evenly into a period you already know exists, a stratification by the candidate will reproduce the known effect and hand it to you under the new name. The control is not optional diligence there — it is the only thing separating a discovery from an alias.
Breached when a candidate period is tested by stratification without a control at the period you already know is there — or when a resolved contrast is accepted before checking whether its strata also differ on a variable nobody was testing.
A median rate is not a realised path
There is one term in a perpetual that does not fight the square root. A price move over horizon h grows like √h while the fee stays fixed, so their ratio improves only as √h — but funding is a cash flow that settles every eight hours, so cumulative carry grows like h. Fitted rather than assumed over an 8-hour to 720-hour range, the exponents come back at 0.999–1.001 for carry and 0.504–0.526 for the move. That asymmetry is real and it survives every correction that follows in this principle. It is the most promising thing this investigation found.
The first arithmetic I did with it was wrong, and wrong in a way worth naming. Dividing a hedged 6.8 bps round trip — the two-leg form of the same 3.4 bps standing assumption used everywhere else here, pricing two round trips of exchange fee and nothing else — by the median absolute funding rate gives clearance in 54 to 81 hours, which reads like a result. Summing the actual signed series over rolling windows of exactly that length instead: clearance on 40.7%, 42.2%, 28.5% and 26.5% of windows, against a 90% bar pre-registered before the run. The corrected horizons are 27.7, 18.7, 14.7 and 126.0 days. The constant was wrong by 5× to 56×, and no new data arrived to make it wrong — only the difference between a rate and a path.
The mechanism is that the signs cluster. Measured sign persistence runs 0.863, 0.858, 0.806 and 0.786 against 0.757, 0.764, 0.701 and 0.656 for an independent series with the same marginal distribution, so inversions arrive in runs rather than singly. A median absolute rate silently assumes the sign is a fresh coin each period; the path is not. That is also why the risk term shows up only when you sum: worst drawdown of the cumulative carry is 41.25 to 100.41 bps — 6.1 to 14.8 hedged round trips — with the position underwater 24.8% to 40.6% of the time, and the worst consecutive-negative run costing −9.08 to −15.68 bps over as much as 128 hours.
What survives the withdrawal is the part I started with, and it is not nothing. Aggregate carry over 1,247 days is +2,523.1 to +2,881.5 bps — 371 to 424 hedged round trips, or roughly 60.7 to 69.3 bps per thirty days gross. The linear-versus-square-root argument is untouched. What died is the horizon at which you can rely on collecting it, and with it the idea that this is a toll you clear on a schedule rather than a position you carry through inversions.
The pattern is old enough to have a canonical citation. Brunnermeier, Nagel and Pedersen documented that carry traders face crash risk, with returns negatively skewed because of the sudden unwinding of crowded positions — small gains accruing steadily, punctuated. My funding series is the same shape measured on a different instrument: a positive mean, a clustered sign, and a drawdown that only appears when you stop averaging and start accumulating.
The basis — the second term in that hedge, and the one I had listed as unmeasured — has since been measured, and it does not kill the carry. Getting there took one more correction, and it is the sharpest data defect in this post: Binance moved its spot archives to microsecond timestamps in January 2025 and left the futures archives in milliseconds, so the join silently matched only the millisecond half — 1,052,560 of 1,795,600 minutes, exactly 2023 and 2024 — while every statistic built on it claimed 2023 to 2026. Nothing errored, because an intersection returning fewer rows is an intersection doing its job.
It has a twin in the same thread, and the pair is worth holding together: when the window was first extended, a downstream isfinite filter silently dropped every pre-2023 row — the Treasury-bill series simply began later — so the run reported a "full history" computed entirely on the years it already had. The window counts came back byte-identical to the short run, 41/13/6/3, and that unchanged count was the only tell. Both defects destroyed data quietly, and both were caught by a number that should have moved and did not.
Across the repaired join of 1,795,600 aligned minutes per instrument, perp against spot, a 168-hour hedged position returns +11.524 to +11.759 bps against a funding-only +11.567 to +12.260: the basis costs between 0.043 and 0.882 bps over a week, and clearance of the 6.8 bps toll falls only from 73.3% to 72.2% on the first instrument and barely at all by 720 hours. The corrected basis is roughly twice as negative as the half-sample suggested, at a mean of −2.5201 to −2.8862 bps, with the perp above spot on only 16.92% to 19.42% of minutes. The decisive number survives it: basis risk grows at 0.1148 to 0.1917 against carry's 1.0, so the risk term does not outrun the payoff, and the linear-versus-square-root argument survives its own risk term rather than being quietly undone by it.
The cost of capital has since been priced too, and it is where the promise finally lands. A fully-funded delta-neutral carry borrows nothing, so what it costs is the Treasury bill it displaces. Over 41 calendar months the gross carry runs a median +6.17% to +6.73% a year against a 13-week bill at 4.51%, leaving a hedged excess of +1.47% to +1.78% — and that excess does not resolve on any of the four instruments, sitting against detection bars of 2.86 to 3.86.
Months positive run 29, 27, 28 and 26 out of 41, and against a Bonferroni family bar of 0.0125 exactly one clears — on the binomial p, which assumes the months are independent draws. They are not. Calibrated against the dependence actually present, the count of positive months is overdispersed by 1.610× (standard deviation 5.1534 against a binomial 3.2016), so a nominal 0.0125 test rejects 12.350% of the time when nothing is there. BTCUSDT's 29 of 41 carries a binomial p of 0.011508 and an empirical p of 0.12350 — a factor of 10.7 — above the family bar and above an uncorrected 0.05. The others run 0.25133, 0.17952 and 0.33782. None clear. The check survives its own robustness sweep: at a dependence matched to what BTCUSDT actually shows the empirical p is 0.09835, still 7.9× the bar, and even at a value that understates the dependence it is 0.06065.
Those particular p-values have since been recalibrated more than once, and the useful thing is what does not move under recalibration. As a null fits the observed persistence better, the empirical p rises — monotonically, from 0.03985 to 0.55900 across the plausible range. Every null that reproduces how this series actually behaves says the count is unremarkable, and the ones that flatter it are the ones that fit it worst.
Splitting by era makes the shape plain, and it is the honest end of this thread. Asked only of 2023 onward — the era that decides whether the carry works now — the excess is positive in 25 of 41 months, 61%, at a binomial p of 0.211024. Getting from there to an answer took four more attempts at a null that could be trusted, and the failures are worth one sentence each: a Gaussian family cannot make tails this heavy; five innovation families across 120 combinations matched the dependence or the shape but never both, because as persistence rises the simulated tail collapses; and a two-component grid of 700 combinations reached every feature individually — sign autocorrelation 0.601, tail ratio 9.337, both above what the data shows — and none of them jointly. That is a structural refusal, not a failed search.
What finally matched was a regime where one state carries both the higher mean and the higher variance, which is what the two eras look like. It gives 21 admissible nulls out of 160 — the first validated nulls in this thread, matching all three features at once. Under them the observed 25 of 41 has an empirical p of 0.44320 to 0.75380. So the answer is not "no null fits" any more, which was always a statement about my search. It is that a null which reproduces how this series actually behaves produces this count about half the time. Asked of the earlier years it looks decisive, 24 of 30 positive at a binomial p of 0.001431 — and it cannot be asked at all, because its longest run is 22 consecutive months carrying 22 of those 24 positives. Validating a null against that run forces it to reproduce the count, so the test cannot fail. One era answers and says no; the other only looks like an answer. Worst months: −5.76%, −7.60%, −6.59% and −10.68%.
Two things about that number are worth saying plainly. It is a statement about power rather than about absence — an edge of 1.5% a year is precisely the size 41 months cannot see, so this is unresolved, not refuted. And the costs still unpriced are the same size as the excess: a hedged round trip is 6.8 bps, which held for one month is 0.83% a year and for three months 0.28%, with spot slippage and margin requirements on top of that. The thing that started as the most promising asymmetry in the investigation ends as a 1.5% annual excess that the sample cannot resolve and that its own unmeasured costs could plausibly consume. The obvious escape is to hold longer, since the toll is charged once per round trip and its annualised drag falls as 1/H — 3.546% a year at seven days, 0.827% at thirty, 0.068% at a full year. Net excess duly rises, monotonically. But non-overlapping windows fall as 1/H as well, so the detection bar rises in step: 1.62 to 5.03 across the same sweep. The ratio of effect to bar climbs and never reaches 1.0. It is the same vise the directional side ran into, arriving by a different road — the dial that improves the number also destroys the sample that would confirm it.
And then the count itself turned out to be wrong, in the way this post keeps warning about. I had been reading four instruments as four chances to be contradicted. Measured, the cross-instrument correlation of the windowed net excess runs +0.917 to +0.986, which puts the effective number of independent observations at 1.01 to 1.07 out of four. Pooling cut the standard deviation to 0.968–0.995 of a single instrument's, where genuine independence would have given 0.500. Four perpetuals are one observation. The best ratio I quoted a moment ago was also a maximum over 28 cells; the honest pooled figure peaks at 0.517.
Which leaves one statistically solid statement about the whole carry, and it is not the one I wanted: the seven-day hold resolves, pooled, at a median −2.099% a year with a ratio of −1.163 — adverse. Short holds lose. Everything favourable is unresolved, and there is no arrangement of these four instruments that resolves the carry's net excess.
Buying more history does not fix it either, and what it turns up is the more interesting result. Extending the window from 1,247 to 2,151 shared days — back to 2020 — the pooled ratio peaks at +0.425, lower than the 0.516 on the recent years alone, because variance grew faster than the mean. But the older years were a different market: pooled median carry runs +5.984% a year at thirty days, +18.314% at ninety and +18.892% at a hundred and eighty, against the recent era's −0.038%, +0.113% and +2.816%. Six to a hundred times larger. Neither period resolves on its own, and the decline between them does not resolve either — which is the honest way to describe a trade that everyone will tell you used to work. The spot leg and the borrow remain unmeasured, so 6.1 to 14.8 tolls is still a floor on the risk rather than an estimate of it.
Breached when a cumulative quantity is projected from an average rate rather than summed along its realised path — or when the sign of a periodic cash flow is treated as independent across periods without measuring its persistence — or when a carry is reported by its mean while its drawdown, its time underwater and its unhedged legs go unquoted.
“Nothing cleared” is not “nothing is there”
The distinction that survives all of this is worth stating carefully, because it is not the one a reader in a hurry will take. None of it shows the carry is absent. The medians never moved — +1.47% to +1.78% per instrument and +1.39% pooled, exactly where they started — and a real edge anywhere below roughly seven percentage points a year would sit comfortably inside the calibrated interval. What collapsed was every piece of evidence offered for it, one assumption at a time: the horizon, the independence of the instruments, the symmetry Wilcoxon needs, the exchangeability the bootstrap needs, the coverage the interval claimed, and finally the binomial the sign test assumed. The number is still there. Nothing that was said about it is.
That is worth separating from the result it came from, because the shape recurs. A measurement and the case for a measurement are different objects with different failure modes. The number is produced once and then sits there; the case for it is a stack of assumptions, each of which can be checked later by someone with more data or more patience, and each of which can fail without touching the number underneath. Seven corrections to one claim in this investigation moved the estimate by less than a fifth of a percentage point and destroyed every argument that had been made for it.
Medicine settled the naming of this thirty years ago, in a note whose title is the whole argument: absence of evidence is not evidence of absence. The point there is that a trial reporting no significant difference has not shown the treatments equivalent, only that it could not tell them apart — and the same sentence, transplanted, describes every unresolved cell in this post. Amrhein, Korner-Nievergelt and Roth put the cost of forgetting it plainly: treating a significance threshold as a licence for a claim distorts what gets believed, in both directions.
The asymmetry that makes this dangerous is that the two collapse in opposite directions when you report them carelessly. Saying “the carry does not clear” invites the reading that the carry is not there, which is a much stronger claim and one this data cannot support: an edge below roughly seven percentage points a year would sit inside the calibrated interval undetected. The honest report has two halves — what was measured, and what is left of the reasons to believe it — and only the second one moved.
Breached when a failure to resolve is reported as an absence — or when a measurement is retracted because the argument for it was, rather than because the number changed — or when the size of effect the design could still be hiding is not stated beside the null.
Leverage makes the tail endogenous — and mine is unmeasured
Every principle so far has carried a number I measured. This one does not, and saying so is the point of including it.
The mechanism is specific to this asset class. Crypto perpetuals carry leverage up to 100×, and BitMEX-era platforms were averaging over $3 billion in daily volume on exactly that product. Perpetuals now account for roughly 93% of crypto futures volume (Zhivkov, 2026). At that leverage, price moves force liquidations, and liquidations are themselves market orders.
The selling is caused by the price and then causes more of it. In 2021, nearly $80 billion of positions were liquidated on centralised exchanges, over $200 million a day. Tran, Nguyen, Le and Pham study Binance USDT-margined perpetual swaps. They find bitcoin open-interest changes are the strongest crash predictor, with an odds ratio of 1.48. It models the cascades directly against circuit-breaker counterfactuals (Studies in Economics and Finance, 2026).
One consequence deserves to frighten a risk model more than it usually does. Under auto-deleveraging, a solvent, correctly-stopped position can be closed by the venue because somebody else's losses have exhausted the margin pool. Formalised as an optimisation, ADL socialises losses among surviving participants, and a minimax-leverage policy — minimising the maximum participant leverage — is optimal under monotone risk measures in isolated margin. Read that as a trader and it says: your exit is not entirely yours.
A stop-loss models the price reaching your level. It does not model the exchange reaching into your position because the queue of insolvencies got long enough. That tail does not appear anywhere in a price series, so no model trained on price series can anticipate it.
Now the honest part. My archive holds bookTicker and aggTrades. There is no funding, mark-price or premium-index data on disk at all. So I cannot measure liquidation intensity, cascade timing or ADL exposure from my own data. Every number in this principle is somebody else's.
A system that quietly let this pass would be making this post's error in reverse. Not believing an unsupported claim, but treating an unmeasured risk as an absent one. Those look identical on a dashboard and are opposites in a drawdown.
So it is carried as a named gap rather than a silent one. The risk layer's response to a regime it cannot price is a refusal, not a forecast. Position limits and a hard kill, sized on the assumption that the cascade is unmodelled rather than mild. The research question it generates is a purchase decision, not a modelling one. This data would have to be acquired before any claim about cascade behaviour on my venue could be graded.
Breached when a leveraged strategy's tail risk is estimated from a price series that contains no liquidation or funding state — or when "we found no cascade effect" is reported from an archive that could not have recorded one.
II. The AI as trader: regime gates, no-trade and sizing
The best trade the AI makes is no trade
The regime filter is the highest-leverage decision in the whole stack, and it is a decision not to act. In LOW volatility the expected move is smaller than the round-trip cost, so every signal is noise you pay fees to hold. In EXTREME volatility, slippage and stop-gap risk dominate the geometry. Both block. Fees are fixed, opportunity scales with volatility, and the tradable band is the middle.
The strongest evidence I have for this principle arrived by accident, when I gave a router a third action. Alongside "quote" and "cross", it could now abstain — and the baseline changed underneath the question. Abstaining is free, every arm loses money, so always_abstain scores exactly 0.0 and beats everything the investigation had produced, without consulting the signal at all.
At 2 bps maker and 2 bps taker it is the best arm in 11 of 11 panels; at zero maker and 5 bps taker, 10 of 11. Across 22 cells, the number of routers that beat abstaining by a resolved margin after correction is zero.
The way the routers failed is more informative than the fact that they did. An earlier iteration predicted they would degenerate onto always_maker — collapse to the cheapest action and stop discriminating. Given a third choice they degenerated the other way, onto always_abstain. The fitted policies trade about 1.6% of rows, at median abstention rates of 0.9897 and 0.9841. They still end below zero, at −0.0051 and −0.0149 net.
Even the sliver they select is unprofitable. The model learned to almost-not-play, and the residue of playing was still a loss.
That result needs its boundary stated with it, because it is easy to over-quote. It is not a claim that no strategy works. It is a statement about this cost structure at this horizon: the measured policies lose money, and not playing beats playing. An AI that reports "no trade" against that background is not failing to find the edge. It is reporting the edge's absence correctly, which is the only honest output available and the one a metric like fill count or trade count will punish.
That could have been the end of it — a null dressed as a discipline. It is not, and the reason is the most strongly powered positive result in this corpus — which is not a forecast of direction at all, but a result about when not to trade. If abstaining only helps because it trades less, then skipping the highest-volatility intervals should do no better than skipping the same number of random ones. It does far better. Against a null measured rather than assumed — 2,000 draws matched on the number of intervals kept — the volatility rule sits 17.39 standard deviations clear at a one-minute horizon, 10.9 at five, 7.4 at fifteen and 4.01 at sixty. Twelve cells across horizons and fractions, none marginal.
It survives a real temporal holdout too. The threshold is a volatility level in basis points fitted on one pair of days and applied unchanged four months later, not a quantile recomputed on the test set. Abstention helps in both directions and at every horizon: 21.3% early-to-late and 67.7% late-to-early. Note what does not survive — the size of the help, which spreads 3.2× between those two directions, with the in-sample figure sitting between them. The earlier pair is the more volatile one, so a rule that avoids volatility has more to avoid there. A single split is one draw from the space of regimes, and one draw carries no information about its own variance.
Then the test that actually settles it, because the obvious objection survived every test so far. A high-volatility minute carries far more fills, so skipping the worst quartile of intervals removes 41–43% of entries — the rule was still, in part, just trading less. Holding the entry count equal halves the z on the total, 16.9 → 8.3. But the surviving half is the real thing: on gross per entry, where trading less cannot help by construction, the entry-matched z is still 8.3 at one minute, 5.6 at five, 4.2 at fifteen, moving the average from −0.0701 to −0.0482 bps, a 31.2% gain.
Read that last number carefully, because it is the shape of every honest result in this investigation. The strongest signal I have found — real, out-of-sample, placebo-controlled, information-carrying — improves a negative number by 31%. Knowing when not to trade is worth something measurable. It is not worth enough to trade.
The mechanics of getting the filter wrong are worth as much as the filter itself, because they fail silently in both directions. An unwarmed volatility estimate substituted as 0.0 ranks LOW. My entry gate treats LOW as merely one blocked regime.
The volatility percentile gate reads that same zero as calm, and lets trades through elsewhere. The identical fabricated number blocks one path and unblocks another. So every feature refuses when it does not know: None, never zero.
I paid for that lesson twice, measured. A p99 threshold computed over ten samples is pinned to its top order statistics: 0.99 × 9 = 8.91 interpolates between the 9th and 10th values. So my sweep detector's bar — the threshold above which a burst of aggressive flow counts as an event — was effectively "the largest bucket seen so far," and ordinary flow cleared it.
42 sweeps before the warmup floor, 30 after — every vanished one inside the warmup window. Meanwhile a volatility EWMA fed into its own percentile distribution during warmup labelled 93% of quotes EXTREME, silently refusing every sweep the detector had found. A detector and a filter, each plausible alone, cancelling to zero trades.
The regime literature is mostly an argument about how to detect the states. It has moved well past two-state Gaussian switching. There are continuous HMMs where the regime chain governs autocorrelation, per-regime emissions carry the heavy tails, and a regime-conditional VaR falls out (arXiv, 2026). There are bidirectional-LSTM hybrids for joint break identification and volatility modelling (2026), and network-community methods for early warning (PLOS ONE, 2025). A crypto-specific literature classifies latent BTC states through these structural breaks (2026).
Useful — but note what the abstain result says about the whole genre. A better regime classifier improves which rows you decline. It cannot manufacture a profitable subset out of a population whose best member is refusal.
Breached when an unwarmed statistic reaches the entry decision as a number — or when "don't trade" is treated as a failure mode instead of the most profitable output the AI has — or when an abstention gain is claimed without an entry-matched null, since trading less improves a total for free and improves a per-entry average never.
What is forecastable is your cost, not your direction
This investigation spent its whole length looking for a direction predictor and never resolved one. It did resolve a predictor. Just not of the thing it was looking for.
None of that is novel as a fact about markets, and that is the point — it is one of the oldest results available, and it was sitting in front of the investigation the whole time. Cont's catalogue of stylised facts pairs two of them directly: linear autocorrelation of returns is essentially absent, while the autocorrelation of absolute returns decays slowly. Returns are close to unforecastable and their amplitude is not. Volatility clustering is the name for that second half, and Cont devotes a chapter to its empirical facts and agent-based models: large price moves arrive together, so the amplitude of returns persists where their sign does not. The modelling literature has spent decades on it precisely because it is the tractable half.
My own numbers reproduce both halves at trading-loop horizons. Interval-to-interval persistence runs 0.5725 at one minute, 0.5688 at five, 0.5706 at fifteen and 0.534 at sixty, decaying to 0.2159 only by six hours. That alone is a textbook stylised fact. The useful part is what it predicts: the correlation between an interval's volatility and the next interval's gross runs −0.3111, −0.408, −0.5512 and −0.5548 across those same horizons, and every one of them sits outside its own noise band — by 12×, 7×, 5.4× and 2.5×. It is the first resolved, actionable predictor the investigation produced, and it is a restatement of a fact that was published before I was born.
Read the sign. High volatility now does not tell me which way the next interval goes. It tells me the next interval will be expensive — that whatever I do in it, I will do worse. The forecastable quantity is my own cost, and the actionable response is not a position but a refusal.
Acting on it works, and the size is not marginal. Skip the interval whose previous interval sat in the worst volatility quartile and the hourly result improves 48.2% at one minute (−282.6 → −146.4 bps/hour), 44.6% at five, and 40.4% at fifteen and sixty. Against the six-hour version of the same idea, which bought 1.4%, that is a thirty-fold larger improvement — because the predictor lives at the short horizons and the six-hour unit had averaged it away.
And it is still not enough, which is the part that matters for where a model gets pointed. Every horizon remains negative and resolved negative: the best, at one minute, is −146.4 bps per hour against an MDD of 12.0, twelve times its own bar on the wrong side. Abstention's ceiling is exactly zero, because its best possible outcome is not trading.
That ceiling is the useful thing to know before building. A cost predictor can only ever return you to flat, so it is worth exactly what it saves and never more. If the strategy it is protecting is negative, a perfect cost model yields a smaller loss — a real improvement, and still a loss. Cost forecasting is a multiplier on an edge you already have, never a substitute for one.
Breached when a volatility forecast is wired to a directional position rather than to a size or a refusal — or when an abstention rule's ceiling is not stated, since a filter on cost can only ever return the strategy to zero.
A correlation buys less decision than it looks like it should
The best forecast in this entire investigation is not the one the strategy needed. Splitting fills by the state of the order book at the moment they happened shows adverse selection is emphatically not flat: 12 of 12 state gaps resolve, refilling intervals cost −0.31 to −1.23 bps against draining intervals at −0.0015 to −0.36, and on the two liquid instruments the draining figure is indistinguishable from zero at every horizon tested. Since 82–89% of trade volume arrives in the refilling state, the volume-weighted blend simply reproduces the headline cost. It is a clean decomposition of where the money goes.
It is also not a lever, and the reason is worth being precise about. The state is defined over the interval containing the fill — including the very trade that fills you — so it cannot be conditioned on at the moment you post the order. A decomposition tells you where the cost is paid. It does not tell you how to avoid paying it, and the gap between those two sentences is where a lot of hope goes to die.
So the next step is to forecast the expensive state from information available before quoting, and that works: out-of-sample rho reaches +0.2646 and +0.2473 on the liquid pair. Set against the 0.0199 to 0.0212 this investigation managed on the ten-minute return, that is more than an order of magnitude better. It is the strongest measured forecast in the corpus. Then declining the worst predicted decile of fills improves per-fill adverse selection by +0.0718 to +0.1280 bps — unresolved on 4 of 4 instruments, and below the 0.1660 bps per-fill bar on 4 of 4. A thirteen-fold better correlation did not produce a decision that clears.
The arithmetic of why looked, for a while, more interesting than it was. Selecting on a noisy score captures only a fraction of the underlying spread, the Gaussian case bounds that fraction, and the realised gain came in at 0.23× the bound — which reads like fat tails putting the cost where a ranking cannot reach. It was not fat tails. That ratio recovered the outcome's spread from an unweighted row count while the error bar it was divided by had been computed under volume weights, on a sample 23 and 45 times smaller. Measured directly the ratio is 1.2276 and 0.8854: the bound is about right, and there was no fat-tail finding to report.
What the re-run did establish is that the weighting decides whether the result resolves at all. Under unit weights the improvement is +0.0408 ± 0.0113 and +0.0444 ± 0.0152, and it resolves; under volume weights it is +0.0605 ± 0.0722 and +0.0667 ± 0.1792, and it does not — because volume weighting collapses the effective sample from 33,477 to 1,432 and from 26,777 to 596. Neither version clears the 0.1660 bps per-fill bar, so the conclusion is unchanged and the reason for it is different from the one I first gave.
Quantitative finance formalised this relationship long ago — the fundamental law of active management, in Ding and Martin's restatement, ties achievable value-add to forecast correlation and the number of independent bets rather than to correlation alone. The practical reading for an AI-first system is blunter than the algebra. A model's correlation is not its contribution. Between the two sit the size of the spread you are selecting on, the shape of its tails, and whether the ranking can reach the part of the distribution where the cost actually lives.
Breached when a decomposition is treated as a lever without checking that its conditioning variable is knowable before the decision — or when a forecast is promoted on its correlation rather than on the decision gain that correlation can buy — or when a realised selection gain is not compared against the bound its own correlation implies, and a ratio far from one is interpreted before the computation behind it is checked.
The AI trades at tick speed and learns at week speed
An execution loop runs at ≤100 ms. A model is a seconds-long network call. Those two facts alone dictate the architecture: no model call sits on any path that reaches submit_order. It is enforced as an import graph, so the AI plane and the engine literally cannot share a process, and the composition root is two processes exchanging JSON. The model emits an expiring, signed policy; deterministic code interprets it at tick speed.
Between those extremes sits supervision — 1 s breakers, 60 s incident sweeps, a 5-minute review — safe at any frequency because every action available to that loop reduces exposure. Above it sits research, which is weekly, and here is the arithmetic that makes weekly a trading principle rather than a preference. My proposer emits up to 5 hypotheses per call and a dataset retires from gating after 20 reads. At a five-minute cadence the twentieth hypothesis lands on iteration four — twenty minutes — after which that dataset can never gate anything again.
Now count the tests. A week at five-minute cadence is 2,016 calls; a week at weekly cadence is one call and at most 5 hypotheses. Correcting for that many comparisons moves the Bonferroni two-sided evidence bar from 2.58σ to 4.22σ — the same finding needs to be far stronger to clear it. With one deployment allowed per week, 2,015 of those 2,016 iterations could not have shipped what they found. A fast research loop does not learn faster. It spends its holdout in twenty minutes and then runs forever, unable to conclude.
What the slow clock buys is a specific kind of artefact, and it is worth describing concretely because "we pre-register" is otherwise just a claim. My last research campaign froze its pre-registration to a file with a SHA-256 of 1ffa9f0f…, before any data was downloaded or any query run. It finished having consumed zero holdout reads: offline evidence only, no promotion. The verdict scale was fixed in the same document: DEMONSTRATED > SUPPORTED > UNDETERMINED > DISFAVORED. REFUTED was declared unreachable by design. Absence cannot be proven, and a scale that offers the word invites someone to use it.
Pre-registration survives contact with reality by declaring deviations rather than absorbing them. Three were recorded against that campaign. The measurement window was 2024-03-29 rather than a 2026 date, because Binance discontinued daily bookTicker archives after 2024-03-30 — so the result speaks to 2024 microstructure and says so.
The largest panel was capped at 72,000 rows because scoring 2.09 million rows in a Python loop was compute-infeasible. And 27,098 of 860,213 launches were dropped as unresolved. None of those choices is neutral, and each one is a place where an unrecorded decision would have quietly become a result.
The retraction that campaign produced is the sharpest argument for the slow clock. A learned fill-hazard model was measured against an IRLS logistic baseline as the panel grew. The Brier-skill margin ran +0.028 at 8,000 rows, +0.024 at 24,000, and +0.006 at 72,000. At the largest size the logistic took AUC outright, 0.7655 against 0.7619. That reads as a clean law — the learned advantage decays as data arrives — and it was written into the code as a comment.
It did not survive. Across two days the margin decays on one and rises on the other: the least informative split available. What stands is only that the margin is small and positive, +0.0063 to +0.0489.
The directional claim was withdrawn. A weekly loop caught that before it became doctrine. A five-minute loop would have shipped the law, then generated a hundred further hypotheses conditioned on it.
From the modelling side, the generalization literature keeps arriving at the same place. Zhang, Vinyals, Munos and Bengio found that standard deep RL agents "could overfit in various ways", and the accompanying survey places particular focus on generalization as the barrier to practical use. Recent trading-RL work now treats environment design as a leakage-control problem, with "strict anti-lookahead semantics". The cadence rule is the operational form of that concern. You cannot fix a leakage or overfitting problem at a speed faster than you can measure whether you have one.
Breached when a model-bound call appears in the tick path — or when the learning loop's cadence outruns the statistics that make its conclusions mean anything — or when a deviation from the pre-registered design is absorbed into the result instead of being recorded next to it.
The AI proposes; the market disposes
The AI's job is to propose trades as falsifiable hypotheses. Each proposal is pre-registered before the data is touched: at most five per call, at most one deployment a week, dataset retired at 20 holdout reads. The model may not choose its own yardstick.
The branch it is judged under and the holdout range it is judged on are overwritten with the caller's values, whatever the model returned. The backtest process deliberately omits the p-value, so no artifact in the loop can certify itself. Its memory is a ledger it cannot edit. No weight updates in production, and no memory across sessions. The prompt is a pure function of its context, byte-identical on a second session. It is pinned by its own SHA-256, so a changed prompt is a changed model requiring a new evaluation. What accumulates instead is on disk.
A graded-claim ledger recomputes every predicate the previous policy asserted and records it as held-or-not. A demotion record with a similarity check stops a killed hypothesis coming back next week with only its numbers moved.
The obvious question is whether the proposer contributes anything a random sampler would not, and I measured it rather than assuming. Against two samplers over the same bounded parameter space, the AI showed no parametric-coverage dominance — it does not explore the box better. What it did produce, and they structurally could not, was falsifiable vocabulary: 5 of 5 proposals carried an explicit mechanism statement plus a decision criterion, against 0 for both samplers. That is a narrower claim than "the AI is smarter" and a more useful one. A sampler returns coordinates. A proposer returns a coordinate and a reason it should work and a statement of what would show it did not. That last part is what makes a result interpretable when it fails.
The honest limit belongs next to that claim, not in a footnote, because it is the kind that quietly inflates. This is one recorded sample at N = 5. Proposal quality — whether those hypotheses, run through the engine, beat sampled ones — was not measured at all.
What is supported is the vocabulary claim. What is unmeasured is whether the vocabulary is worth anything. Stating the second half is the difference between a finding and an advertisement.
The benchmark literature has converged on the same complaint from the outside. InvestLogicBench (arXiv:2608.06108) evaluates 201,247 documented decisions from 151 real-world investors. Its motivation is that terminal profit and loss "cannot reveal whether a profitable action was grounded, profile-consistent, or merely lucky." AI-Trader (arXiv:2512.10971) attacks the same gap from the data side.
AI-Trader attacks the same gap from the data side, offering what it describes as the first fully-automated, live and data-uncontaminated benchmark for autonomous agents in real markets. Scaffold papers like FinMem push in the opposite direction, treating layered memory as the route to executable decisions. The disagreement is not really about architecture. It is about what an agent is for — and a P&L number cannot settle it, because a lucky agent and a grounded one produce the same number.
There is a conclusion here I did not expect when I started, and it is the strongest form of this principle. If the AI's measured contribution is falsifiable vocabulary rather than better search, then the AI-native object in this system is the research loop, not a runtime model. That is structurally guaranteed: no model call may touch the tick path by design. The intersection this investigation went looking for in the strategy turns out to be in the method. That is a smaller claim than the one I set out to make and the only one the evidence supports.
Breached when any output of the model changes how the model is evaluated — or when agent state persists anywhere outside ledgers the model cannot write — or when an agent's contribution is asserted from its outputs' plausibility rather than measured against a sampler that shares its search space.
A broken feature impersonates a broken experiment
Swapping a whole-day standardisation for a trailing-window one — the version you could actually deploy — collapsed the pre-registered control. Adjacent-day transfer on ETHUSDT fell from +0.23575 to −0.00051, on pairs where retention is 0.918 and nothing should have moved at all. A control collapsing is the good case. It says the change broke something rather than that the idea was wrong, and it says so loudly enough that you cannot proceed.
The cause was a guard testing the wrong predicate. One feature sits at exactly one tick for long stretches, so under a trailing window its standard deviation approaches zero without ever reaching it — and the guard checked for exact zero. Maximum |z| reached 671,088,640 on ETHUSDT and 94,906,266 on BTCUSDT, against 66.9 and 70.7 under whole-sample standardisation. A guard that tests an exact value does not protect you from a quantity that converges on it, and the resulting feature does not error, it just arrives eight orders of magnitude too large.
Before choosing any floor I censused all seven features for the same degeneracy, which is the only reason the floor could not be tuned on the outcome it was about to fix. Two of seven degenerate. One had 11.90% of rows below 5% of its global standard deviation at the shortest window, falling to 3.81% at the longest. The other had 95.52% of rows below one percent at the shortest window and 52.38% at the longest — and it was broken at construction, not at standardisation: on one instrument-day it carried a standard deviation of 2,362 against a 99.9th percentile of 8.919 and a maximum of 492,001, a ratio of 55,164. On another instrument the same day it was entirely healthy, at a ratio of 3.
Then the part I got wrong. I reasoned that a feature with near-zero variance is effectively disabled, contributes nothing, and can be left alone — a comfortable inference that let me stop. Ablating it instead: rho went from +0.00073 to +0.21722 on one instrument-day, a 298× recovery, and from +0.00100 to +0.25324 on another, 253×. The feature was not being ignored. It was destroying the model. On a third day my reasoning was exactly right — cost −0.00000, coefficient 2.3 × 10⁻⁵, the smallest of the seven — and which case you get is not predictable from any scale statistic I computed. The only instrument that distinguishes them is removal.
The most expensive consequence is that the damage had already been misattributed. An earlier run had concluded that the within-day split was the broken measurement on that instrument-day. The split was fine; the feature was broken. A bad input impersonates a bad design, and it will keep doing so until something ablates it — you will happily rewrite a sound experiment to chase a defect that lives in a column. With six features the picture inverts: 6 of 7 instrument-days exceed rho 0.10 with a median of 0.24731, against 4 of 7 and 0.11123 with all seven. The honest limit is that this invalidates numbers in four earlier iterations, and I have not re-run them.
Sculley and colleagues catalogue exactly this class of cost, naming entanglement and data dependencies among the risk factors that make machine-learning systems expensive to maintain rather than cheap to build. Their framing is the useful one: these are not bugs you fix once but ongoing costs you either pay deliberately or accrue silently. A feature that quietly poisons a model while presenting as inert is the purest form of the debt they describe.
The repair is worth reporting because it landed, and because of where the fixing constant came from. Re-running the trailing-window test with a 5% floor fixed in advance — chosen from the feature census rather than from any transfer number — the control passes at all three window lengths: +0.22596, +0.22784 and +0.22265 against a whole-day +0.23267, deltas inside the 0.02 tolerance pre-registered before the run. A floor picked from the outcome it was about to repair would have proved nothing; a floor picked from the inputs and then tested on the outcome is a result.
That repair also unlocked the number the collapse had been hiding, and it is the one that matters for deployment. Over gaps of 31 to 145 days the trailing version retains +0.07995 against the whole-day +0.16767 — 47.7%, and it is worse on 7 of 8 pairs. The whole-day figure is not a rival, though: it standardises using the test day's own mean and standard deviation, so it cannot be traded. The deployable number is roughly half the one I had been quoting, which is the usual relationship between a measurement and a version of it you could actually run.
Breached when a feature is judged harmless from its scale statistics rather than by removing it and re-measuring — or when a guard tests an exact value that the failure mode only approaches — or when a collapsed control is blamed on the experimental design before the inputs have been audited.
Regime is a gate, not a feature
There are two ways to put market state into a system. As a gate, regime answers one question — trade or do not trade — and never touches sizing, direction or geometry. As a feature, it enters the model as a number, and the model learns how the edge varies with it. The two look like design preferences. They are not: they make claims of different strength, and only one of them replicates.
A gate needs a level claim: in this state, the expected move does not clear the round trip. A feature needs a shape claim: the edge behaves like this as a function of the state. My corpus has now measured both kinds repeatedly, and the split is stark.
Level claims are consistent. Shape claims are not consistent along any axis measured — regime, horizon, or instrument. That is the single most useful methodological result I have, and it was not what I expected to find.
The retraction that established it is worth reading as a cautionary tale, because the claim was plausible, mechanistic and popular. An early iteration reported that the learned model degrades most in EXTREME volatility. That is exactly the story anyone would predict — the kind of thing that gets written into a design document as a known limitation. It did not reproduce across four windows of the same day, and one window detectably inverted it: +0.0693 against −0.1610. Not weakened, not noisy — reversed, inside a single trading day. Withdrawn.
Note the shape of the mistake, because the gate/feature distinction is what would have prevented it. "The model does worse in EXTREME volatility" is a claim about the derivative of performance with respect to regime. It needs the regime axis to be stable enough to differentiate along.
A gate never asks for that. It asks only whether a state is admissible, which survives a noisy regime label. A mislabelled row costs you a trade you did not need to take, rather than a coefficient you will now trade on.
Two further limits in my own record push the same way, and they are the sort that a dashboard hides. Both disjoint reproduction days precede the April 2024 halving, while the original sample follows it. The volatility regime is therefore uncontrolled, and the larger out-of-sample edge may itself be a regime property rather than a stable one. And every fill-hazard panel is a six-hour slice from the start of the day — nothing in the corpus tests whether the skill holds in a different part of the session. Any regime feature fitted on that data would be learning a shape from a single slice of one regime and reporting it as a function.
There is even a trap in the correlation that makes regime features look strong. The volatility-edge relationship is partly mechanical: both quantities are basis points of price movement, so they co-move by construction rather than by insight. What is not mechanical is that the ratio stays stable, and that the placebo arm shares the same volatility while clearing its detection bar in zero cells. A feature-based system reads the raw correlation and finds a strong signal. A gate reads the ratio and finds a threshold.
The detection literature is genuinely good, and mostly orthogonal to this point. Two empirically distinct regimes cluster out of BTC/ETH/XMR high-frequency data without assuming Markovian transitions. And bi-power variation separates the jump component of volatility from the diffusive one, non-parametrically. Better detection makes a better gate. It does not make a shape claim reproduce, because the instability is in the relationship being estimated rather than in the label being estimated from.
Breached when regime enters the model as a feature it can trade off against other evidence — or when a claim about how performance varies with regime is adopted without reproducing it on a disjoint window of the same day.
Size is a decision the direction model must not make
Direction and size answer different questions and fail in different ways. Get direction wrong and you lose one trade's geometry. Get size wrong and you lose the ability to keep playing, which is a different category of mistake — the first is subtractive, the second is terminal. Any system that lets one model emit both will use size to express confidence, and confidence is the least calibrated output a model has.
The betting literature reached this conclusion the hard way. Kelly maximises the expected growth rate and median terminal wealth under known probabilities, and the framework transfers cleanly enough to portfolios with no-leverage and no-short constraints. The catch is the phrase "known probabilities."
Baker and McHale (2013) work through what happens when true win probabilities are replaced with sample estimates: out-of-sample performance degrades, and the correct response is to shrink the bet. Shrunken Kelly beats raw Kelly in both simulation and real betting data. The estimate's error does not average out, because the growth-rate objective is asymmetric — overbetting compounds losses faster than underbetting forgoes gains.
My own system says the same thing in a blunter way, and it is written in the model's own docstring rather than discovered later. The fill-hazard model's label is queue-agnostic: top-of-book only, with a fill rate around 0.73 against a real queue's far lower. So what it learns is which book states attract opposing flow — explicitly not fill probability for sizing.
A model can be genuinely skillful at its target and still be disqualified from a question one step away. The disqualification is a property of the label, and no amount of downstream accuracy repairs it.
Then there is the constraint that outranks the model entirely: the book. Median notional at the touch — the best bid or offer, the only price you can transact at without walking into worse ones — is $22,465 on BTCUSDT, $24,406 on XRPUSDT, $8,853 on ETHUSDT and $1,438 on DOGEUSDT. That last number is the whole quoted depth at the best price on a major perpetual. Size is not a dial the strategy turns; it is a quantity the venue supplies, and it varies seventeen-fold across four instruments a model might otherwise treat interchangeably.
Two measured facts make even those numbers optimistic. Displayed touch depth is an upper bound on available size, not a promise. A maker joining the touch stands behind all of it, and modelling that queue cut the exit fill rate by 3.1×. And the aggressive route's arithmetic assumes the touch absorbs the whole order at the best price, with no walking of the book.
That holds only for orders small relative to top-of-book size. When it does not hold, it errs in the optimistic direction. Both biases point the same way, which is the way that hurts.
So size is computed, never proposed. It comes from the risk layer as a function of book depth, current exposure and the regime gate's verdict — inputs the model does not supply and cannot overwrite. The proposer moves three numbers, and none of them is size. That is not a limitation imposed on an otherwise-capable model. It is the recognition that the model was trained on a label that answers a different question.
Breached when a model emits direction and size from one head — or when position size is set from a fill model whose label was never fill probability — or when the book's displayed depth is treated as available size rather than as an upper bound on it.
III. What counts as evidence: simulators, deflation and decay
The backtest is the model's reward function — keep it pessimistic
The opening promised the sharpest trap; this is where it pays off, and the mechanism is more specific than "the backtest was optimistic". A fill-at-touch simulator fills every resting order the moment price touches it. Touching is exactly what price does when it is about to keep going, so the simulator hands the strategy the adverse-selected subset — every fill the market would have given it, and none of the restraint the market would have shown.
Whatever grades the proposals is the objective being maximised. There is no separate loss function the AI secretly respects, and no amount of care in the model can compensate for a grader that rewards the wrong thing.
So my gate-grade fill model uses both pessimistic levers at once: no at-touch fills, and passive orders wait behind a queue the backtest could not observe. A run under the optimistic profile is INADMISSIBLE, which is a different verdict from FAIL. The distinction carries weight. A failed gate is evidence about a strategy; an inadmissible report is evidence about nothing, and the gate refuses to open it.
What took me longer to learn is that the fill assumption is only the first of three axes, and it is the one people already argue about. The second is which data the simulator was allowed to read. My archive holds 24 hours per instrument-day. Every experiment I had run used six.
75% of the data on disk had never been read, and reading it cost zero bytes. Meanwhile three separate queued items were asking a human to authorise buying more archive, at roughly 155 MB per instrument-day. A backtest that silently samples the same six hours is not a cheaper backtest. It is a different, easier reward function, and the strategy that wins under it has been selected for those hours.
The third axis is what the harness counts as an independent sample, and it moves conclusions further than either of the others. Reading all four windows gave 44 panels instead of 11. At the panel level, 7 of 10 pairwise arm comparisons clear 0.05, and order-book imbalance beats every other arm including both learned ones. But four windows of one instrument-day share that day's regime, news and funding cycle, so 44 panels are not 44 independent samples.
Clustered by day, exactly 1 of 10 survives. The honest report leads with the conservative number and brackets the other: windows within a day are correlated but not identical, and no claim should depend on that correlation being zero. Concretely, imbalance over the gradient-boosted arm is P = 0.00126 unclustered and P = 0.07031 clustered — so "the classical arm beats the learned one" is suggested, not established.
Note what an optimiser does with those three dials if you leave them exposed. Nothing in a fill-at-touch assumption, a six-hour window or an unclustered panel count is a lie. Each is a defensible modelling choice, and each independently inflates the reported result.
An agent asked to maximise a metric will find the joint setting that maximises it, and will be able to justify every component. This is why the levers are pinned in the harness rather than passed as parameters. Not because the model would cheat, but because it would optimise — which under a misspecified objective is the same thing.
The simulation literature is mostly a record of people discovering that markets react and simulators do not. The Queue-Reactive model of Huang, Lehalle and Rosenbaum became the standard tool for a reason: it made the book's evolution depend on its own queue state. Current work extends it by relaxing queue independence and learning order-size distributions, while keeping the point-process foundation interpretable (MDQR, arXiv:2501.08822). Behind it sits a long agent-based lineage — Kim–Markowitz, Cont–Bouchaud, Lux–Marchesi — catalogued by Samanidou, Zschischang, Stauffer and Lux. Economists and physicists built those models to generate their own stylised facts rather than replay them.
One reassurance from the wider read is worth recording, because it cuts the other way. Requiring the queue ahead to clear was the correction that turned XRPUSDT's +0.2877 bps per row into −0.0403 on the original 11 panels. On all 44 it holds: 0 of 44 panels positive per row, and 43 of 44 resolving negative — BTCUSDT 16/16, ETHUSDT 12/12, DOGEUSDT 8/8, XRPUSDT 7/8. A pessimistic assumption that survives quadrupling the data is no longer just a conservative choice. It is a finding. It is pessimistic about how often I fill, though, and the cancellation measurement showed it is not pessimistic about what filling costs — a distinction worth carrying, because "conservative" is a claim about one axis at a time.
The cost of getting this backwards is on the record, and it is larger than anything measured here. The Red Queen's Trap (arXiv:2512.15732) is the post-mortem of "Galaxy Empire," a hybrid coupling LSTM/Transformer perception with a genetic "Time-is-Life" survival mechanism — the DRL-plus-evolutionary pairing "frequently hypothesized to be the 'Holy Grail' of algorithmic trading." A population of 500 autonomous agents ran in a live high-frequency crypto environment, and the two numbers it reports are validation APY above 300% against live capital decay above 70%. Same system: one number from the selection environment, one from the market.
It names three failure modes rather than settling for "it overfit." Overfitting of aleatoric uncertainty in low-entropy series. Survivor bias inherent in evolutionary selection under high variance. And "the mathematical impossibility of overcoming microstructure friction without order-flow data". A gap that wide is not a tuning problem — it is the selection procedure measuring itself, which is the failure this whole principle exists to prevent.
Breached when any promotion evidence comes from a fill assumption the venue would not honour — or when "backtest passed" is accepted without asking which fill model graded it, which hours it read, and what it counted as an independent sample.
A defensible choice that flips your sign is a degree of freedom, not a detail
The horizon sweep had a problem the previous principle named: at long horizons the forecast degenerates to one side and the strategy quietly becomes the benchmark. The obvious fix is to forbid that — force the predictions to balance. There are several equally reasonable ways to do it, and choosing between them looks like an implementation detail.
It is not. Re-running the sweep under two defensible balancing schemes, the long share behaves as intended (0.31–0.76 where it had been 0.94–1.000), and 0 of 20 cells produce a residual exceeding its own error bar. That much is only more of the same null. The finding is what happens to the signs: three of ten cells reverse between the two schemes. One instrument at six hours reads −0.908 bps under one balancing rule and +1.624 under the other — same data, same model, same horizon, opposite conclusion.
Exactly one cell is positive under both schemes with all six folds agreeing each time, and it earns +0.218 and +0.100 bps against a 3.4 bps toll. The best cell anywhere reaches an edge-over-toll ratio of 0.8346 while sitting at 0.28× its own detection bar, and survives Bonferroni across the twenty cells at p = 0.625 — which is to say it does not survive at all.
The literature calls this analytic flexibility and has measured it directly. Twenty-nine teams given the same dataset and the same question returned effect sizes ranging from strongly positive to null; independent analysts testing identical hypotheses on identical data produced radically dispersed conclusions. Those studies needed many analysts to expose the spread. A sweep exposes it with one, because it runs the alternative specifications side by side and prints them in the same table.
For an autonomous loop this is the sharpest available warning. An agent asked to "handle the one-sidedness" will pick a balancing scheme, defend it competently, and report the cell that scheme favours — with folds agreeing and a plausible narrative attached. The defence will be sound. The result will still be an artefact of a choice nobody registered as a choice. The protection is not better judgement at the moment of choosing; it is running both and reporting the disagreement as the finding, which is how three reversing cells became visible instead of one confident number.
Breached when an implementation choice with no principled basis is made once and not swept — or when a result is reported without checking whether an equally defensible alternative reverses it — or when disagreeing tests are reported as a spread without asking which of their assumptions the data violates — or when an interval's nominal coverage is quoted without measuring what it actually achieves on data carrying your dependence structure — or when a tolerance is tightened below the precision of the statistic it gates, so an empty result reads as a strict one — or when a test statistic is chosen for how precisely it can be measured rather than for how much it can reject.
A test is a claim, and it needs validating too
Sweeping the arbitrary choices in an analysis has a counterpart one level up, in the choice of test — and there the disagreement sometimes resolves rather than merely being reported. Asking whether the carry's monthly excess clears zero, on one set of 41 observations: a sign test clears on 1 of 4 instruments against a Bonferroni family bar of 0.0125 — nominally, as it later turned out; a bootstrap median interval excludes zero on the same 1 of 4; and Wilcoxon signed-rank clears on 3 of 4, at p = 0.009373, 0.004634 and 0.001676. Three defensible tests, two answers.
The tie-break is not preference. Wilcoxon gives the most favourable answer available and it is the test whose assumption this data breaks — its null is symmetry about zero, and the excess is right-skewed by a measured 1.60× to 2.26× (mean over median). So the rule looks simple: before reporting the spread, check which choice your data has disqualified.
I applied that rule and stopped one test too early, which is the more useful half of the story. Having disqualified Wilcoxon I treated the bootstrap as assumption-free, and it is not — it resamples months as if they were exchangeable, and the monthly excess carries a lag-1 autocorrelation of +0.499 to +0.558, pooled +0.530. The eight-hourly persistence survives aggregation all the way up to monthly. Blocking is warranted, so the honest move was to re-run it as a moving-block bootstrap and then ask the question I had not asked of any of the three: what coverage does this interval actually achieve?
Measured against a known truth — 2,000 simulated series of 41 observations at the autocorrelation the data shows — the nominal 95% interval realises 0.7505 to 0.8345, a shortfall of twelve to twenty percentage points, and the nominal 98.75% family interval realises 0.8565 to 0.9085. Recalibrated to its true quantiles, the one cell that had excluded zero no longer does: [−1.0804, +4.7519] and wider at every other block length, with no block length clearing at the family level. The surviving result was an artefact of the interval being too narrow. Every test that appeared to clear was clearing on an assumption nobody had measured, mine included. On the pooled series — the portfolio a desk would actually hold — the median is +1.3949% a year, the sign test reads 26 of 41 at p = 0.117275, and the bootstrap interval [−0.0394, +2.5215] includes zero even uncorrected — and goes on including it at every block length out to [−0.108, +4.672]. The honest limit is that resampling 41 months twenty thousand times is still 41 months; a bootstrap cannot manufacture information it was not given.
The strongest count anywhere in this thread makes the size of the correction concrete. Across the full series the excess is positive in 49 of 71 months, which carries a binomial p of 0.001820 — comfortably past any bar you like. Judged against nulls that reproduce how the series actually behaves, its empirical p is 0.12212 to 0.39613. The naive statistic understated by roughly two orders of magnitude, and the entanglement between the validation statistics and the count is 0.2865, so that is not an artefact of validating on the thing being tested.
One more trap sits inside that machinery, and it is the kind that looks like rigour. Tightening the admission gate to a fifth of its original tolerance admitted zero nulls, which reads as a decisive negative until you ask what the statistics are measured to. Bootstrapping their sampling error gives standard deviations of 0.1331 and 0.1204 on the autocorrelations and a 95% interval of 3.1648 to 15.5020 on a tail ratio observed at 6.483. The tight gate sat at 0.38 and 0.29 standard deviations — three times finer than the quantities it was gating. It rejected everything because nothing can be measured that precisely, not because nothing fits. A tolerance finer than your measurement precision is not strict; it is broken. Derived from the sampling error instead of chosen, the gate admits 160 of 500 and the answer is unchanged.
Deriving the width of a gate from precision is right; picking which statistic to gate on that way is not, and I did both before noticing the difference. Ranked by precision, the incumbent statistic came fourth of five and the apparent winner was a bounded quantity whose small standard deviation is a property of being bounded rather than of measuring anything well. Ranked by power — how much of the plausible null region each gate can actually reject — the order inverts: 0.6096 for the best, 0.3665 for the incumbent, 0.3147 for the precision winner, and 0.0319 for the full-distribution tests that ought by reputation to be strongest. At seventy-one observations a Kolmogorov–Smirnov test admits 243 of 500 candidate nulls. Precision and power are different axes, and a statistic can be sharp about a quantity that does not separate anything.
The reason to report all of that rather than the best gate alone is what happens when you run every one of them. Seven gates, chosen on different criteria and disagreeing about which nulls to admit, produce the same lower bound to five decimal places — 0.13583 on the full series, 0.51617 to 0.51950 on the recent era — and not one clears the 0.0125 bar. An answer that survives seven ways of being wrong about the instrument is worth more than an answer from the instrument you liked best.
Physics settled the shape of this argument decades before I met it. Theiler and colleagues' method of surrogate data made the discipline explicit: to claim a feature is real, generate ensembles that share everything about the series except the feature, and ask whether the observed value stands out against them. Everything above is that method meeting its own fine print — the surrogates have to actually reproduce the series, the statistic has to be able to reject something, and the gate has to be no finer than the measurement. Simulation-based power analysis is the other half: a test you have not measured the power of is a test whose silence you cannot read.
Breached when disagreeing tests are reported as a spread without asking which of their assumptions the data violates — or when an interval's nominal coverage is quoted without measuring what it actually achieves on data carrying your dependence structure — or when a tolerance is tightened below the precision of the statistic it gates, so an empty result reads as a strict one — or when a test statistic is chosen for how precisely it can be measured rather than for how much it can reject.
What explains a result is rarely what predicts it
One configuration of mine returned −33.3 bps per hour on one panel and −1,396.4 on another — the same instrument, the same rule, a 42× spread wider than any dial the investigation had swept. Explaining that spread looked like the obvious next move, and it was, but not for the reason I expected.
Four candidate drivers, each measured three ways: how well it explains the result in the same window, how well it explains the next window, and how strongly it persists from one window to the next.
| Driver | Contemporaneous | Lagged | Persistence |
|---|---|---|---|
| Realised volatility | −0.9585 | −0.1626 | 0.2159 |
| Trades per second | −0.9319 | −0.1064 | 0.0391 |
| Median spread | −0.406 | −0.4732 | 0.9993 |
| Queue notional | 0.4877 | 0.3888 | 0.9064 |
Read down the columns and the two halves never meet. Volatility carries the entire result at −0.9585 and collapses to −0.16 one window later, because it barely persists at that window length. The spread persists almost perfectly at 0.9993 and was never carrying anything. At n = 21 the 95% band on a correlation is about ±0.43, so every lagged figure except the spread's sits inside the noise.
The finding stated plainly: what explains is not predictable, and what is predictable does not explain. A variable earns a high explanatory score by moving with the outcome; it earns a high predictive score by being knowable first. Nothing requires one to imply the other, and here they were close to mutually exclusive.
The same two quantities come apart in the other direction too, and the article's own best result is the example. The ten-minute forward return is forecastable out of sample and transfers verbatim across instruments — genuinely predictive — at a correlation of 0.0199. Square that and it explains 0.04% of the variance in the thing it predicts. As an explanation of what moves a ten-minute return it is worthless; as a prediction it is the only well-powered positive return forecast in this corpus. A variable can carry almost no explanatory weight and still be the most useful thing you have, and the reverse — volatility at six-hour windows, which carries the entire result and predicts none of it — is equally true.
This is the distinction Shmueli's To Explain or to Predict? draws formally — explanatory and predictive modelling optimise different things and select different variables — and it is worth knowing that a feature-importance table answers the first question while a trading system needs the second. An AI handed the full driver set and asked "what drove this?" returns volatility, correctly, and hands you a variable you cannot know in advance.
The sting is that the conclusion was a statement about my measurement window, not about the market. Volatility's persistence is 0.2159 over six-hour windows and 0.5725 over one-minute windows — the same variable, measured on a different clock, moving from unactionable to the one predictor this investigation resolved. I nearly filed "volatility is not predictable" as a finding. It is not a finding. It is a description of the unit I happened to be measuring in.
Breached when a driver is promoted from an explanatory table into a predictive feature without a lagged measurement — or when "X does not predict Y" is recorded before the claim has been re-run at the horizons the strategy actually operates on.
A result must be deflated by the search that found it and the overlap that measured it
Two different corrections stand between a backtest number and a claim, and a system that applies one while forgetting the other will publish false positives at a steady rate.
The first is the multiple-testing correction, and quantitative finance has already had this argument. Harvey, Liu and Zhu (2015) worked through the cross-section of expected returns. Their conclusion: given how many factors have been tried, a new one needs a t-statistic above 3.0.
Most claimed findings in the literature are likely false. Bailey and López de Prado's deflated Sharpe ratio makes the same adjustment operational for a single strategy. It corrects for selection bias, the number of trials and non-normality, with the probability of backtest overfitting as its companion diagnostic.
The framing that stuck with me is that backtest optimisers search millions of parameter combinations and then report the best one as though it had been the only one. The machine-learning era has complicated this rather than settled it. Zhang, Li, Peng and Chen's one-switch leakage benchmark finds performance inflation is "highly selective". It attaches to specific evaluation conventions — centred temporal features, same-day-open execution — rather than applying as one global discount.
The second correction is the one I keep watching kill results, and it has nothing to do with how many strategies were tried. It is about whether the rows that measured a strategy were independent. Sample a forward window of length H on a panel whose rows arrive every T/n, and overlapping windows share their outcome. The bound is arithmetic: n_ind ≤ min(n, T/H), so the effective-n inflation is √(n/n_ind) ≥ √(nH/T), clamped at 1. It bites exactly when the forward window exceeds the mean row spacing, and it grows as √H.
Measured on my panels, whose mean row spacing is 288 ms, that inflation runs 1.18× at 50 ms, 1.95× at the 800 ms horizon two of my experiments actually use, 2.14× at one second, 4.29× at five, 10.26× at thirty, and 32.07× at five minutes.
Those are measured values, and they sit above the closed form rather than on it — the formula gives 1.67× where the panel gives 1.95× at 800 ms. That is the direction the bound guarantees: min(n, T/H) is an upper bound on the independent count, so √(n/n_ind) is a lower bound on the inflation. The two converge as the horizon grows, matching to within about 1% by thirty seconds. A figure re-quoted against the formula therefore understates its own damage, and never overstates it.
Here is what that does to a real result. One cell in my abstain-router sweep came back positive: DOGEUSDT on 2024-03-28 at a zero maker fee, logistic router, delta +0.005311 against a raw minimum detectable difference of 0.003309. It cleared. It also traded 35 rows out of 21,600, and its effective-n inflation was 24.84×, which lifts the MDD to 0.082209 — roughly fifteen times the effect. Not resolved. That was the third would-be positive in this corpus killed by an effective-n correction rather than by a worse result, and the first two died the same way.
The property that makes this usable by an AI system is that the correction is arithmetic, not an empirical curve. Any recorded figure that reports its n, its horizon and its window span can be re-quoted without re-running the experiment that produced it. So the whole back catalogue is auditable: of 946 cells marked resolved, 944 sit in scripts that apply the correction, and the audit found zero unprotected thirty-second resolutions. That matters most precisely when an agent is generating claims faster than a human can re-derive them.
The audit's limit belongs in the same breath, because it is the sort of thing that quietly reintroduces the problem. It reads results files only. A figure quoted in prose and never written into a results JSON is invisible to it — and research prose quotes numbers constantly. An auditable corpus is one where every number a conclusion rests on was written down as data, not as a sentence.
Independence deserves one more paragraph, because it is the failure this investigation keeps meeting in different costumes and I did not recognise it as one failure until late. It arrived as two symbols agreeing on a crossing point that turned out to be a shared artefact. As four windows of a single instrument-day counted as four panels when they share that day's regime and news. As 144 fold deltas resting on the same 24 instrument-folds. As seven instrument-days spanning only two instruments and four dates, two of them consecutive sessions. As two weightings of one set of fills, read as corroboration when they are one measurement seen twice. And — after this post was already published saying so — as four perpetual contracts treated as four instruments, when their net excess correlates at +0.917 to +0.986 and the effective count is barely above one. Six costumes, one question: how many genuinely separate chances did the world have to disagree with me? The arithmetic is different every time — a closed form here, a sign test there, an effective-n collapse somewhere else — and the question is always the same one, worth asking before the count is written down rather than after.
Breached when a reported edge is not deflated by the number of variants that were searched — or when a forward-looking window is measured on overlapping rows and its sample count is reported as though they were independent.
Half my comparisons were inside their own error bars
Two columns sat in my results files for months without ever being divided by each other: the difference between two arms, and the minimum difference that sample could have detected. Dividing one by the other is the census nobody had run.
310 of 579 arm comparisons — 53.54% — report a difference smaller than their own MDD. Only 269 resolve at all, and the median near-collapsed pair sits at 0.357 of its bar. Two families are at 100%: one contributes 55 comparisons with zero resolved, another 3 with zero. A third runs 79.4%. For half the table, the number in the cell is smaller than the noise the experiment admits it has.
Be precise about what that does and does not mean, because the honest reading is narrower than the alarming one. A near-collapsed arm is not a wrong result. Most of this corpus's verdicts are nulls, and a null over unresolved arms is still a null — arguably a better-supported one, since failing to detect a difference is exactly what an underpowered comparison should report. What 53.5% means is that the tables claim a resolution the samples do not support. A reader who ranks two such rows against each other is ranking noise.
The scope needs stating too. Only 7 of 146 results files carry a paired difference-and-MDD field at all. The other 139 are not measured as resolved or unresolved — they are unmeasurable by this instrument, so 53.5% is a rate over the subset that happened to record its own error bar. The files that never wrote one down cannot be audited, which is its own finding.
One column comes through this census untouched, and it is the one the whole investigation was about. The learned model against the best classical baseline is 44 of 44 resolved negative — zero positive, zero near-collapsed. Against a plain logistic it wins 26 of 44, which is how a model earns a reputation. Against the best classical arm available it has never once won a resolved comparison. That is independent corroboration of a null this corpus reached from different data, a different model family, and much earlier iterations.
The obvious rebuttal is that the learner was under-tuned, and it has now been tested directly. Removing hyperparameter selection entirely — ensembling each model class across its whole grid, six linear members, four binned, thirty-six random-feature, each z-scored by its own training moments before averaging — produces 0 of 48 fold deltas resolved, and 0 of 144 across the three experiments that tried it. An ensemble over a grid is a strictly stronger learner than any member it contains, so the null stops being about the search and becomes a statement about the model class. Removing selection moved the random-feature arm by −0.084 to +0.035 bps and the linear arm by −0.007 to +0.006 — the tuning everyone argues about was worth less than a tenth of a basis point.
One caveat travels with that 144, and it is the kind the count invites you to forget: 144 fold deltas are not 144 independent tests. All three experiments share the same 24 instrument-folds, the same features and the same data, differing only in model class and in how hyperparameters are handled. The right reading is that the null is robust to the search procedure, not that it has been confirmed 144 times.
The wider literature has been making this argument for a decade, usually about biomedicine. Studies with low statistical power raise the chance that a significant finding is a false positive, and treating a significance threshold as a licence to claim a finding distorts the process that produces the claims. A backtest sweep is the same machine with more cells and no referee. The remedy that transfers is not a better test — it is writing the error bar into the results file next to the difference, so the ratio can be taken later by someone who was not there.
Breached when a results table reports a difference without the minimum difference that sample could resolve — or when two arms are ranked against each other without checking that either is separated from the other by more than its own bar.
Measuring consistency destroys the power to measure it
"Does the edge hold across regimes?" is the question every reviewer asks and the one this corpus could never answer. Not because the answer is no — because asking it costs more power than the sample had to spend.
The pre-registered form was: partition by volatility regime, then report the variance of the edge across buckets. Scored on exactly those terms, 0 of 12 regime cells resolve against their own error bars — the best reaches 0.3165 of its bar, 7 of 12 are positive — and 0 of 24 calm-versus-volatile gaps resolve. Only one instrument is positive in all three regimes.
The reason is structural rather than unlucky, and it generalises. A three-way split costs √3 ≈ 1.732× in detectable difference before anything else happens. Measured, it cost 1.81× to 2.24×, and the excess has a cause: the partition variable is the outcome's own variance. The volatile bucket carries fewer rows and two to four times the sigma — 60.4 bps against 18.8 on one instrument. So the bucket the consistency question most wants to read is precisely the one it has least power to read.
Pooling was the last lever, and it did not close it either. Across 615,594 decisions the edge is monotone in the right direction — calm +0.00492, mid +0.04503, volatile +0.11081 bps — and the volatile-minus-calm gap of +0.10589 sits at 0.5264 of its deflated bar. Closer than any per-instrument cell, and still unresolved. The fold sign test reads 16 of 24, p = 0.152. Closing it would need 3.61× the data — roughly 12.3 years across four instruments.
So the honest verdict is unmeasured, not stable, and the distinction is the whole point. A stability claim needs cells that are both resolved and close together; these are neither, with a cross-regime range of 1.5× to 13.4× the mean. Reporting "the edge is consistent across regimes" from this evidence would be reporting the absence of resolution as the presence of agreement.
That failure mode has a name outside trading. False negatives from underpowered samples get far less scrutiny than false positives, and a subgroup analysis is where they concentrate — you split the data, lose the power, find nothing, and report the nothing as reassurance. The monotone ordering across three buckets is worth 1/6 by chance on its own, which is roughly how much I should read into it.
Breached when a consistency check is reported as passed rather than as unresolved — or when a partition is made on a variable correlated with the outcome's variance without pricing the power it costs.
Deleting the model does not leave you the classical rule
This investigation came within one automated check of publishing its first positive result, and the check was honest. The question was whether a learned exit policy earns its place: does deleting the model make things worse? The screen compared the learned hazard against the classical threshold rule and found it better by +0.2582 and +0.3036 bps, with a sign test at 8 of 8 panels and p = 0.0078 on both instruments. By that comparison the model is load-bearing, and the result would have gone into the record as measured. That p also counts panels as though panels were independent trials, which this post has since learned not to assume — but the fatal problem is upstream of the statistics.
It is wrong, and the reason is a sentence rather than a statistic. Deleting a model does not leave you holding the classical rule. It leaves you holding everything that contains no model — and the do-nothing arm is one of those. The classical threshold is forced to act on 51.9% of fills, and in this market acting is what loses money, so beating it measures the cost of being obliged to trade rather than the value of the model. Against the honest model-free arm — always cross, decide nothing — the learned policy ties on BTCUSDT at +0.0000 and loses on ETHUSDT at −0.0131, beating it on 0 of 8 panels.
What gave it away was not a statistic either. It was reading the learned arm's own action rate: 0.82% of BTCUSDT fills, 5.60% of ETHUSDT's. On the other 99% it is the always-cross arm. A policy that acts on one decision in a hundred and inherits the baseline on the rest cannot be evaluated against a rule that acts on half of them; almost all of its measured margin is the baseline it is quietly borrowing. The rule that came out of this is blunt: a policy acting on under a quarter of its decisions must be graded against not acting.
The estimate underneath it is not the problem, and this is the distinction the whole episode turns on. The hazard model's Brier skill against the base rate is +0.0784 and +0.0731 — it genuinely predicts which passive exits will fill. The forecast is real; it is the decision that has nowhere to go, because the only action it licenses is abstention and abstention's ceiling is the arm it abstains into. A good estimate and a worthless policy are entirely compatible, and reporting the first as though it implied the second is the most flattering mistake available.
The exit itself deserves its own line, because it explains why there is no policy to find. A passive exit is a lottery with a catastrophic losing side: on BTCUSDT it pays +0.0154 bps when it fills and −1.8468 when it has to chase, at a fill rate of 0.4731, for an expectation of −0.966 bps against −0.0084 for simply crossing — about 115× worse. The mechanism is the same adverse selection that closes the entry, running backwards. Your resting exit fills when the price is coming back to you, which is when holding was fine, and misses when the price is running away, which is exactly when you needed out. Across both lanes, 0 of 16 instrument-arm cells is positive.
The published version of this mistake is well documented and cost the field years. A systematic reproducibility analysis of neural recommendation research took 18 algorithms from top-level conferences, could reproduce only 7 with reasonable effort, and found 6 of those 7 were often outperformed by comparably simple heuristics — nearest-neighbour and graph-based methods. Its authors name the cause directly: the reproducibility of results, and the choice of the baselines when proposing new models. Lin's account of the same pattern in retrieval frames it as a community-wide moment of self-reflection about whether empirical advancement matched the rate of publication. The screen is rarely dishonest. The baseline is chosen.
Breached when a model is credited for beating the rule it replaced rather than the best option containing no model — or when a policy's action rate is not reported beside its margin, so a result inherited from the baseline reads as a result produced by the model — or when a genuine gain in an estimate is reported as though it were a gain in a decision.
A variance correction is a hypothesis, not a fix
Comparing two arms on the same rows instead of on separate ones should tighten the error bar, because the shared noise cancels. It does, and the size of the effect is worth knowing: across the comparisons in my corpus that were measured on shared rows, the unpaired bar is a median 3.14× the paired one and at the extreme 241.65×. A correction that typically thirds your error bar is not a rounding adjustment. It is the difference between a result and a shrug.
So the obvious move is to pair by default, and that move is wrong. The 3.14× was measured on row-level pairing — the same fills scored under two exit rules. Pairing the same corpus at the panel level instead does the opposite: the median error bar got 3.2× wider, a ratio of 0.31. Same technique, same data, opposite sign, and the only thing that changed was which unit the pairing was done at. "Pair by default" was withdrawn the day it was measured.
The reason is not subtle once seen. Pairing cancels the noise the two arms share, so it helps exactly to the degree they saw the same conditions. Two exit rules over identical fills share almost everything. Two arms compared panel-by-panel share a panel — but the panel-to-panel variation is itself the dominant term, and blocking on it throws away the averaging that was doing the work. The technique does not know which of these you have. You have to measure it, per corpus, in the direction you intend to apply it.
There is a second lesson under the first, and it is about how little the correction bought. Only 222 of 5,884 pairwise comparisons — 3.8%, in 5 files of 68 — were measured on shared rows at all, so the correction was applicable to a twenty-fifth of the corpus. Applying it where it was applicable moved 117 reconstructible comparisons from 6 resolved to 11, rescuing 5. Corpus-wide the resolved fraction went from 0.391 to 0.392. A technique that thirds an error bar changed five comparisons out of 5,884, because the population it could reach was tiny. Effect size and reach are different quantities, and the second one is the one that decides whether a fix matters.
The comparison literature has been careful about this for twenty years, and the care is mostly about which test rather than whether to correct. Demšar's review of statistical comparisons of classifiers over multiple data sets observes that tests for comparing two algorithms on one data set had been scrutinised for a long time while comparisons of more algorithms across many data sets had been "all but ignored", and reviews the suitable tests theoretically and empirically. García and Herrera extended it to all pairwise comparisons — which is the regime a sweep lives in, since a grid of arms is a full pairwise table whether or not you report it as one.
Breached when a variance-reduction correction is adopted because it is standard rather than because it was measured on the corpus it will be applied to — or when the level at which units are paired is left implicit — or when a correction's effect size is reported without the share of results it can actually reach.
A null is only evidence of absence if the design could have seen the effect
Every figure in the decision thread had come from a single session, so I ran the same test on all seven archived instrument-days. The result is the most positive thing in this investigation and it changes nothing: 7 of 7 days positive, all seven resolving individually, a median gain of +0.04474 bps across a range of +0.02386 to +0.11718. And 0 of 7 beat the 0.1660 bps per-fill edge the strategy needs. The effect is real, reproducible, individually resolved, and roughly a quarter of the size required — the median is 3.7× short.
That last sentence is only worth writing because of what comes next. A null means nothing on its own; it means something once you show the design would have caught the thing you cared about. Here the per-day bars run 0.01134 to 0.03849 bps against gains of 0.02386 to 0.11718, so each day resolves its own small effect by 1.5× to 3.8×. An effect at the 0.1660 bps edge would have resolved on every one of the seven days by a factor of 4 to 15. That is the difference between I did not find it and it is not there at the size that would matter, and only the second is a result.
The sign test is where I have to argue against my own headline. Nominally, seven positives out of seven is p = 0.015625 — except that treats seven instrument-days as seven independent trials, and they are not. They span two instruments and four dates, two of which are consecutive sessions of one week. Taken instrument by instrument, BTCUSDT gives 4 of 4 at p = 0.125 and ETHUSDT 3 of 3 at p = 0.25: neither instrument alone resolves the sign test. The effective number of trials is below seven and I did not quantify it. What survives is narrower and better than the number I would rather quote — each day resolved against its own bar, which is seven separate within-day measurements rather than one pooled claim.
A second reading looked like corroboration and is not. Weighting the same fills by volume instead of by count gives 6 of 7 positive with a median of +0.04885, which agrees closely with the unit-weighted +0.04474. Agreement between two weightings of the same rows is reassuring; it is not independent evidence, because it is the same fills seen twice. And the volume-weighted arm resolves on 0 of 7, because volume weighting collapses the effective sample by 20× to 45× — the same effective-n arithmetic that governs overlapping windows, arriving through a different door.
Statistics has a name for the move this principle demands, and it is not the significance test. Lakens, McLatchie, Isager, Scheel and Dienes put it flatly: it is neither logically nor statistically correct to conclude an effect is absent from a nonsignificant p value. The frequentist repair is an equivalence test, which asks whether the effect is smaller than the smallest size you would care about — testing against a bound you chose in advance rather than against zero. The 0.1660 bps edge is that bound here, which is why 3.7× short, and the design would have resolved it by 4 to 15 is a result while not significant would not be. Most of what a trading investigation produces is nulls, and a null that cannot say what it would have detected is a shrug with a p-value attached.
Breached when a null is reported without stating the effect size the design could have resolved — or when a sign test over units sharing an instrument, a venue or a week is quoted at its nominal p — or when two weightings of the same rows are presented as independent corroboration rather than as one measurement viewed twice.
A clean scan measures your detector, not the world
Four times in this investigation a module's own generated verdict has contradicted the results file sitting beside it. The clearest case read one point of a five-point robustness curve — the single point at which the result still resolved — and reported that the gain survives, when the curve collapses at the next depth. The pattern is identical every time: a summary line written when the module was designed, evaluated against numbers it did not anticipate. It is the machine confidently mis-stating its own output, and it is the most AI-native failure in this post.
So the class got a detector, and the honest thing to report is how badly it works. Measured against the four known cases as a labelled set, it catches 2 of 4, and 6 of its 8 flags are false positives — mostly legitimate scope statements like naming which instruments a result covers. Both misses have identified causes: one verdict says "48%" where the numeral pattern requires three or more decimals, the other says "the ten largest fills" where the subset pattern requires a digit. I did not re-tune it on the set that revealed those misses, because a detector tuned on its own failures has been fitted to them rather than fixed.
Then it scanned 165 results files and found zero previously unknown cases, and that zero is worth almost nothing. A detector with 50% recall finding nothing new is equally consistent with there being nothing and with there being as many again. The detector also fails a standard I had written into its own docstring before running it — that anything not flagging the known four is not detecting the class — and reporting that failure as the headline, rather than leading with the reassuring zero it produced, is the only thing that makes the exercise honest. The conclusion is that this class is real, recurrent, and not cheaply detectable; the remedy is disclosing generated verdicts as claims rather than trusting a better scanner.
The same discipline turned on my own hand-written prose gives the sharper version. Across 203 records, 428 numerals carrying four or more decimals: 328 trace to their own record, 100 to elsewhere in the corpus, and zero to nowhere at all. A clean bill — until you price it. The corpus holds 52,526 distinct numbers, 25,340 of them between 0 and 1, so a fabricated four-decimal value in that range matches something by chance 35.47% of the time at the tolerance used. Zero found therefore rules out five or more fabrications at roughly 99.5%, and is entirely consistent with one or two. And coverage is 11.6% — 428 of 3,675 prose numerals have four decimals, so every count, percentage and integer ratio sits in the 88.4% the scan cannot see, which is exactly where the one error I did find was hiding.
There is a constructive half to this, and it is the more useful one. When a test is discarded for circularity, the replacement has to be shown not to have the flaw — measured, not asserted. The statistic that closed several of these cells validated a null against the series' longest run, which forces the null to reproduce the very count being tested: its correlation with the count runs 0.7730 to 0.9855. The sign-free replacement built to escape that has a correlation of at most 0.0173 across forty-five combinations. That gap is the evidence the new instrument is actually new.
It then admitted nothing, which is the part worth sitting with. No cell passed — and the reason was a criterion nobody had tested, with nothing to do with the circularity that had been fixed: the magnitude distribution. The observed ratio of the ninetieth percentile to the median of the absolute excess runs 4.270 to 7.917, while a Gaussian AR(1) produces 1.450 to 2.379 at every dependence from none to 0.9. The family cannot make tails that heavy, so it is rejected in five of five cells on shape alone. Repairing an instrument does not hand you the answer; it hands you the next obstacle, and the honest limit is that only one null family was tried, so "no valid null" means none in that family.
This is the base-rate problem wearing a software costume, and the security literature settled it decades ago. Axelsson's analysis of intrusion detection shows that when the thing you are hunting is rare, the false-alarm rate — not the detection rate — is what governs whether the output means anything. Recent work asking how far large language models get at triaging thousands of static-analysis warnings is the same question with a newer instrument. Neither result licenses the move I keep wanting to make, which is to read a clean scan as a clean system.
Breached when a scan's null result is reported without its recall on a labelled set — or without the rate at which a fabricated value would match by chance — or without the fraction of the population it can see at all — or when a detector is retuned on the very cases that exposed its misses and then described as improved — or when a replacement for a discarded test is not measured against the flaw it was built to escape.
A number you cannot recompute is an exposure, not a fact
The previous principle asks whether a difference clears its own error bar. This one asks something cheaper and, at scale, more useful: can the number be recomputed from what the record kept?
I audited every countable claim across 177 iteration records to find out. Ninety-eight significance figures could be recomputed from the win-and-tie counts stored alongside them, and two did not reproduce — one reported 0.0386962890625 against an exact 0.03857421875, the other 0.15234375 against 0.15158963. Relative errors of 0.32% and 0.50%, neither crossing the 0.05 threshold, so no conclusion moved. The interesting part is not that two were wrong. It is that ninety-six could be checked at all.
The rest of the record is where the exposure sits. Of 872 prose tallies — "9 of 11", "43 of 44" — 644 have a denominator that appears as a structured count in the same record and 228 do not. That is 26.1% of the corpus's countable claims that no audit can verify, not because they are wrong but because the number was written once, in a sentence, and never again as data. Separately, 31 of 336 refusal-ledger claims (9.2%) name a check whose required field is missing, every one of them in a record predating the check that would have caught it.
The wider literature calls this reproducibility and treats it as separate from replication — whether the same data and the same procedure yield the same number, before anyone asks whether a fresh sample would. A systematic review across management, psychology and economics finds the concern is a decade old and unresolved, and the empirical record on published replications in finance and accounting is thin enough that the question rarely gets asked at all. My corpus is a single-author version of the same problem, with the advantage that I can audit it exhaustively and the disadvantage that nobody else will.
The distinction matters more than the percentage. The 228 are an exposure, not a defect count. Each may be perfectly correct. What is measured is that nobody can tell — and the one denominator in this corpus known to be wrong was found by hand, precisely because its record no longer had to carry the number twice. An unverifiable claim and a false one look identical from outside, and the cost of the first is that you cannot cheaply rule out the second.
The scan's own limit belongs here too, because it bounds the finding: it only sees tallies written as digits with "of", "/" or "out of". A tally phrased as "a quarter of them" is invisible to it. So 872 is a lower bound on tallies present, and 228 a lower bound on the unverifiable ones.
There is a technique in the repair worth stealing. The checker used to trust a stored significance value; it now recomputes it, and that change was proved non-vacuous by planting the actual wrong figure and confirming the check refuses it, then planting the exact one and confirming it passes. A check nobody has watched fail is not yet evidence of anything — it is an untested assertion about your own tooling.
For a research loop run by a model this stops being hygiene and becomes the load-bearing constraint. An agent generates claims far faster than a human can re-derive them, so the only claims that stay checkable are the ones whose inputs were written down beside them. Everything else is a sentence you will eventually have to take on trust from a process built specifically so that you would not have to.
Breached when a tally reaches a conclusion without its denominator stored as data — or when a computed statistic is read back from the record rather than recomputed from the counts that produced it.
A sweep with no interior optimum is measuring a cost, not tuning an edge
Four separate dials in this investigation were swept properly, and all four came back the same shape: monotone toward their boundary, with no interior optimum anywhere. The exit trigger drove toward not managing the exit at all. The abstention fraction drove toward not trading. The trigger depth drove toward zero. The pull detector's flag rate drove with its own lookahead, from 0.1877 at one quote update to 0.5645 at a hundred, while the delta it was supposed to explain went the other way — +0.0401 bps to −0.4232, with sign tests at 4 of 8 panels and p = 1.0000.
The exit sweep is the cleanest instance. Across 24 arms, the number beating the do-nothing zero trigger on every panel is zero, at both two panels and eight. Of 28 cells, the number with a positive mean is zero. The best cell is BTCUSDT's two-consecutive rule at −0.0487 bps against an MDD of 0.2184 — 4.5× its own distance from zero — and the median cell sits at −0.5395. The dial's optimum is its origin.
That shape is diagnostic, and it is the useful part. An edge has an interior optimum: quote too tight and you are picked off, too wide and you never fill, so somewhere between them sits a best value. A cost has no such point. It just accumulates, so every setting that does less of the activity does better, and the sweep slides to the boundary where the activity stops. Monotone toward "off" is what a toll looks like. An interior peak is what an edge looks like.
This inverts the usual reading of a sweep, including the one the overfitting literature warns about. The dangerous sweep is the one that does find an interior maximum, because that peak is where selection bias lives and where the deflated Sharpe ratio does its work. A monotone sweep cannot be overfit to a peak it does not have. It is telling you something structural instead: you have been tuning the rate at which you pay for something, and the parameter search was never going to find a setting where paying is profitable.
One more property of these sweeps deserves stating, because it inverts the instinct to gather more data. Widening the exit sweep from two panels to eight moved 8 of 28 cells from unresolved to resolved, and every one of them resolved negative. The extra data did not find a better arm. It made the existing answer firmer — the sweep moved from undetermined loss to measured loss. More data sharpens whatever is there, and if what is there is a cost, you get a more precise cost.
Breached when a monotone sweep is reported as a tuned parameter rather than as evidence the dial is a cost — or when more data is collected in the expectation of moving a result rather than of resolving it.
The best setting of each dial is not the best set of dials
Having swept every dial separately, the obvious next run is all of them at once, each at its own best setting. The corpus contains exactly that run: quoting inside the touch at each instrument's best offset, only when the queue ahead is short, with the best wait limit, exiting the instant the displacement first crosses zero — and charging no fee at all, with two of the settings physically unavailable to a real participant. It is the most flattering configuration the corpus can express. I wrote down the additive prediction before running it, which is the only reason the next paragraph is a finding rather than a story.
Predicted: −0.0451 bps on BTCUSDT, +0.1595 on ETHUSDT, +0.0923 on DOGEUSDT. Measured: −0.1324, −0.2159 and −1.0072. Optimistic on three of three, and XRPUSDT did not return a number at all — its best settings leave 0.02% of rows eligible and produced four fills on one panel and one on the other, so its row is absent rather than negative. A configuration that cannot be measured has not been shown to be bad. It has not been shown to be anything, and reporting it as a loss would be the more comfortable error.
The vanishing sample is the mechanism, not an inconvenience. Every dial's best setting is a restriction, and restrictions multiply: eligible fractions run 0.0036, 0.0025, 0.0021 and 0.0002, and the stack trades at 14.5, 9.8 and 7.4 fills an hour against 518 to 2,563 at the unrestricted setting — a 35× to 346× reduction. The configuration that maximises quality per fill minimises the sample that measures it. Stacking every dial at its best is itself a dial, and it is monotone toward "off" like all the others.
Then the interesting part, which is that my explanation of the failure was wrong twice. The first reading was that the improvements are sub-additive. They may not be: the prediction had omitted that the stack also applies a queue filter, whose own main effect is −0.1458, −0.3167 and −0.7659 bps, and whose interaction with the exit rule measures positive on three of three. The second error was an accounting mismatch — the prediction added a mid-exit gross to a crossing-exit improvement, when three of the four terms had already crossed. The identity is exact: crossing equals mid minus the half-spread paid at exit.
That correction is conditioned, which is the part worth stealing. Because the offset arm only quotes when the spread is already wider than the offset, the half-spread at exit is drawn from a selected population, not the general one: 0.0213 bps against an unconditional 0.0071 on BTCUSDT, a ratio of nearly three, and 2.887 on ETHUSDT. Reaching for the textbook half-spread would have understated the correction threefold on the most liquid pair. With both errors repaired the gaps are −0.066, −0.335 and −0.7022, the accounting explains 11% to 36% of each, and the direction survives on three of three. ETHUSDT is the sharp cell: its corrected prediction is still +0.1191 against a measured −0.2159, so the dials promise a profitable maker and the stack misses by 0.3350 bps.
None of this is exotic experimental design; it is the reason the field prefers factorial designs to one-dial-at-a-time. A study of more than thirty designs of experiments across nearly half a million simulated runs uses the full factorial as its ground truth for exactly this reason — reduced designs are judged by what their missing interactions cost. A stack of individually-tuned settings is the most reduced design of all: one cell, chosen by assuming the interactions are zero.
Breached when a configuration's performance is predicted by summing its parts' separately-measured improvements — or when the summed terms were measured under different exit or accounting conventions — or when a stacked configuration's eligible sample is not reported beside its per-unit result, so a result that could not be measured is recorded as a result that was bad.
The grid you swept is not always the grid that ran
A sweep's shape is only readable if its arms are distinct, and mine were not. I measured every instrument's tick directly from 1,795,680 minute bars rather than reading it from a config, and at the median price the tick is 0.0149 bps on BTCUSDT, 0.0409 on ETHUSDT, 0.8699 on DOGEUSDT and 1.5848 on XRPUSDT. That is a 106× spread across four instruments on one venue. A threshold written in basis points is therefore not one setting applied four times; it is four different settings wearing the same name.
The consequence is that an eight-arm sweep is not always eight arms. My trigger sweep specifies eight thresholds in basis points, and against those measured ticks it resolves to eight distinct arms on BTCUSDT and ETHUSDT, three on DOGEUSDT and one on XRPUSDT. The missing arms did not perform badly. They rounded to the same achievable price and stopped being separate questions. This is the same failure the near-collapse census found, arriving one level earlier: there, comparisons were too close to resolve against their own error bars; here, the arms were never apart in the first place. Both look identical in a results table, which prints eight rows either way.
It gets one degree worse, because the tick in basis points is not even a constant within an instrument. It is tick_price / price, so it moves inversely with price — across my sample it ranges 8.87× on DOGEUSDT and 11.58× on XRPUSDT. At DOGEUSDT's low price the tick is 1.8318 bps and all eight triggers die; at its high price it is 0.2065 and only two do; at the median it is 0.8699 and six do. This is also why two of my own iterations disagreed about DOGEUSDT's tick — 0.4631 against 0.8699 — and the disagreement was not an error. Both are right for their price, and neither is right as a constant.
None of this is new to market microstructure, which has treated the price grid as an object of study rather than a rounding nuisance for decades. Hasbrouck models bid-ask dynamics with discreteness and clustering explicitly — quotes restricted to a fixed grid, with a tendency to cluster on natural multiples of the tick. The quantity that matters is relative rather than absolute, which is why Relative Tick Size and the Trading Environment is named for the ratio and not the number. Wu, Krehbiel and Brorsen found the 1997 and 2001 NYSE tick reductions hit high-price and low-price shares differently, which is the same mechanism reappearing in equities. And a systematic review of tick-size changes across exchanges is titled, pointedly, One size fits all?. The answer there is no, for venue design. It is also no for a parameter grid.
The limits of my own audit are worth stating, because they run one direction. My first scan flagged 97 sub-tick parameter combinations and 79 were false positives — fees and dimensionless imbalance thresholds, which a tick does not constrain at all — leaving a strict count of 18. So the false-positive rate is measured, at 81.4%, and the false-negative rate is not measured at all: a basis-point constant whose name does not contain one of the tokens I scanned for is invisible to the scan, and I ran no looser pattern to bound how many exist. The audit also re-grades nothing on its own. A collapsed arm is not a wrong number, it is a number that could not have differed from its neighbour, and whether any reported comparison ran between two collapsed arms is a separate check that is queued rather than done.
Breached when a parameter grid denominated in basis points is reused across instruments without checking that each arm is at least one tick apart at the prices actually traded — or when a sweep's arm count is read from the configuration rather than from the achievable price grid — or when a tick is quoted in basis points as though it were a property of the instrument rather than of the instrument at a price.
Two arrays of the same length are not thereby aligned
One experiment paired per-fill volumes against selected rows and asserted the alignment rather than checking it. Checking it produced the most complete failure in this corpus: 0 of 111,589 rows agree on BTCUSDT and 0 of 89,255 on ETHUSDT, with the first disagreement at position zero. The cause is undramatic. The builder drops 43 rows on one instrument and 29 on the other, and a trailing slice then shifts every survivor by that offset — so a row loss of about 0.04% produced a 100% pairing failure. Nothing crashed, both arrays had a plausible length, and every downstream number was computed from a table where each fill was married to a different fill's volume.
What the defect did not touch is as instructive as what it did. The gains moved — +0.0605 to +0.04885 on BTCUSDT, +0.0667 to +0.12799 on ETHUSDT — while the effective sample sizes barely moved at all, 1,432 to 1,433 and 596 to 597. That is not luck. Effective n depends only on the distribution of the weight vector, not on which row each weight is attached to, so a pure permutation leaves it alone. One earlier conclusion rested entirely on that sample-size collapse and survived untouched; its ratio figures, which depended on the pairing, did not. A defect's blast radius is a property of what each number is a function of, and it has to be worked out per number rather than declared.
That ETHUSDT figure has a second story worth telling, because for a while it was the closest anything in this investigation came to the per-fill bar. Trimming the largest fills by volume gives +0.1280, +0.1315, +0.1520, +0.0372 and +0.0481 at depths 0, 1, 10, 100 and 1,000 — a 76% collapse between trim 10 and trim 100, so the entire gain lives in the fills ranked eleventh to hundredth by size. Two controls settle what that means. BTCUSDT's curve is flat at every depth, +0.0489 to +0.0518, so concentration is not a property of the method. And the forecast's correlation is flat in fill size on both instruments, varying by less than 0.04 across volume quintiles, so it is not that the model is better where the money is. The best number was ninety fills.
The uncomfortable part is why it was caught. The previous iteration had written down that the alignment was asserted rather than verified — and that sentence is the only reason anyone looked. An unflagged shortcut of exactly the same kind would still be in the corpus, producing numbers, indefinitely. The repair carries its own warning too: the rebuilt mask reproduces the builder's output exactly, which means it reproduces any error the builder contains. A reproduction gate proves agreement, not correctness.
Then the useful question — how much else looks like this? Scanning 175 files found 5 instances of the syntactic form, of which 3 were this module's own docstring examples, one was correct, and one was the known defect. A clean sweep, and nearly worthless on its own, because a scan that detects one syntactic form has told you about that form and nothing else. The measurement worth having sat beside it: 506 element-wise pairing sites across 81 of 168 files — but 486 of them index with a boolean mask, and NumPy raises on a length mismatch there, which was verified directly rather than assumed. Length-bound slices and index arrays are accepted in silence. So the genuinely exposed population is 18, not 506.
That is the shape worth carrying away, and it has a hardware analogue that names it precisely. Silent errors in the field are defined as defects manifesting in a part of the circuit that has no check logic to detect the incorrect operation, and a study of a large production CPU population exists because traditional techniques do not catch them. The software version is the same statement: your runtime already enforces the common case, so your exposure is concentrated in exactly the constructions it declines to check. Audit those, not the ones that would have thrown.
Breached when two series are paired on the assumption that equal length implies equal order — or when a defect's reach is declared rather than derived per figure from what each one is a function of — or when a reproduction gate is read as evidence of correctness rather than of agreement — or when a scan's clean result is reported without the coverage measurement that says what it could not have seen.
A clock that lost precision is a row-selection error, not a rounding error
A nanosecond epoch is about 1.69 × 10¹⁸. A float64 holds integers exactly only up to 2⁵³, or 9.007 × 10¹⁵, so a nanosecond timestamp sits roughly 188× beyond the exact-integer range, in a region where float64's spacing is 256 ns. Reading a nanosecond clock into a float array therefore does not round it slightly. It lands it on a grid coarser than the quantity being measured, and it does so silently, because nothing about the resulting number looks wrong.
I did not find this by reasoning about it. I found one inconsistency in one experiment, assumed it was a quirk of that file, and then scanned the tree: 114 files, 175 timestamp constructions — 76 damaged, 74 exact, 25 safe because they were durations rather than epochs. Sixty-five files carry a damaged clock, and 53 of those 65 carry both kinds at once, because quote timestamps are read through a float matrix and trade timestamps through an integer field. Any file touching both streams is comparing two different clocks. Measured across 16,996,942 quote rows and 805,878 trade rows, 75.0–75.3% of rows are damaged, with a mean error of 64 ns and a maximum of 128.
The honest headline is not "128 nanoseconds," and this is the part that transfers. The operation that matters is the binary search over the forward horizon — the step that fixes each row's forward mid, which every experiment here performs. Because that horizon lands on a discrete quote, a tiny error in time becomes a large error in rows. On BTCUSDT at 800 ms, 2,908 of 72,000 probes (4.039%) land on a different quote, with a maximum shift of 25 quotes; at five seconds it is 3.958% with a maximum shift of 43. On XRPUSDT the rates are 2.907% and 2.496%. So the defect's real size is that between 2.5% and 4.0% of rows get a different forward mid, by as much as 43 quotes — not that a timestamp moved by 64 nanoseconds.
That number has teeth precisely because the forward mid is the label. A few percent of training rows carrying a different answer is a noise source the model cannot distinguish from signal, and it is manufactured entirely inside my own data handling. What it did not do is change a conclusion: the end-to-end effect on the committed fields of the affected experiment measured 7.668 × 10⁻⁴ bps, and every sign survived. That is the whole reason to name it rather than to panic about it — the defect manufactures noise of roughly the magnitude this investigation spends its time arguing about, which makes it a permanent tax on resolution rather than a retraction.
Data handling at this frequency is a first-class econometric problem and has been treated as one for twenty years — Brownlees and Gallo devote a paper to it under exactly that name. The closest published analogue is Holden and Jacobsen's study of liquidity measurement in fast markets, which finds the monthly TAQ database yields distorted measures of spreads, trade location and price impact — driven by withdrawn quotes, by second rather than millisecond time stamps, and by other causes — and concludes that repairing them changes research inferences. And the sensitivity of quote-to-trade matching is measurable rather than theoretical: Carrion and Kolay assessed trade-signing accuracy in fast markets against data containing true trade signs, finding the Lee-Ready algorithm classifies at least as well as in slower environments. The common thread is that the timing convention is part of the measurement, not part of the plumbing beneath it.
Two disciplines came out of this, and the first is uncomfortable. The scan caught itself: its first run left 17 constructions unclassified and would have reported 64 damaged rather than 76, so the rule is now that a census reports its unclassified count, and a nonzero count is resolved rather than quietly treated as clean. The second is that nothing was repaired. Exactly one file has an exact clock throughout; the other 65 are identified, recorded and left alone, because rewriting 76 timestamp constructions blind is how a corpus trades a known defect for an unknown one. A defect you have measured and bounded is in a different category from one you have hastily fixed.
Breached when a nanosecond clock is read into a float without checking the value lies inside the exact-integer range — or when two streams are compared without checking they were read through the same clock — or when a census reports a count without reporting how many items it could not classify.
A simulator that does not react to your order is asserting your size is zero
Replay a recorded book and you are trading in a world that cannot notice you. Every fill you take was, in reality, taken by somebody else. Every order you post changes nobody's behaviour, moves no price, and displaces no queue. That is not a small idealisation with a small error. It is a specific quantitative claim — that your market impact is exactly zero — made silently, in every cell of the results table.
The execution literature has spent twenty years insisting the opposite. Obizhaeva and Wang's foundational model argues that supply and demand for a security are intertemporal rather than static. Optimal execution then depends critically on those dynamics, especially when trading times are endogenous — as an event-driven strategy's are. The microstructure result is sharper still. Because the order-flow-imbalance slope is inversely proportional to depth, the empirically observed square-root relation between impact and order size falls out of the same linear model. Impact is a function of size. A simulator with no impact model has not omitted a refinement; it has substituted zero into that function.
The most useful corrective to "I am too small to matter" is empirical. Braun, Fiegen, Wagner, Krause and Guhr study ultrafast extreme events — mini flash crashes — and find that in at least 60% of cases the largest fraction of the price change comes from a single market order. Not from high-frequency feedback loops (PLOS ONE, 2018). One participant, one order, most of the move. Whether you are that participant is a question about your size relative to the book, and I have already measured the book: median touch notional is $1,438 on DOGEUSDT. Size that would be rounding error on an equity venue walks that book.
Here is where I have to be careful, because my own archive imposes the limitation rather than my modelling choices. bookTicker timestamps are millisecond-resolution, so "the book at the fill instant" is only ±1 ms — and the fill's own effect on the book sits inside that window. I cannot observe my order's impact at any stride, on this data, at all. Non-reactivity is not a simplification I selected. It is a bound on what the archive can answer, and the honest response is to say so and to size the residual, not to report zero and move on.
What that residual looks like when one dimension of it is measurable is instructive. Queue position — where your resting order sits in the line of orders at the same price, and therefore whether the next trade reaches you at all — is the one place I could replace an ignore-the-trader assumption with a model of the world. Doing it moved the fill rate from 0.496 to 0.034, and flipped the sign of the result. That is the magnitude of a single "you don't matter" assumption on a single axis. Impact, displacement and reaction are three further axes, all still set to zero, all pointing the same way.
Two of my own assumptions encode the same non-reactivity, and both are priced where sizing is argued: the aggressive route's no-walking-the-book arithmetic, and the treatment of displayed depth as available size. What matters here is not their cost, which is measured, but their shape. Neither is a modelling error at the margin. Each is a place where my simulator states, in code, that the trader has no weight.
The AI-first consequence is the one that makes this urgent rather than academic. A non-reactive simulator's errors are not noise, and they do not average out. An optimiser searching that world preferentially finds the strategies that lean hardest on the absent reaction: larger size, more aggressive placement, tighter queues. Those are exactly the regions where the simulator is most wrong, and therefore most generous. The error is not merely present in the search space. It is what the search is climbing.
Breached when a backtest's results are reported without stating what the simulator assumes about the trader's own effect — or when "our size is too small to have impact" is asserted rather than computed against measured book depth.
Literature inspires a hypothesis; only a local run promotes one
No paper can show that an edge survives your venue, your fee tier and your latency. That transfer is exactly what a pre-registered local run exists to test. In this corpus the old rule has acquired a sharper edge, because the literature itself is adversarial — and adversarial precisely on the vocabulary of costs and fees. Of 21,305 records in my research corpus, roughly 91 to 121 are exchange referral-code SEO documents wearing the costume of papers. They are not distributed evenly across topics, and the concentration is the whole problem.
Measured across 11 queries in both retrieval lanes to depth 60, spam flagged per query ranges from 0 to 25 — 25 on funding-carry-net-costs, 16 on maker-rebate, zero on conceptual queries. The pollution bites exactly where a practitioner asks their real questions and vanishes where they browse.
The obvious filter is the one to avoid, and getting this wrong would have been expensive. The spam is concentrated in Zenodo DOIs, so filtering on the DOI prefix looks efficient. My corpus holds 781 Zenodo DOIs against those ~91–121 spam records — so the prefix rule would discard several hundred legitimate preprints to catch a hundred fakes.
So my filter runs on vocabulary over title and snippet — referral, invitation, promo code, bonus, cashback, percent off, deposit reward, coupon — and never on the venue a document was published through. Measured against a seeded random sample of filter-passed rows, hand-classified, the false-negative rate is 0 of 30 (rule-of-three 95% upper bound around 10%). The limitation is inherited and worth stating: one classifier, one pass, no inter-rater reliability.
Spam is the crude form of the problem. The subtle form cost me longer to see, and it is not adversarial at all. I asked the corpus a specific question — what forecast correlation does the published literature actually attain at short horizons? — and the headline numbers were spectacular: R-squared figures near unity, on crypto, at minute scale. They are price-level fits. Predicting tomorrow's price from today's is nearly free, because the series is close to a random walk and the level is its own best predictor; predicting the return is the entire problem. A number that would be a triumph on one target is meaningless on the other, and nothing in the abstract distinguishes them.
The strongest genuinely placebo-controlled short-horizon crypto return forecast I could find in 21,305 records reports ρ = 0.351 — an enormous figure by the standards of this post, roughly seventeen times my own ten-minute correlation. It is still 6.8× short of the toll. And the arithmetic underneath is worse than that: below about 8.5 seconds on BTCUSDT, the required correlation exceeds 1, meaning a perfect forecast is smaller than the fee. That horizon is not closed by modelling skill. It is closed by arithmetic, and no paper can reopen it.
The discipline this produces is narrower than "read critically." No number from any paper entered any experimental criterion in my last campaign — the literature entries are recorded explicitly as abstract- and title-level reads. A paper sets a prior and proposes a hypothesis.
It never sets a threshold. That rule is what stops a retrieved passage from becoming a gate. It matters more as retrieval becomes automated: a corpus is untrusted text that an agent reads as though it were evidence. Notably, the agent literature is itself silent on prompt injection and security for trading agents. That is a gap in the coverage rather than a solved problem — at exactly the moment agents are being pointed at retrieval.
One example shows the right use of a paper, and it is the strongest single citation in this post. The Market Maker's Dilemma does not tune my parameters or gate a promotion. What it does is falsify a sign: the continuation direction my own strategy template was built around is the direction its live Binance experiment finds unprofitable, and its remedy — counter-trading the prevailing book imbalance — is the opposite of what my template does. The corroboration is what makes it stick: the same sign fell out of my own fill panel unprompted, with order-book imbalance averaging 0.0047 on filled rows against 0.0446 on unfilled, a 9.5× gap in the direction the paper predicts. That claim cost me nothing to accept and would have cost a great deal to ignore, because my own residual sits at −0.72 bps and a sign error is the one mistake that doubles a loss rather than halving it. A paper is allowed to do exactly this much: tell you which way to point a pre-registered run.
That does not tell me to flip. Inverting a signal reflects the mid move but keeps the round-trip cost, which is paid in both directions, so a losing long does not become a winning short. It tells me the sign is a live question requiring a pre-registered local run, which is the most a paper should ever be allowed to do.
The closing evidence is the one that justifies this whole list. When Agents Trade (arXiv:2510.11695) builds Agent Market Arena, a lifelong real-time benchmark that runs four agent architectures across five model backbones on live cryptocurrency and stock markets. It spans GPT-4o, GPT-4.1, Claude-3.5-haiku, Claude-sonnet-4 and Gemini-2.0-flash, against four agent designs from a single-agent baseline to a memory-based reasoner. Its finding: "agent frameworks display markedly distinct behavioral patterns, spanning from aggressive risk-taking to conservative decision-making, whereas model backbones contribute less to outcome variation." Swap the model and little changes.
Swap the scaffold and everything changes. The fee walls that bound the proposer, the regime gate and the abstain baseline, the pessimistic simulator, the deflation arithmetic, and the pre-registration caps of 5 hypotheses and 1 weekly deployment. The thirty-eight principles in this post are not overhead around the interesting part. On the current evidence, they are the interesting part.
Breached when a paper's number reaches a promotion gate — or when effort flows to the model backbone while the scaffold stays unexamined — or when a corpus is filtered by where a document was published rather than by what it says — or when a headline R-squared is accepted without checking whether it was fitted to a level or to a return.
An edge decays because it worked, and so does the evidence for it
Most of this post concerns how to tell whether you have an edge. This one concerns what happens after you do: finding it starts a clock, and so does measuring it.
The cleanest measurement of that clock comes from equities. McLean and Pontiff studied 97 variables shown to predict cross-sectional stock returns and measured what happened to each one after publication. Portfolio returns are 26% lower out-of-sample and 58% lower post-publication. The decomposition is the interesting half: they treat the out-of-sample decline as an upper bound on data-mining effects — that portion was never there and would have gone on any fresh sample — which leaves an estimated 32% lower return attributable to publication-informed trading.
Two further results sharpen it, and both should be uncomfortable. Post-publication declines are greater for predictors with higher in-sample returns, so the more impressive the backtest, the more of it was borrowed. And published-predictor portfolios show post-publication increases in correlation with one another: the crowd does not merely arrive, it converges onto the same positions. The authors' own reading is that investors learn about mispricing from academic publications — informed traders consume the thing they were drawn to.
That citation is itself an instance of this principle, and I had it wrong until I rechecked it. My corpus served the 2012 working-paper version of the same study, which reported 56 characteristics, a 50% post-publication decay, and a 15% statistical-bias component that the abstract explicitly called not statistically different from zero. Every one of those numbers moved on the way to publication — 56 became 97, and the decomposition became 26% and 58% — and I had quoted the superseded figures, including the 15% with its caveat dropped. A retrieval system ranks by similarity, not by whether a version was superseded, and both versions carry the same title and authors.
You do not get to opt out by not publishing. At any meaningful frequency, profitability is the announcement. Your fills are somebody else's order-flow data, your resting orders are a pattern in their book, and the participants best equipped to notice are the ones whose machines already sit in the exchange's own data centre. The half of the equity decay that came from price pressure has no publication step in it. It only needs someone to notice, and this venue is instrumented by people whose entire business is noticing.
I should be plain about what I have not measured. This system has never traded live, so the post-publication decay above is inherited rather than demonstrated here.
I do now have one decline measured in my own data, and it is worth stating with the caveat attached rather than without it. The funding carry ran six to a hundred times larger before 2023 than after — a pooled median of +18.314% a year at ninety days against +0.113% — in exactly the trade that gets described as a standing opportunity. That is a decay curve, of a sort. It is also unresolved: the gap between the two eras sits inside its own error bar, so it is a decline I can measure and cannot yet claim. Which is the more accurate thing to say than either "the carry decayed" or "I have no decay curve of my own", and I have said both.
What I have watched decay, measurably, is the evidence itself.
There is a sharper version of that sitting on this blog. In March I published a catalogue of fourteen machine-learning and microstructure features powering a production crypto scalping engine, each traced back to the paper it came from. None of it was fabricated and the features are still real. What changed is the horizon they were serving: the arithmetic in this post closes sub-minute trading on these instruments, so a reader arriving at that piece today finds a well-sourced account of machinery aimed at a target I can no longer show clears its costs. I have left it up, with this post as its counterweight. Quietly deleting the earlier claim would be the failure this principle describes, performed on my own archive.
Binance discontinued daily bookTicker archives after 2024-03-30 — verified against the S3 listing on 2026-08-21 — so every microstructure number in this post describes 2024 and that lane cannot be refreshed at all. Refreshing it now requires either a live capture path or designs on a different instrument — which is what eventually happened: 1,247 days of one-minute bars, coarser than the book but still running, and the lane on which that return result was measured. Separately, both disjoint reproduction days fall before the April 2024 halving while the original sample falls after it, so a regime shift sits uncontrolled inside my own comparison. That is the version of decay that actually bit, and it generalises past this project. The strategy's shelf life is bounded by the shelf life of the data used to justify it, and those two clocks are not synchronised. An archive can be withdrawn, a venue can change its fee tier or its tick grid (the minimum price increment it quotes in), a contract can be delisted — and none of those events appears as a drawdown. They appear as a backtest that silently describes a market that no longer exists.
The operational answer is that beliefs carry expiry dates, and the machinery for that already exists in this system for a different reason. The graded-claim ledger recomputes every predicate the previous policy asserted and records it as held-or-not, and the demotion record's similarity check stops a killed hypothesis returning next week with only its numbers moved. That apparatus was built to stop an agent grading itself. It happens to be exactly the apparatus decay detection needs. Both problems have the same shape: a claim that was true when it was made, and a system that will keep acting on it until something forces a recheck.
Breached when an edge is treated as a property of the market rather than as a claim with an expiry date — or when a backtest's data provenance is not checked for whether the venue, fee tier, tick grid or archive it describes still exists — or when a cited result is taken from whichever version a search surfaced first, without checking it against the published one.
So what
Put together, these thirty-eight are a trader's discipline restated for a machine operator.
What the market does to you: know your costs before your signals and compile them into what the model may propose. Do not reach for a longer horizon expecting the cost to shrink — it buys beta, not edge. Remember the queue ahead of you mostly evaporates rather than trades, so a fill rate estimated from trades alone is the wrong number in the flattering direction. Let experiments settle signs rather than flipping them. Treat a crypto-native input as an input, and check its economics before its forecast quality. Control a candidate period against the period you already know is there, because one that divides it cannot be told apart from it. Assume the tail is endogenous when leverage is, especially where you cannot measure it. Sum a periodic cash flow along its realised path instead of projecting it from an average rate, because the signs cluster. And never let a failure to resolve be read as an absence — report what the design could still be hiding. And accept that a signal can be real, transferable and still an order of magnitude too small to pay for itself.
What you point the model at: treasure the no-trade. Forecast your cost rather than your direction, and know that a cost model's ceiling is exactly zero. Judge a forecast by the decision gain its correlation can buy, not by the correlation. Judge a suspect feature by removing it and re-measuring, never by reasoning about its scale. Gate on regime rather than learning a shape from it. Size from the book, not from the model's confidence. Keep the tick loop and the learning loop on different clocks. Make the model propose falsifiable hypotheses, and pre-register them before the data is touched.
What you accept as evidence: the backtest is the reward function, so keep it pessimistic and remember it assumes your size is zero. Deflate every result by the search that found it and the overlap that measured it. Do not promote what merely explains — a variable earns a place by being knowable first. Sweep the implementation choices you cannot justify, and report their disagreement rather than picking one. Validate a test before you read it: check its assumptions against your data, measure what its interval really covers, and choose a statistic for what it can reject. Read a monotone sweep as a cost you are paying, not a parameter you are tuning. Do not predict a stacked configuration by summing the dials that went into it. Before reading a sweep's shape, check its arms are still distinct at the prices actually traded. And treat a clock that lost precision as a row-selection error rather than a rounding one. Never pair two series on the assumption that equal length means equal order.
Credit a model only against the best option that contains no model, and report its action rate beside its margin. Check a difference against its own error bar before ranking it, and store the denominator beside every tally so the number can be recomputed later. Measure what a variance correction buys on your own corpus, at the level you mean to apply it, before adopting it. Price what a consistency check costs in power before running it, and report an unresolved one as unmeasured rather than stable. Say what effect your design could have resolved before calling a null a result, and report a clean scan with the recall and coverage that say what it could have seen. Let literature propose and only a local run promote. And remember that the edge and the evidence for it decay on different clocks.
None of this requires believing AI adds alpha. On my desk that question has now half-closed, and how it closed matters more than the null. The sub-minute leg went on arithmetic: below roughly 8.5 seconds on BTCUSDT a perfect forecast is worth less than the round-trip fee — a wall no model can move and only a fee schedule can. The longer leg went on measurement, and not for want of signal. The ten-minute return is genuinely forecastable: 11 of 12 chronological folds positive, at 2.4 times the resolution floor. It is only far too small — +0.13 to +0.15 bps of residual over buy-and-hold against a 3.4 bps toll, twenty-two to twenty-six times short.
The learned-versus-classical leg closed beside it, twice and from unrelated data, in the census and the grid sweep above. Two legs stay open: whether the edge is crypto-native, and whether it holds across regimes. Both are measured and neither resolves — the first positive in 6 of 6 foreign-exchange cells at 0.37 of the crypto magnitude, the second monotone across regimes but standing at 0.53 of its own bar. They are logged that way rather than rounded into a verdict, which is the entire argument of this piece made small.
What the principles guarantee is narrower and worth more: when the AI does find something, the number will be real. Priced against true fees. Filled by a simulator that does not pretend the trader is weightless. Judged on a holdout it could not peek at, and decomposed against the market before anyone calls it alpha.
The adjective is cheap. The count was zero. The discipline is the part you get to keep.
Appendix: where the numbers come from
Every first-person measurement above is produced by a named experiment in my own tree, and a claim in this post is only as good as the run behind it. This table is the provenance. It exists because the discipline the post argues for applies to the post itself. A number reaching a conclusion must have been written down as data, not asserted in prose.
| Experiment | What it measured |
|---|---|
e39_leg_ordering | The EXTREME-volatility claim across four windows of one day; one window inverted it, +0.0693 against −0.1610 |
e65_abstain_router | Adding a third action to the router: always_abstain scores 0.0 and is the best arm in 11 of 11 panels |
e69_depth_at_touch | Touch notional and half-spread per instrument; the spread is one tick on 87.1–99.8% of quotes |
e72_overlap_law | The closed-form overlap correction n_ind ≤ min(n, T/H) and its inflation curve |
e76_queue_ahead_in_trades | Queue depth in trades rather than base units; fill rate 0.496 → 0.034 |
e91_cvd_window_sweep | The inverted-edge trap; short gross after reflecting the signal |
e108_four_windows | The 75% of archived hours never read, and window-level versus day-clustered significance |
e111_queue_aware_four_windows | The queue-aware fill rule on all 44 panels: 0 positive, 43 resolving negative |
e112_float_clock_census | 175 timestamp constructions across 114 files: 76 damaged by float64, and 2.5–4.0% of rows landing on a different forward quote |
e149_tick_audit | Every instrument's tick from 1,795,680 bars: 0.0149 bps on BTCUSDT to 1.5848 on XRPUSDT, and the eight-arm trigger sweep collapsing to one arm on XRPUSDT |
audit_verdicts | The detector for generated verdicts contradicting their own data: 2 of 4 caught, 6 of 8 flags false, 0 new cases in 165 files |
e162_ablate_the_broken_feature | The feature that looked disabled and was destroying the model: rho +0.00073 to +0.21722 on removal, and inert on a third day |
e157_forecast_the_state | The best forecast in the corpus — rho +0.2646 — buying a decile-decline gain of +0.0718 to +0.1280, unresolved on 4 of 4 |
e172_floored_trailing | The trailing-window control with a 5% floor fixed in advance: passing at all three windows, and the deployable long-gap figure at 47.7% retention |
e175_attack_the_toll | Inverting the requirement to ask what fee the measured forecast would clear |
e176_rho_by_horizon | The correlation refitted at each horizon, which refuted the borrowed one-second value at nine hundred seconds |
e177_basis_and_hedge | The basis over 1,052,560 aligned minutes: 0.043 to 0.882 bps a week, risk exponent far below carry's |
e178_excess_over_cash | Carry against the Treasury bill it displaces — a +1.39% to +1.72% excess that resolves nowhere |
e179_net_excess_by_hold | The holding-period sweep where the toll's drag and the sample both fall as 1/H |
e181_full_history_carry | The window extended to 2,151 days, the older era's six-to-hundredfold larger carry, and the filter that silently deleted it |
e182_magnitude_aware_c4 | Three defensible tests on one set of 41 monthly excesses, giving two answers |
e183_block_bootstrap | The moving-block re-run, and the monthly autocorrelation that made blocking necessary |
e184_bootstrap_coverage | What the nominal 95% interval actually covers on simulated series at the observed dependence |
e193_heavy_tailed_nulls | Five innovation families across 120 combinations: dependence and tail shape reachable separately, never together |
e194_two_component_null | 700 combinations where every feature is individually reachable and none jointly — a structural refusal, not a grid limit |
e198_better_shape_stat | Five sign-free shape statistics measured for precision, finding the incumbent the worst of them |
e199_distribution_gof | The power of every gate, inverting the precision ranking, and the answer holding across all seven |
e196_full_series_null | The strongest count in the thread judged under validated nulls: binomial 0.001820 against an empirical 0.12212 to 0.39613 |
e197_tight_tolerance | The gate three times finer than its own statistics, and the one derived from their sampling error instead |
e195_joint_state_null | The regime where one state carries both the higher mean and variance: 21 admissible nulls of 160, the first validated ones |
e192_sign_free_validation | The replacement statistic measured free of the circularity it was built to escape, and the magnitude distribution that rejects every null anyway |
e189_longest_run | The 22-month run that rejects the governing null, and the monotone rise of the empirical p as a null fits the persistence |
e190_within_era | C4 asked inside each era: the late one answers and says no, the early one cannot be asked |
e185_sign_test_calibration | The sign test's realised type-I rate: a nominal 0.0125 rejecting 12.350% of the time |
e180_pooled_carry | The four perpetuals measured as one observation: n_eff 1.01 to 1.07 of four |
e174_carry_path | The carry horizon recomputed from the signed series: clearance on 26.5–42.2% of windows, and a drawdown of 6.1–14.8 hedged tolls |
e154_queue_cancellation | The cancellation share of depletion at the touch — 0.9414 to 0.9785 — and the fill-rate bound that saturates once cancellations are admitted |
e168_aligned_volume | The asserted pairing that failed on every row — 0 of 111,589 — and the effective sample sizes that a permutation cannot move |
e170_decision_across_days | The decision gain on all seven archived instrument-days: 7 of 7 resolving individually, 0 of 7 beating the 0.1660 bps edge |
e114_passive_exit_hazard | The passive exit as a lottery (+0.0154 filled, −1.8468 chased) and the learned hazard beating a forced-to-act rule while tying do-nothing |
e93_best_of_everything_maker | Every dial at its individually-best setting, fee-free: optimistic on 3 of 3, and 0.02% of rows eligible on XRPUSDT |
e95_accounting_mismatch | The mid-versus-crossing exit mismatch in that prediction, and the exit half-spread being drawn from a conditioned population |
e105_paired_regrade | The pairing correction priced: unpaired error bars a median 3.14x the paired ones, applied to 222 of 5,884 comparisons, moving five |
e106_pair_e103_by_panel | The same correction at panel level, where the median error bar got 3.2x WIDER — the withdrawal of "pair by default" |
e102_multi_update_pull | Pull-flag rate against detector lookahead, 0.1877 at one update to 0.5645 at a hundred |
e110_exit_sweep_four_windows | 24 exit arms against the do-nothing trigger across 28 cells; 0 positive |
e116_funding_phase_stratification | The 8-hour funding phase against a 24-hour control: 0.04303 of variance explained versus 0.27654 |
e132_what_drives_the_panel_spread | Four drivers measured contemporaneously, lagged and for persistence; explanation and prediction do not coincide |
e133_minute_horizon_predictor | Volatility persistence and its lagged correlation with next-interval gross at 1–60 minutes |
e134_abstention_out_of_sample | The abstention rule on a four-month temporal holdout, both directions |
e135_abstention_placebo | The rule against a 2,000-draw null matched on intervals kept |
e136_entry_matched_placebo | The same rule against an entry-matched null, scored on gross per entry |
e139_minute_klines | 1,247 days of one-minute bars acquired; resolution floor at ten minutes falls to 0.00829 |
e140_ten_minute_fit | The ten-minute forward return out of sample: 11 of 12 folds positive, 2.4× the floor |
e141_horizon_economics | Seven horizons from 10m to 24h against the toll; none both profitable and resolvable |
e144_leg_b_transfer | Dropping the crypto-venue feature block; what carries the signal is portable |
e145_leg_b_powered | BTCUSDT coefficients on EURUSD and USDJPY, 2,556 days: 6 of 6 fold means positive |
e143_out_of_instrument | BTCUSDT coefficients transferred verbatim: 9 of 9 held-out cells positive |
e148_ensembled_class | Each model class ensembled over its whole hyperparameter grid; 0 of 48 fold deltas resolve |
e138_feasibility_map | Required correlation by horizon; below ~8.5s a perfect forecast is smaller than the fee |
e142_side_balanced | The horizon sweep under two balancing schemes; three of ten cells reverse sign |
e152_regime_consistency | C4 on its own terms: 0 of 12 regime cells and 0 of 24 gaps resolve |
e153_pooled_volatile | 615,594 pooled decisions; the volatile-minus-calm gap reaches 0.53 of its bar |
audit_tallies | Every countable claim across 177 records: 98 p-values recomputed, 872 tallies extracted |
e151_near_collapse | 579 arm comparisons against their own MDDs; 310 report a difference smaller than their bar |
e137_horizon_sweep | Gross per fill across a 75× horizon range, decomposed against the benchmark's drift |
E1 fill hazard | The learned model's Brier-skill margin over an IRLS logistic as the panel grows |
E2 funding forecaster | Next-8h funding forecasts against persistence; economics inert at any realistic fee |
E3 launch survival | 833,098 pump.fun launches; AUPRC 0.01778 logistic against 0.00878 boosted trees |
E4 proposer vocabulary | Falsifiable mechanism statements, 5 of 5 against 0 for two samplers |
Three caveats travel with the whole table. The microstructure runs use four
instruments, where the Spearman critical value at n = 4 is 1.000 and no effect
size is detectable from a cross-instrument ranking alone. The bookTicker
archive lane ends 2024-03-30, so these describe 2024 microstructure. And no
result here comes from live trading — this is an offline research corpus, and
the distance between the two is the subject of half the principles above.
