racing-model

/ out-of-sample evaluation 2020-01-01 โ†’ 2026-07-31
Phase 2 gate โ€” failed

The model does not beat Betfair Starting Price.

Across three racing codes and four held-out seasons each, the model lost to the market in every one of twelve folds. Under the prime directive that is a result, not a setback โ€” and it cost a day rather than a year and a bankroll. No tuning follows a failed gate.

0 / 12
folds beaten
4.65 M
runner rows
528 k
races reconciled
0.000 %
count variance vs spec
+0.242
best delta (greyhounds)
01

How far the model got

Each track runs from a uniform prior โ€” knowing nothing but the field size โ€” to the market's own log loss. The marker is where the model landed. Greyhounds get roughly halfway; the other two codes stall around a third.

Greyhounds are the outlier for a structural reason: the free archive happens to contain their single biggest pre-race factor, the box. For thoroughbreds it contains none of the equivalents โ€” no barrier, jockey, trainer, weight, gear or going. TAB_NUMBER there is the saddlecloth, not the draw: a column that looks like a feature and isn't one.

02

Walk-forward results

Every season is scored by a model fitted only on earlier seasons โ€” rolling origin, never random k-fold. LightGBM lambdarank grouped per race, scores mapped to probabilities by a softmax over the field. No BSP, no in-play price, and no post-race information reaches any feature.

03

What the data turned out to be

Five things contradicted the build specification. Each was proven from the data rather than assumed, and each would have silently corrupted results if taken on trust.

FIXED

Greyhound dates are day-first, not month-first

The spec says M/D/YYYY. A January file contains first components up to 31 and second components only up to 12 โ€” conclusively D/M/YYYY. Format also switches to ISO in 2023, and the clock switches with it. The loader re-proves orientation on every load and refuses to guess if a future archive is ambiguous.

FIXED

Thoroughbreds are ISO โ€” except April 2025

One anomalous month out of 79 files is day-first slash format: 16,057 rows. Hard-coding the spec's "thoroughbreds use ISO" would have mis-parsed all of them without an error.

FIXED

The archive contains duplicate runner rows

Same market, same selection, recorded twice โ€” harness 1.77%, greyhounds 0.20%, thoroughbreds 0.19%. They passed reconciliation because the published row counts include them. They inflate field size and double-count 1/BSP in the book. Roughly half of what first looked like dead heats were duplicated winner rows.

FIXED

The specified market filter is insufficient on its own

Back market percentage is measured at scheduled off; the BSP book settles at the jump. Different quantities, and they disagree โ€” medians 1.02 against 1.0028. Markets pass the specified filter with a BSP book summing to 0.36, where the winner paid 182.

OPEN

Dog identity is unreliable without a regulator ID

Betfair selection IDs are not stable โ€” 7.4 distinct IDs per dog โ€” so form history has to join on name. But 784 names recur across five or more years, conflating different animals. Topaz's dogId resolves both at once.

04

Phase gates

Binary exit test per phase. No phase begins until the previous one passes.

PHASE 0
PASS
Ingest and reconcile. All three codes at 0.000% variance.
PHASE 1
PASS
Market baseline documented per code and segment.
PHASE 2
FAIL
Model must beat BSP out of sample. It does not, in any fold.
PHASE 3
BLOCKED
Costed simulation. Gated behind Phase 2.
PHASE 4
BLOCKED
Execution and interface. Paper-trade remains the only mode.

This page reports results. It is not a betting interface and has no staking controls, because there is no demonstrated edge to stake on.

05

Data integrity

Raw counts reconcile against the specification before deduplication, because the published figures include the duplicates.