Markets coveredMatch OddsCorrect ScoreOver / UnderFirst HalfSecond Half
Statometrics
Model Library · Ratings and regression

Glicko ratings

An upgrade to Elo that stores how uncertain each rating is, so new or inactive players move faster and are priced more cautiously.

Intermediatepre-matchevaluation

In one sentence

Glicko gives each competitor a rating plus a rating deviation (RD), a measure of how unsure you are, and uses both to update ratings and price matches.

How it works

Elo treats every rating as equally trustworthy. Glicko, devised by Mark Glickman, adds a second number, the rating deviation, which works like a margin of error: a big RD means "we are not sure", a small RD means "we have seen plenty".

When a player with a big RD plays, their rating moves a lot, because each result tells you a great deal. When they play an opponent with a big RD, the result counts for less, because you are not sure how good that opponent was. RD shrinks as matches accumulate and grows again during layoffs.

For pricing, uncertainty pulls probabilities towards 50%. That is useful in betting, where overconfidence in thin data is one of the quickest ways to lose money. Glicko-2 adds a third number, volatility, for players whose form swings.

The maths

g(RD)=11+3q2RD2/π2,q=ln⁡10400g(RD) = \frac{1}{\sqrt{1 + 3q^2 RD^2 / \pi^2}}, \qquad q = \frac{\ln 10}{400} E=11+10−g(RDj)(r−rj)/400E = \frac{1}{1 + 10^{-g(RD_j)(r - r_j)/400}} d2=1q2 g(RDj)2 E(1−E),r′=r+q1/RD2+1/d2 g(RDj)(s−E),RD′=11/RD2+1/d2d^2 = \frac{1}{q^2\, g(RD_j)^2\, E(1-E)}, \qquad r' = r + \frac{q}{1/RD^2 + 1/d^2}\, g(RD_j)(s - E), \qquad RD' = \sqrt{\frac{1}{1/RD^2 + 1/d^2}}
  • r, RD: the player's rating and rating deviation.
  • r_j, RD_j: the opponent's rating and rating deviation.
  • g(RD): a discount between 0 and 1; the more uncertain the opponent, the smaller it is.
  • E: expected score against this opponent.
  • d²: how much information this one game carries.
  • s: the result (1 win, 0 loss, 0.5 draw).
  • r′, RD′: updated rating and deviation.

In words: move the rating by the surprise in the result, scaled up when you are unsure of the player and down when you are unsure of the opponent, and shrink the uncertainty each time.

Worked betting example

A newly promoted side, Team A, is rated 1500 with RD 200 (few top-flight games). Team B is rated 1400 with RD 30 (well established). The ratings are illustrative, and home advantage is left out to keep the sums simple.

  1. Update view (only B's RD used): g(30) ≈ 0.995 and E ≈ 0.639.
  2. For pricing, many implementations combine both uncertainties: g(√(200² + 30²)) ≈ 0.842, giving A an expected score of about 0.619 rather than 0.639.
  3. A draw counts as half, so take off half the draw rate. With 26% draws (illustrative), P(A wins) ≈ 0.619 − 0.13 ≈ 48.9%, a fair Match Odds price of about 2.05.
  4. Betfair offers 2.20 on A. £10 stake, 2% commission: a win pays £12 × 0.98 = £11.76. EV ≈ 0.489 × £11.76 − 0.511 × £10 ≈ +£0.64.
  5. A wins. d² ≈ 132,082, so A's rating rises to about 1563.4 and RD falls from 200 to about 175.2.

Compare this with Elo at K = 20, which would have moved A by only about 7.2 points. Glicko moves the uncertain player much faster.

Where it's good

  • Tennis, especially lower tiers with qualifiers, returning players and patchy schedules.
  • Any sport where competitors play irregularly, so rating reliability varies a lot.
  • Deciding stake size: a high-RD selection may deserve a smaller stake even at the same edge.
  • Early-season football ratings, when promoted sides have little top-flight data.

Limitations and pitfalls

  • The RD growth rate between matches is a tuning choice; set it wrongly and ratings become jumpy or sluggish.
  • It still gives one strength number per player, so surface, venue and style effects must be added separately.
  • Glicko was designed for rating periods of several games; one-game updates work but the maths is an approximation.
  • Draws in football are handled crudely, as with Elo.
  • Better uncertainty does not create an edge by itself; the Betfair market already absorbs rating information quickly.
  • Walkovers, retirements and injury-affected matches pollute the ratings unless you filter them.

How to build it

  • Python: the glicko2 package, or write the formulas directly in numpy; R: the PlayerRatings package.
  • Data: date-ordered results with consistent player identifiers and dates, so RD can grow during layoffs.
  • Tune starting RD and inactivity growth by walk-forward log loss.
  • Tip: price matches using both players' RDs, not just the opponent's, or you will be overconfident on newcomers.
Learn it step by step
18+ only. Educational content, not financial or betting advice. Past results do not guarantee future returns. If gambling stops being fun, get free, confidential help at BeGambleAware.org.
Members