The 54% ceiling: two model families against the information limit of an order book
We recorded our own Level-2 order book feed on a remote server, fought four data pathologies that silently poison models — including one a neural net scored 99.8% on — and swept two model families across nineteen features and 1.75 million labels. The answer was a hard ceiling at 54%. This is what an information limit looks like from the inside.
Last updated · 2026-07-12
The hypothesis
After the ensemble audit (E-01) taught us to trust nothing we hadn't built cleanly ourselves, we went to the most primitive information source available: the Level-2 order book — the live ladder of resting bids and asks. The hypothesis was standard microstructure lore: imbalances in the book should leak information about the next price move, seconds ahead. If direction is predictable anywhere, it should be here, closest to the metal.
No vendor sells clean retail-grade L2 gold data, so we recorded our own.
Trench work: the recorder
The recorder is a headless Python process speaking the cTrader Open API's protobuf protocol over TLS, streaming depth updates and writing Parquet — running 24/7 on a remote Ubuntu VPS inside a persistent tmux session, with an hourly heartbeat report printed into the session so a silent death is visible at a glance instead of discovered days later as a hole in the dataset. We learned the need for the remote box the honest way: detached runs on a laptop die when the laptop sleeps, and a gapped order-book recording is worse than none, because every gap is a place where the book you've reconstructed and the real book silently diverge.
The data fought back — four pathologies
Raw feeds do not arrive clean. Four separate pathologies had to be found and killed, each one capable of quietly manufacturing a fake edge:
- Synthetic demo volumes. The demo feed's order sizes were a fixed ladder — the same five round numbers repeating forever. Every volume-based feature was measuring a simulator, not a market. Fix: record from a live account.
- Crossed and outlier quotes. The aggregated feed injects transient far quotes; a naive best-bid/best-ask read produced negative spreads and an absurd 86.8% BUY-skewed label set. Fix: a median-anchored, uncrossed top-of-book reconstruction.
- Zombie quotes — the big one. When the recorder reconnects, DELETE messages sent during the gap are lost forever, so stale price levels persist in the reconstructed book and the mid-price ping-pongs between real and dead layers. Our data contained 55,757 of these quantized $10–28 phantom jumps — and a model trained on them hit 99.8% validation accuracy predicting the artifact, then won 2.6% of its simulated trades. The most accurate model we ever trained was a bug detector. Fix: session-aware book resets on any receive-gap, plus clearing the book on every connection open.
- Flat-label imbalance. Gold trades nearly 24/7, and 74.7% of intervals are flat — a naive labeler dumps three quarters of the data into one class and the model “achieves” 85% by parroting the majority. Fix: a deadband that drops sub-$0.20 moves, plus a guard against labeling across session gaps.
Note the family resemblance to E-01: none of these ever threw an error, and every single one made naive results look better.
The most accurate model we ever trained — 99.8% validation accuracy — was a bug detector.
Zero skew, by construction
The other lesson of E-01 was architectural: train/serve skew is where illusions breed. So this pipeline has exactly one feature implementation — one module computing the book features, imported identically by training replay, verification, backtesting, and the live paper trader. We proved the property rather than assuming it: batch-replayed features versus live-computed features on the same stream differ by 0.0. The live process itself is split — an asyncio loop ingesting depth updates, with model inference exiled to a separate worker process — so a slow inference call can never stall the book and quietly desynchronize what the model sees from what the market did.
The sweep: 5 → 11 → 19 features, two model families
With clean data and a zero-skew pipeline, we swept honestly. Features grew from 5 snapshot measures (spread, imbalance, micro-price deviation…) to 11 with rolling windows, to 19 with event-flow features (order arrival and cancellation intensity by side, replenishment, burst measures). Labels: 1.75 million deadband-balanced examples. Models: a compact MLP and XGBoost — two families with very different inductive biases, on the same folds.
The result was a wall, and it reproduced everywhere: ~54% directional accuracy at a 60-second horizon against a ~51% baseline, decaying toward 52% at 300 seconds. MLP: 54.0%. XGBoost: 53.8%. Eleven features or nineteen: same number.
What an information ceiling looks like
“Ceiling” is a strong claim, so here is its signature in the diagnostics:
- Predicted probabilities never left [0.42, 0.59]. Exactly 0.00% of ticks ever reached 0.65 — the models were never confident, because the data never justified confidence.
- XGBoost, offered 800 trees, early-stopped at 52 — it ran out of extractable signal almost immediately.
- One feature (micro-price deviation) dominated importance at 0.23, while all eight event-flow features ranked in the bottom half (0.014–0.043). The add/delete churn we had carefully engineered features for turned out to be mechanical market-maker refreshing — motion, not information.
The structural reason is visible in what the feed lacks: there is no trade tape, no aggressor-side data — the stream shows intentions (quotes), not commitments (trades). Roughly 54% appears to be what intentions alone are worth at this horizon.
Costs deliver the verdict
A real 3-point edge over baseline is not nothing — and it is also not enough. Against the ~$4.30 round-trip cost of a 0.1-lot trade (spread + commission), every configuration in the sweep was net-negative. The single best cell of the whole grid — 60-second horizon, 0.75 confidence threshold — produced six trades and lost $13.90. Win rates ran 17–45% against a ~43% breakeven for the barrier geometry before costs.
Verdict: a real but thin signal, fully consumed by costs — the information ceiling of a quote-only feed. The one durable conclusion: a 54% read on the next 60 seconds is worthless as standalone alpha but genuinely useful as execution timing for decisions made on slower evidence. That distinction — microstructure minimizes implementation cost, it doesn't generate alpha — is how actual institutions treat it. We had rediscovered it the expensive way.
← Back to the full failure log
EDUCATIONAL RESEARCH ONLY · NOT INVESTMENT ADVICE · EVERY FIGURE FROM DOCUMENTED PROJECT HISTORY
