The idea
Prior Post is a Bayesian handicapping workbench for US thoroughbred racing.
Every race on a card gets a model-generated speed figure, a win probability, and a fair
price — with the same underlying numbers presented four different ways so you can read a
card at whatever level of detail matches how you bet.
Every horse race produces a finishing time. But raw times don't tell you much
— a fast time at a short distance on a fast track isn't the same as a fast
time at a long distance on a muddy one. A speed figure adjusts
for all of that so you can compare any horse to any other horse, regardless
of where or when they ran.
The challenge is that a horse's time is shaped by many things at once: the
horse's own ability, how fast the track was that day, who's riding, who's
training, the distance, the surface, the competition level, the pace of the
race, and plain luck. Traditional figures rely on expert judgment to separate
these factors. We use math instead.
Four ways to view a card
Every race card opens at your choice of detail:
- Beginner — a plain-English $100 plan that only bets races with a clear edge over the market.
- Intermediate — industry-standard past performances with today's projected figure, model win probability, and pace projection.
- Expert — everything Intermediate shows plus figure decompositions, confidence bands, and a ridgeline chart of each field's projected figure distributions.
- Quant — dense numeric table with α, σα, κJ, κT, EV per $1, Kelly fraction, and card-level portfolio totals.
Same data underneath every view. The difference is how much of the machinery you see.
How we separate the signal
Our model looks at every US thoroughbred race from mid-2024 to the present
— about 395,000 individual performances across 117 tracks —
and simultaneously estimates all of the following:
- Each horse's ability on each surface (dirt, turf, synthetic)
- Each jockey's effect on speed
- Each trainer's effect on speed
- The track variant — how fast the track was running that day
for a given surface, shared across every race at that track with the same
surface on the same date
- A per-distance correction — a partially-pooled offset for each
distance bucket that captures systematic timing biases the distance spline can't
- Adjustments for distance, surface, track, age × sex, days off,
medication, blinkers, post position, weight carried, race class, pace, purse,
and field strength
The key insight: none of these can be measured directly, but they can all be
inferred together. If we know the jockey and track effects, we
can read the horse's ability from what's left over. If we know the horse's
ability, we can read the track effect. We cycle through all of them thousands
of times until the estimates converge and stop changing. That's the final answer.
What makes this different
- Uncertainty is built in. A horse with two starts gets a
figure with a wide margin of error. A horse with twenty starts gets a precise
one. The dashboard shows this explicitly — the width of each horse's distribution
curve tells you how confident the model is.
- Everything is estimated at once. Traditional figures decide
the track variant first, then everything else follows. We solve all factors
simultaneously, so no single assumption contaminates the rest.
- Track variants are shared across the card. A single dominant
horse in a weak field can't corrupt the variant — the correction is pooled
across every race at the track with that surface on that day, so one race's
field-strength quirks get averaged out.
- Surfaces are separate. A horse's dirt ability and turf
ability are tracked independently. In fact, dirt performance barely predicts
turf performance — the correlation is only about 8%.
- Outliers are handled gracefully. Residual noise is modeled
as Student-t, not Gaussian, so a single bizarre race (traffic trouble,
equipment failure, lost action) doesn't drag down a horse's ability estimate.
- Noisy distances are auto-dampened. Residual variance is fit
separately per distance bucket, and each race's figure is credibility-weighted:
in a noisy distance bucket (very short sprints, rare distances) the raw
deviation from expected is shrunk back toward the horse's career average.
In reliable buckets (one mile on dirt) the raw figure passes through
unchanged.
- Sex is controlled for but not in the headline figure. Sex
is a regression input so the model doesn't confuse "filly-restricted race"
with "weaker field," but it's stripped from the displayed figure so a Grade 1
colt and a Grade 1 filly sit on the same scale at peak form.
- No human adjustments. Every number comes from the data.
No one is hand-tuning track variants or applying opinion-based corrections.
Reading the figures
Figures are scaled so that 80 is roughly an average performance.
Higher is faster. One figure point is approximately one length
at a typical distance — slightly less at sprints, slightly more at routes. So
a horse with a figure of 95 is roughly 5 lengths faster than a horse with a 90,
all else being equal. A 10-point edge is a blowout. As a rough guide:
- 105+ — Top-class (major stakes winners)
- 95–105 — Stakes / top allowance quality
- 85–95 — Solid allowance level
- 75–85 — Claiming / maiden
- Below 75 — Bottom level
Each horse's past performances show how the figure breaks down: how much
came from the horse's talent, how much from the jockey, the trainer, the
class of race, and how much was just a good or bad day.
Fair odds
For upcoming races, we combine each horse's ability estimate with their
jockey, trainer, and class effects to project how they'll perform today.
Those projections are converted into win probabilities and displayed as fair
odds — what the odds should be based purely on the model, with no
bookmaker margin built in.
A second model (a neural-network ranker) then blends our speed figure with
the morning line, pace features, connection premiums, class transitions, and
field dynamics to produce the MODEL % column — our headline
win probability for each horse. This is the number we bet on.
What it doesn't do
- It doesn't distinguish inner from outer turf courses or
different chutes at the same track — our surface classification is dirt /
turf / synthetic only. Tracks with two turf courses (Saratoga, Keeneland)
get one shared variant for both on a given day.
- It doesn't adjust for bad trips or trouble in running
beyond what the Student-t residual model naturally absorbs.
- It doesn't use pedigree information for horses making
their first start.
- Horses with only one trainer and very few starts get a
THIN DATA
badge. Their ability is statistically confounded with their trainer's
skill — it's not wrong, just noisier than the headline number suggests.
- Live tote odds aren't used — the model anchors on
morning-line odds. On races where the morning line is wildly off, the model's
headline probability can drift.