Veredus Analytics

9 August 2026 · Engineering

Why building an honest racing rating is harder than it looks

This summer our data supplier withdrew the redistribution rights for the proprietary ratings we displayed. The honest options were two: lose the fields, or build our own measurement from the data we hold outright. We chose to build. This is the story of what that actually took — published in full, because a rating you can't audit is a rating you shouldn't trust. The finished method lives on the VPR methodology page; this is how we got there.

1. You can't rate races on data you haven't audited

A performance rating is, at bottom, arithmetic on beaten margins. So the first discovery was disqualifying: our archive stored margins rounded to whole lengths — a nose beat and a half-length beat looked identical — and, far worse, 2.01 million runner rows stored a margin of 0 that actually meant "not recorded". Before the fix, 72% of beaten runners appeared to have lost by nothing; the archive was full of fabricated dead-heats. This was the third time a 0-used-as-missing sentinel had bitten this dataset, and it is the recurring villain of this story.

We re-pulled every race the source still serves — 358,830 races from 2005 onwards — at decimal precision (nose = 0.05, short head = 0.10, exactly as the photo finish recorded them). After the recompute, genuine zero margins are 9.9% of rows: the actual wins. The before/after distributions are in the changelog. Two limitations survive permanently, flagged rather than papered over: pre-2005 margins stay whole-length forever (the source no longer serves them finer), and an unknown margin stays unknown — it produces no figure, never a fabricated one.

2. Standard times for every course, from 38 years of results

A rating that wants to use time needs to know what a normal time is — per course, distance, surface and going. We built point-in-time standard times from the archive itself: medians computed strictly from races run before each date, with a three-level fallback, covering 99.5% of the racing calendar. "Point-in-time" is not a nicety: a standard computed with knowledge of later seasons would leak the future into every figure that used it, and the whole series would be untrustworthy for research.

3. The measurement that measured our data source

To convert margins to time we measured seconds-per-length from 1.7M runner observations — and got 0.167 seconds per length on the flat, in every distance band, exactly. Six lengths per second, the classic textbook constant, to three decimal places, at five furlongs and at two miles alike. Real physics is never that tidy. The measurement had measured the vendor: per-runner finish times in the source are derived from margins at fixed constants, not independently timed. From that day the winner's time plus the margin became the primitive quantity throughout the engine, and we never present per-runner times as independent measurements. If you buy racing data from anyone, this is the kind of thing worth checking.

4. The regression the handicapper broke on purpose

The heart of any margin-based rating is the pounds-per-length scale, and we tried to measure it from our own archive twice. Both attempts failed, and the failures taught us more than a clean number would have.

Attempt one regressed margins on the winner's total advantage — rating gap plus weight gap — across 918k winner–loser pairs in handicaps. It returned 10–26 lbs per length, absurd values, and it had to: the handicapper sets the weights precisely to neutralise the rating gap. The regressor is engineered toward zero by the very institution that makes handicaps competitive, while margins keep varying for every other reason. The regression wasn't broken by bad data; it was broken by a professional doing their job well.

Attempt two restricted to non-handicaps at level weights — 74k pairs — and agreed with the conventional scale in sprints (≈3.4 lbs/length) but drifted implausibly at distance, because official ratings measure ability with error and errors-in-variables bias the slope. So v1 ships the conventional scale, labelled as conventional, with both broken measurements published above it. "Measured, not quoted" cuts both ways: it also means not quoting your own broken measurement.

5. The drift: when your rating quietly inflates

The first full build of the series — 420,751 GB & Irish races, every figure computed in strict chronological order — carried a defect the year-by-year audit caught immediately. Inside handicap bands that are pinned by definition (0–65, 0–70), VPR figures rose about 16 lbs over 2009–2024 while the official ratings of the same runners rose 3. A rating that inflates against a fixed yardstick is not measuring anything.

The diagnosis ran three discriminating tests, and their eliminations mattered as much as the conclusion: composition change was ruled out (the strata are pinned), the update rule was acquitted (net per-race updates are negative every year — a sink, not a pump), and band-relative distortion was ruled out (the gap drifted uniformly in every band). What remained was a survivor pump: declining horses leave the population carrying low ratings, new horses enter at figures referenced to the field's own level, and a par blend that trusts the field's own ratings first can ratchet forever with nothing external holding it still.

The fix took a floor-weight sweep and five failed anchor-controller designs before the sixth worked — a persistent official-rating floor in the par blend plus a versioned annual anchor that responds to the innovation in the measured gap, clamped at ±3 lbs/year, its per-year steps published with the series. The failures are part of the public record on the methodology page: a level-targeting controller can't tell drifting from recovering; shifting horse states directly washes out through re-equilibration; a raw-difference controller reads its own correction as fresh drift and oscillates. The accepted series drifts less than official ratings themselves do (0.10–0.14 lbs/yr vs 0.17–0.20) while keeping its discriminative edge over them (0.172 vs 0.130 mean within-race correlation with finishing order, 2022–2025) and its independence (the VPR-vs-OR spread is intact at sd 14.8).

6. The honesty ledger

Every runner row in the archive reconciles to exactly one coverage bucket — rated, or unrated for a stated reason: non-finisher, unknown margin, first career run, no rated prior run — with capped-margin and low-precision flags counted, by era. The full table is on the methodology page. Alongside it, every VPR carries a published confidence value with a documented model (evidence in, decay over layoffs), and the validation gates — drift bounds, discrimination floors, a market cross-check by confidence band — run as standing regression tests against the production series, not as one-off launch claims. To our knowledge no mainstream rating publishes any of this. That is not a boast about our numbers; it is a statement about what auditability should look like.

7. What we did not build

No prediction. No win probabilities. VPR is a retrospective measurement of performances already run — an input for subscribers' own models and research, not a forecast of anything. And we did not reverse-engineer the retired ratings: the one internal comparison we ran against them was a rank-correlation sanity check, used as a floor in our validation harness and never published as a figure. VPR is computed independently of any proprietary rating — it is not RPR and will differ.

The result of all of the above is live now: VPR on every rated runner back to 1988, through the site and the API, with the full methodology and the transparency changelog alongside it. Building an honest rating turned out to be mostly the work of finding out, in public, all the ways a rating can quietly lie.