VPR — the Veredus Performance Rating
VPR is our own performance rating for UK & Irish racing, computed from the results archive we hold outright and documented here in full: every constant the engine uses appears on this page with its provenance — fitted, measured, or conventional-and-labelled-so. VPR is a retrospective measurement of performances already run, on a 0–140 scale. It is not a prediction, and it is not RPR — it is computed independently of any proprietary rating and will differ.
Sources
VPR is computed from 534,000+ races since 1988, of which 420,989 are the GB & IRE races VPR rates — the remainder are international runs kept as unrated context in horses' histories. Decimal beaten margins (nose = 0.05 …) exist for every race the source still serves (2005 onwards — 358,830 races across all regions re-pulled at decimal precision in August 2026, 266,340 of them GB & IRE); race-level winning times are parsed for 99.5% of the archive; going allowances ride on ~85% of races. Populations are stated explicitly wherever a number appears on this page. Two permanent data limitations are inherited and flagged rather than papered over:
- Pre-2005 margins are whole-length precision. The source no longer serves those races at finer grain. Every figure that leans on a pre-2005 margin carries a low-precision flag, and the update gain it earns is reduced accordingly.
- A margin of "unknown" is unknown. 2.01M archive rows once stored 0 where no margin was recorded; those rows produce no figure — never a fabricated one. The full coverage accounting is below.
The formula
Every race is rated in three steps, processed in strict chronological order so no figure can ever see the future.
1. The par. Each race gets a par — the estimated ability level of its field — from a priority cascade: the runners' own current VPRs where they exist, then the field's mean official rating, then the handicap rating-band top minus 10, then a class prior fitted once on pre-2015 data and frozen (so the prior can never absorb later drift), then prize money. Lower tiers only fill the confidence the higher tiers left unfilled — and the official-rating component always keeps a floor weight of 0.30 × OR coverage regardless of how much field-VPR evidence exists (the drift fix, below). Where a confident course/distance/going standard time exists, the winner's time against it (net of the day's going allowance) adjusts the par; standards are point-in-time medians and thin standards adjust nothing.
2. The performance figure. Each finisher's figure is par + weight adjustment + weight-for-age − beaten margin × lbs-per-length, with the margin capped at 30 lengths on the flat / 50 over jumps (capped figures are flagged). Weight-for-age applies to 3-year-olds against older horses on the flat only. Non-finishers and unknown margins produce no figure — never a fabricated one.
3. The update. A horse's VPR moves toward its new figure by an exponentially-weighted update: gain = 0.35 × par confidence × margin quality (whole-length and capped margins earn less). Confidence accumulates with rated runs and decays with a 730-day half-life of inactivity. A horse with no rated history bootstraps at its first figure with low confidence. On each 1 January the versioned annual anchor (below) applies its published par trim.
Every constant above lives in one options class in the engine source; none are tuned per-year or per-course.
Empirical scales
Seconds-per-length: measured
1.7M runner observations give a seconds-per-length of 0.167 on the flat in every distance band — precisely the classic six-lengths-per-second — and 0.222 over jumps. The flat figure is so exactly constant that it reveals something about the source data itself: per-runner finish times are clearly derived from margins at fixed constants, not independently timed. We therefore treat winner's time plus margin as the primitive quantity throughout, and never present runner times as independent measurements.
Lbs-per-length: why we publish the conventional scale
We tried to measure lbs-per-length from the archive twice, and we publish both attempts because the failures are more instructive than a clean number would have been.
- Attempt 1 — handicaps (confounded by construction). Regressing margins on the winner's total advantage across 918k winner–loser pairs in handicaps returns absurd values (10–26 lbs per length) — and it must: the handicapper sets the weights precisely to neutralise the rating gap, so the regressor is engineered toward zero while margins still vary for every other reason.
- Attempt 2 — level weights (attenuated). Restricting to non-handicaps with near-equal weights, 74k pairs give ≈3.4 lbs/length in sprints, falling with distance — agreeing with the conventional scale at short trips. But official ratings measure ability with error, and errors-in-variables bias the estimate upward, visibly so at longer trips.
Decision. v1 uses the conventional scale — ≈3 lbs/length at 5f, ≈2 at a mile, ≈1.5 at 12f, ≈1 staying and over jumps — labelled as conventional, with both measurement attempts published above it. "Measured, not quoted" cuts both ways: it also means not quoting your own broken measurement. The clean design (within-horse weight changes across runs) is scheduled for the next calibration round.
The drift, and how it was removed
The first full build of the series carried a defect the year-by-year audit caught immediately: within definitionally-pinned handicap bands (0–65 and 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. We publish the whole investigation because how a rating fails — and how its failure was diagnosed — is exactly what a reader should demand before trusting it.
The diagnosis ran three discriminating tests. Drift inside pinned strata eliminated composition change; external official-rating movement left ~13 lbs unexplained; net per-race rating updates turned out to be negative every year (the update rule is a sink, not a pump), acquitting the core formula; and the VPR-vs-OR gap drifted uniformly in every rating band, ruling out band-relative distortion. 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 because the par blend prioritised the field's own VPRs, the scale could ratchet upward with nothing external holding it still.
The fix has two published parts:
- A persistent OR anchor in the par blend — a floor weight of 0.30 × OR coverage, chosen by a published sweep (10/20/30/50%: drift fell monotonically and discrimination improved with anchoring, but at 50% the independent VPR-vs-OR variance began to compress — 30% is the best point on that frontier).
- A versioned annual anchor. Each 1 January the par level is trimmed by the prior year's measured movement of the (figure − OR) gap over the banded-handicap population. The controller responds to the innovation (observed movement plus its own previous step), is clamped at ±3 lbs/year, and its per-year steps are published as the anchor table with the series version. It corrects movement, never level. It took five iterations to get this controller right, and the failures are part of the public record in the companion piece.
The acceptance results on the final series: pinned-band drift 0.10–0.14 lbs/yr — less than official ratings' own 0.17–0.20 over the same window; the discrimination edge over OR preserved (0.172 vs 0.130 mean per-race correlation with finishing order, 2022–2025); VPR-vs-OR residual spread intact (sd 14.8); the gap flat in every rating band; and drift in unrated-heavy races (maidens, novices — where the anchor's yardstick barely reaches) of 0.02 lbs/yr.
Confidence
Every VPR carries a companion confidence in [0, 1]. It is evidence accounting, not a probability: it grows with each rated run (scaled by how well-anchored that race's par was and by the margin quality — capped or whole-length margins earn less), and it decays with time off the track on a 730-day half-life. A horse with no rated run has no VPR at all — confidence is never used to dress up a guess.
On the web the numeric value is banded for display: High ≥ 0.6, Medium 0.3–0.6, Low < 0.3. The API serves the raw 0–1 value. The market cross-check below shows the banding is informative — where VPR reports High or Medium confidence it out-agrees official ratings with the market; where it reports Low, it trails them.
Validation
Every claim in the drift section is enforced as a standing regression gate, not a one-off measurement: a validation harness re-runs the exact acceptance diagnostics against the production series and fails our release pipeline on any breach.
- Pinned-band drift — yearly-mean VPR slope in the 0–65/0–70 flat handicap bands (2009–2025) must stay within 0.3 lbs/yr of official ratings' own slope. Current: +0.10/+0.14 vs OR's +0.17/+0.20.
- Discrimination — mean within-race correlation between pre-race rating and finishing order (2022–2025, fields of 6+): VPR must beat the OR benchmark on the same races. Current: 0.172 vs 0.130 over 30,337 races.
- Residual information — sd(VPR − OR) must stay ≥ 13, proving the OR tether has not collapsed VPR into a copy of the yardstick. Current: 14.8 over 360k runner rows.
- Unrated-heavy tether — mean-figure slope in races where under 30% of runners hold an OR must stay within ±0.3 lbs/yr. Current: +0.02.
- Point-in-time replay — the series is a chronological fold: replay proofs pin that a truncated replay reproduces the full run's prefix exactly, that same-instant races with disjoint fields are order-independent, and that the fold is fully deterministic. The engine takes pre-race states as input — it has no channel to future data by construction.
Market cross-check, by confidence band
On identical runners (both a pre-race VPR and an official rating, 2022–2025), within-race rank agreement with the starting-price market:
| Confidence band | Races | VPR vs market | OR vs market |
|---|---|---|---|
| High | 21,816 | 0.345 | 0.256 |
| Medium | 8,238 | 0.328 | 0.278 |
| Low | 2,299 | 0.299 | 0.397 |
Raw agreement does not rise with confidence band and is not asserted to: tightly handicapped fields compress every rating's spread, which attenuates rank correlation (restriction of range — the Low band's wide ability gaps make ordering easy for any signal). The well-posed comparison is VPR against OR on the same runners — which VPR wins exactly where it claims confidence, and loses exactly where it reports it knows little.
Coverage
Every runner row reconciles to exactly one bucket. Population: the 4,288,578 GB & Irish runner rows (420,751 races, 1988–2026) processed by the rating build.
| pre-2005 | 2005 onwards | |
|---|---|---|
| Runner rows | 1,659,143 | 2,629,435 |
| With a performance figure | 598,794 (36.1%) | 2,457,285 (93.5%) |
| No figure: non-finisher | 143,325 | 172,014 |
| No figure: margin unknown | 917,024 | 136 |
| With a pre-race VPR | 1,318,247 (79.5%) | 2,426,435 (92.3%) |
| No pre-race rating: first career run | 137,496 | 193,639 |
| No pre-race rating: no rated prior run | 203,400 | 9,361 |
| Figures on floored margins (cap 30/50) | 45,866 | 223,366 |
| Figures on whole-length margins | 444,088 | 0 |
The pre-2005 era is structurally sparser: decimal margins begin 2005-01-02, so earlier figures lean on whole-length margins (flagged low-precision) and margins beyond the winner's reported chain are unrecoverable. Non-finishers never receive a figure by design — there is no honest margin for a faller. A runner can lack a figure for its own run yet still carry a pre-race VPR from earlier runs, which is why the two coverage lines differ.
Known limitations
- Pre-2005 margins are whole-length; figures leaning on them are flagged.
- Foreign runs are unrated context in v1 — a horse returning from Meydan carries its GB & IRE rating and a longer layoff, nothing else.
- Weight-for-age applies the published scale's shape for 3yos on the flat only; 2yos never meet older horses in this jurisdiction and 4yo jumps WFA is not modelled in v1.
- VPR is computed independently of any proprietary rating; it is not RPR and will differ.
VPR fields are available on every runner through the API and throughout the site's race and profile pages. Changes to the rating are recorded in the changelog; each series rebuild is versioned together with its anchor table.
