Football Sensei Logo
Football
Sensei

Elo Rating System Details

The Elo rating system is a way to calculate relative team strength based purely on their win/loss record. The essence of the system is that every team has a rating, the rating difference between two teams gives an expected win probability, and the ratings move after the game based on whether the result was better or worse than expected.

The system is named after Arpad Elo, a Hungarian-American physicist and chess player who developed it for chess ratings. It works well for any head-to-head matchup competition and is routinely used in many competitive board games, video games, and sports leagues.

1. Expected Win Probability

The first step is to calculate the win probability before the game starts. If two teams have the same Elo rating on a neutral field, each team has a 50% chance of winning. If one team has a higher Elo, that team is expected to win more often.

Neutral-Field Elo Probability
P(A beats B)=11+10EAEB400P(A\text{ beats }B) = \frac{1}{1 + 10^{-\frac{E_A - E_B}{400}}}
EAE_A and EBE_B are the two team Elo ratings. The scale value 400400 is the standard Elo denominator.

NFL games are usually not neutral-site games, so I add a home-field advantage adjustment to the home team's Elo before calculating the probability.

Home-Field Elo Probability
Phome=11+10(Ehome+HFA)Eaway400P_{\text{home}} = \frac{1}{1 + 10^{-\frac{(E_{\text{home}} + \mathrm{HFA}) - E_{\text{away}}}{400}}}
HFA\mathrm{HFA} is the home-field advantage adjustment. In my model, it is 55 Elo points.

2. Updating Elo After a Game

After the game, each team's Elo changes based on the difference between the actual result and the expected result. A win counts as 1, a tie counts as 0.5, and a loss counts as 0.

Elo Update
E=E+K(AP)E' = E + K(A-P)
AA is the actual result, PP is the pregame expected result, and KK controls how much one game can move the rating. In my model, K=20K=20.

The winner gains exactly as many Elo points as the loser gives up. The margin of victory does not matter in this implementation. A one-point upset and a three-touchdown upset cause the same Elo movement for a given matchup.

3. Fresh Season Example: 2022

The simulation database starts with the 2022 NFL season. Every team starts with an Elo of 1500 at the beginning of the 2022 season.

Initial Elo for the First Stored Season
Eteam, 2022 start=1500E_{\text{team, 2022 start}} = 1500
Every team starts at the league-average baseline before any 2022 games are processed.

The first regular-season game in the stored 2022 data is Buffalo at the Los Angeles Rams on September 8, 2022. Since both teams start at 1500, the only pregame difference is home-field advantage for the Rams.

Bills at Rams Pregame Probability
PLAR=11+10(1500+55)15004000.5785\begin{aligned} P_{\text{LAR}} &= \frac{1}{1 + 10^{-\frac{(1500 + 55) - 1500}{400}}} \\ &\approx 0.5785 \end{aligned}
With both teams at 1500 and the Rams at home, the Rams' expected win probability is about 57.9%.

Buffalo won that game 31-10. Since the Rams were expected to win 57.85% of the time but actually lost, the Rams lose Elo and the Bills gain Elo.

Rams Elo After the Loss
ELAR=1500+20(00.5785)1488\begin{aligned} E'_{\text{LAR}} &= 1500 + 20(0 - 0.5785) \\ &\approx 1488 \end{aligned}
Bills Elo After the Win
EBUF=1500+20(10.4215)1512\begin{aligned} E'_{\text{BUF}} &= 1500 + 20(1 - 0.4215) \\ &\approx 1512 \end{aligned}

A tie moves the ratings differently. Indianapolis at Houston in Week 1 of 2022 ended 20-20. Houston was at home, so the Texans had the same 57.85% pregame expectation. A tie is worse than expected for the home team and better than expected for the road team.

Texans Elo After a Home Tie
EHOU=1500+20(0.50.5785)1498\begin{aligned} E'_{\text{HOU}} &= 1500 + 20(0.5 - 0.5785) \\ &\approx 1498 \end{aligned}
Colts Elo After a Road Tie
EIND=1500+20(0.50.4215)1502\begin{aligned} E'_{\text{IND}} &= 1500 + 20(0.5 - 0.4215) \\ &\approx 1502 \end{aligned}

4. Carrying Elo Into Later Seasons

After the first stored season, the model does not reset every team back to 1500. Instead, each team's final Elo from the previous season is regressed slightly towards the league average before the new season starts to account for offseason changes.

Offseason Regression
Estart=(1r)Eprev+rEavgE_{\text{start}} = (1-r)E_{\text{prev}} + rE_{\text{avg}}
rr is the regression factor. In my model, r=13r=\frac{1}{3}, so one-third of the gap to league average is removed each offseason.

For example, if a team finished the previous season at 1605 Elo, its next starting rating would be:

Regression Example for a Strong Team
Estart=23(1605)+13(1500)=1570\begin{aligned} E_{\text{start}} &= \frac{2}{3}(1605) + \frac{1}{3}(1500) \\ &= 1570 \end{aligned}

If a team finished at 1395 Elo, it would also move one-third of the way back toward 1500:

Regression Example for a Weak Team
Estart=23(1395)+13(1500)=1430\begin{aligned} E_{\text{start}} &= \frac{2}{3}(1395) + \frac{1}{3}(1500) \\ &= 1430 \end{aligned}

From there, completed games are processed chronologically using the same win-probability and update formulas above. Once the Elo ratings are current, the main methodology page explains how I use betting markets and Monte Carlo simulations to turn those ratings into playoff, draft, and game-impact probabilities.