Methodology
How LOAD90 rates teams, turns ratings into goals and probabilities, and decides which new factors are allowed into the forecast.
What LOAD90 forecasts
LOAD90 estimates how strong each team is and how likely each outcome of a match is: expected goals for both sides, home win / draw / away win, over/under 2.5 goals and both teams to score, plus season outcomes such as the title, top 4 and relegation.
It is a pure football forecast. Bookmaker odds are never used as an input. Comparing a forecast with available odds is a separate job, done elsewhere; LOAD90 is only about probability.
On top of the forecast, LOAD90 describes the load of each team: how dense the schedule is, how much rest and travel there was, and the weather. Load is context. Only the parts of it that passed testing enter the forecast (see LOAD90 factors).
Elo: the strength base
Every club has an Elo rating that moves after each match according to the result, the opponent's rating and the goal margin. The expected result of the home side is
Ehome = 1 / (1 + 10−(Elohome + 100 − Eloaway) / 400)
and after the match each rating changes by
ΔElo = 20 · (R − E) · √max(1, |goal difference|), R = 1, ½ or 0
For a finished match, the forecast always uses the ratings as they were before kick-off.
From Elo to expected goals (EloLambda)
The core model, EloLambda, turns the rating difference into expected goals λ for each side in four steps.
- Rating gap. With d = (Elohome − Eloaway) / 100, a Poisson model gives λhome = μ·eβd + γ, λaway = μ·e−βd − γ with μ = 1.337, β = 0.152, γ = 0.114 for clubs. 100 Elo points change a side's goals by about 16%; home advantage is worth about 75 Elo points.
- Current scoring level. λ is scaled by the ratio of actual goals to model goals over the last 1000 matches (kept between 0.85 and 1.25).
- Attack and defence beyond Elo (AD_GXS). Each club has an attack value A and a defence value D, updated after every match from goals, expected goals (xG) and shots on target, and fading towards zero with a 90-day time constant. λhome is multiplied by eAhome − Daway, and the same for the away side.
- Squad availability. Missing players reduce their side's attack or weaken its defence, weighted by their role (core, starter, rotation, depth), minutes share and line (goalkeepers and defenders count for defence, forwards for attack, midfielders half and half).
From goals to probabilities
The two λ values define a grid of exact scores from 0–0 to 10–10. Each cell is the product of two Poisson probabilities with the Dixon-Coles correction, which slightly raises low-scoring draws:
P(i, j) ∝ Pois(i; λhome) · Pois(j; λaway) · τ(i, j), τ(0,0) = 1 − λhλat, τ(1,1) = 1 − t, τ(0,1) = 1 + λht, τ(1,0) = 1 + λat, t = −0.06
Summing the grid gives 1X2, over/under 2.5, both teams to score and the likeliest scores. Every market is always computed from the same λ, so the numbers on a page never contradict each other.
LOAD90 factors
LOAD90 extends EloLambda with factors from its own load model. A factor enters the main forecast only after it improved accuracy on seasons it was not fitted on (see How we test changes). We apply half of the measured effect, to stay on the safe side.
| Factor | Rule | Status |
|---|---|---|
| High Congestion | A team with 4 or more matches in the previous 14 days scores ×0.945 and concedes ×1.06. Over three top-5 seasons such teams scored about 11% fewer and conceded about 12% more goals than expected. | In the forecast |
| Possession | Average possession before the match (last year, recent matches weigh more). Per standard deviation (about 6.7%), a side scores about 2.8% more and its opponent about 1.4% more: teams that keep the ball play more open games. | In the forecast |
On match pages, Scenario lab shows the same match as Pure EloLambda, without the LOAD90 factors, so their effect is always visible. On 250 matches of the current season that were never used for fitting, adding possession improved the forecast (log-loss −0.008 per match).
The 0–100 scales
Model numbers are shown on fixed 0–100 scales with a logistic curve. For L90 Strength, 50 is a typical top-5-league club and 90 is title-contender level. The scales are frozen and never re-fitted, so the same rating always gives the same number across leagues and seasons.
| Scale | Built from | 50 means | 90 means |
|---|---|---|---|
| L90 Strength | Club Elo | Elo 1646, the median top-5 club-season 2020–2026 | Elo 1975 |
| League Strength | Mean Elo of the league's clubs | The median of 71 first-tier league-seasons | Historic Premier League level is 95 |
| Attack / Defence | Elo plus AD_GXS attack or defence, against an average top-5 opponent on neutral ground | Average top-5 attack or defence | Elite attack or defence |
| Form (last 5) | Points in the last five matches compared with what a median top-5 club (L90 Strength 50) would take from the same fixtures, so wins over strong opponents count for more. Shown next to it: points versus the club's own forecasts | A typical run | About 6 points more than a median club would take |
L90 Strength is LOAD90’s own club strength rating, built from club Elo. League Strength uses the mean Elo of the league’s clubs with a separate calibration (centre 1516, spread 77.4, versus 1646 and 150 for clubs). It is not the average L90 Strength; the two scores are not directly comparable.
Current Strength is L90 Strength after the club's own absences before its next match, converted back to Elo points. Match Strength adds everything the forecast uses for one specific match (venue, attack and defence, absences, playing style, High Congestion), and "Why strength changed" lists each part in Elo points.
Load: schedule, rest, travel, weather
The Load score (0–100) describes how hard a team's calendar is right now. It is a descriptive index, not a prediction: a team can have a high Load without it changing the forecast.
| Component | Points |
|---|---|
| Schedule (matches in the previous 14 days) | 3 → 15, 4 → 35, 5+ → 50 |
| Rest (days since the last match) | under 2.5 → 15, under 3.5 → 8 |
| Travel to the stadium | over 300 km → 6, over 800 → 12, over 1500 → 20; plus 5–10 for heavy travel in the last 14 days |
Levels: Low under 20, Moderate from 20, High from 40, Critical from 60. Weather (heat, cold, rain, wind, storms) is shown separately and is not added to Load. The High Congestion badge marks 4+ matches in 14 days, the only part of the schedule that measurably changes results.
Season forecast
The rest of the season is simulated 5000 times. Each remaining match is drawn from its stored forecast. Matches too far ahead to have one use Elo, the scoring level and fading attack/defence values. The table is ranked by points, then goal difference. The results are the title, top-4 and relegation probabilities, expected points and the likely range of positions. The Competitive Index is the entropy of the title probabilities: 100 means every club is equally likely to win, 0 means one club is certain.
How we test changes
- Only what Elo does not already know. A new factor is measured on what the current forecast missed, never on raw results.
- Out of sample. We fit on two seasons and test on the third, in turn, for top-5 leagues 2023/24–2025/26 (5256 matches). Then we check the current season, which was never used for fitting.
- Proper scores. Joint log-loss of the exact score (Joint NLL), plus Brier scores for 1X2, over/under 2.5 and both teams to score.
- A strict bar. When several factors are tested at once, a factor must beat the current forecast by about 2.7 standard errors, otherwise one of them would "work" by chance.
- Live scoreboard. After launch, every pre-match forecast is stored next to the control forecast and scored when the match ends. A factor that falls behind is removed.
What we tested and left out
Most ideas did not survive. We list them so the forecast stays explainable.
| Idea | Result |
|---|---|
| Short rest, rest advantage | No effect in any season. |
| Travel fatigue (long trips, kilometres in 14 days) | Opposite signs in different seasons. |
| Derbies and short trips | Looked strong in 2024–2026, reversed in 2023/24. Removed. |
| Previous match in a cup or European competition | Did not repeat in a second season. |
| Head-to-head record | No effect beyond team strength. Goals in past meetings mostly repeat what possession already says. |
| Pass accuracy, fouls, shot conversion | Small and not stable across seasons; largely a shadow of possession. |
| Yellow cards, save percentage, goals versus xG | No effect on goals. |
| 3 matches in 14 days | No effect; only 4+ matters. |
Rules we keep
- A pre-match forecast is frozen at kick-off and never changed afterwards.
- Forecasts rebuilt after a match (to fill older fixtures) use only the information available before kick-off, and are labelled as such.
- Scales and model parameters are versioned. A change gets a new version name instead of silently replacing the old one.
- Experimental factors are labelled on the page, and the forecast without them is always one click away.