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.
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.
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.
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.
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.
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.
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.
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.
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.
Phase gates
Binary exit test per phase. No phase begins until the previous one passes.
This page reports results. It is not a betting interface and has no staking controls, because there is no demonstrated edge to stake on.
Data integrity
Raw counts reconcile against the specification before deduplication, because the published figures include the duplicates.