Skip to content
Sheet Solved

RTP — Rugby Tournament Predictor

A rating engine, a simulator and a web application that forecasts rugby tournaments and publishes how well it has actually done. Ratings are Glicko-2, computed from every match on record. Tournaments are simulated five thousand times. The whole pipeline runs unattended each morning and records what each run changed.

  • Python
  • Glicko-2
  • XGBoost
  • SQLite
  • Next.js
  • TypeScript
  • Vercel

01

The problem with a published forecast

Anyone can publish a percentage. Far fewer publish how often their percentages have been right, what the model can't see, or what changed between yesterday's number and today's.

RTP was built the other way round. Every figure it shows traces back to a measurement, and the measurements sit on the site beside the forecasts rather than in a footnote nobody reaches.

02

How it works

Match results are ingested from a public feed into a database holding every senior men's international on record, back to 1871. Glicko-2 ratings are computed from that history point-in-time, so a rating never sees a result that hadn't yet happened.

Club rugby is rated the same way from its own record — the United Rugby Championship, the Premiership, the Top 14 and the two European cups, back to 2015. The two scales have no bridge between them, because the populations have never played each other, and a club rating is meaningless held against an international one.

A tournament is then simulated five thousand times. Fixtures already played are locked at their real scores in every run, so a forecast made mid-tournament is conditional on what has actually happened. The simulation's own runs supply the margin distributions, the qualification odds and the what-if scenarios, which is why no two numbers on the site can contradict one another.

03

What it measures about itself

The model is scored by walk-forward backtest: re-rate the whole history one match at a time, and predict each fixture using only what was known before it was played. That's the figure the site publishes, and it's always reported with the period it covers.

Winner called correctly
71.6%

3,680 matches, 1871 to 2026 — the full international record

Margin error
16.8 pts RMSE

same period; modern fixtures score better

Recent form
72.4%

90-day half-life, an effective sample of 59 matches

Features in the blend
28

rating gap, venue, rest, competition, form

04

The engineering that matters

No server does arithmetic. Every endpoint reads a file that a pipeline step wrote, so a forecast, the ratings behind it and the accuracy quoted beside it all describe one state of the database rather than three taken at different moments.

The pipeline records its own failures. When a run aborts, the site says so and names the step, because a silent failure and a quiet day look identical to a reader and only one of them is fine.

Interested in work like this?

The method is the same whatever the subject is — measure it, publish what you measured it over, and make the logic explicit enough to change safely.