Before every deadline we freeze the expected-points feed. Once FPL has finalised the gameweek, we score that frozen file against what actually happened. Nothing on this page can be edited after the fact, and every number says which players it was calculated over.
not yetNot yet. The rule needs 6 graded gameweeks with our model ahead of FPL’s feed on rank match among starters, the lead clear of chance, and at least as many of the top 20 starters picked. So far: 2 of 6 gameweeks graded with both sets of numbers frozen; our model is not ahead of FPL’s feed on rank match among starters; it picks fewer of the top 20 starters than FPL’s feed.
Over the 2 gameweeks in the window our model’s rank match among starters is -0.051 against FPL’s feed (95% interval -0.183 to +0.081), and it picks 0.150 of the top 20 starters against the feed’s 0.203.
The rule is written down in the xPoints repository's score.py and evaluated over the last 6 graded gameweeks (currently gameweeks 4, 5).
| GW | Players graded all / starters | FPL's feed | Our model (shadow) | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Average error | Zero guess | Rank match | Top 20 | Captain regret | Average error | Rank match | Top 20 | Captain regret | ||
| GW1 | 600 / 210 | 1.598 | 1.593 | 0.086-0.05 to 0.22 | 0.11 | 13.4 | n/a | n/a | n/a | n/a |
| GW2 | 616 / 209 | 1.467 | 1.450 | 0.1730.04 to 0.32 | 0.32 | 9.8 | n/a | n/a | n/a | n/a |
| GW3 | 652 / 212 | 1.295 | 1.402 | -0.023-0.16 to 0.11 | 0.10 | 13.0 | 1.100 | -0.044-0.16 to 0.08 | 0.08 | 6.0 |
| GW4 | 656 / 197 | 1.234 | 1.431 | 0.2130.08 to 0.35 | 0.25 | 15.0 | 1.099 | 0.2300.10 to 0.35 | 0.20 | 8.0 |
| GW5 | 659 / 211 | 1.158 | 1.473 | 0.099-0.03 to 0.24 | 0.16 | 12.0 | 1.065 | -0.019-0.16 to 0.12 | 0.10 | 11.0 |
Average error covers every player in the file. When the Zero guess column is red, predicting zero points for every player was closer than the feed that week. That happens because most players score zero, so we show this number but never use it to choose a model. The data behind each row (every player's prediction, minutes and points) is in the scores folder on GitHub.
Expected points are an average, so the first question is whether the average comes out right. Bias is the average prediction minus the average result over every player in the file: zero is the aim, a minus sign means the forecast ran low. Squared error (root mean square) punishes big misses and is smallest for a forecast whose averages are right. The average error in the table above is kinder to a forecast that shrinks everyone towards zero, because half the players score nothing, so a lower average error is not proof of a better forecast on its own.
| GW | Bias, points a player | Squared error | Model version | ||
|---|---|---|---|---|---|
| FPL's feed | Our model | FPL's feed | Our model | ||
| 1 | -0.06 | n/a | 2.62 | n/a | |
| 2 | +0.06 | n/a | 2.37 | n/a | |
| 3 | +0.06 | -0.25 | 2.41 | 2.05 | xpoints-two-stage-blend-v2 |
| 4 | +0.00 | -0.21 | 2.28 | 2.15 | xpoints-two-stage-blend-v3 |
| 5 | -0.12 | -0.33 | 2.29 | 2.17 | xpoints-two-stage-blend-v3 |
Over 5 graded gameweeks FPL's feed has averaged -0.01 points a player (on the mark). Bias is only meaningful over every player: among players who played, any honest forecast reads low, because it could not know who would play. Model versions are never added together; a new version starts its own record.
Who is counted. All means every player in the frozen file. Starters means the players who played 60 minutes or more that gameweek. The same feed can look good on one group and close to random on the other. In Gameweek 1 it ordered the full list well, largely by giving near-zero to players who did not play, and only a little better than chance among those who did. So every number here says which group it covers.
Rank match is a rank correlation (Spearman). It asks whether the feed put players in the order their points actually fell. 1 is a perfect order, 0 is no better than chance. This is the number that decides whether our model replaces FPL's figure. The small range beside it is a 95% confidence interval.
Top 20 is the share of the feed's top 20 who finished in the real top 20 that week. Captain regret is the best score any player got that week minus the score of the feed's top pick, so lower is better.
Each measure has an entry in the glossary, and the methodology explains why these three and how the promotion rule uses them.
The three feeds. FPL's feed is the official expected-points figure from the game itself, and it is what the app shows today. Price only ranks players by price and nothing else, a sanity check any model must beat (it appears once the next gameweek is graded). Our model is FPL Analyst's own projection. It runs in shadow, is graded here every gameweek, and replaces FPL's figure in the app only after it has won over a run of gameweeks, not before.
One gameweek tells you very little. Rank match among starters moves by about 0.091 from one gameweek to the next through luck alone (measured from the graded gameweeks).
To be reasonably sure that one feed beats another by +0.05 in rank match takes about 26 gameweeks of evidence, or about 35 to be very sure.
Until that many gameweeks exist, a lead on this page is a hint, not proof, and the page will say so rather than round up.
What no feed can see: late team news, press conferences after the freeze, and rotation decided on the day. Predictions are frozen at the deadline, and those things happen after it.
| Projection | Gameweeks | Average error | Zero guess | Rank match, starters | Top 20 |
|---|---|---|---|---|---|
| FPL's feed, same gameweeks | 2 | 1.196 | 1.452 | 0.156 | 0.20 |
| Made at the deadline | 2 | 1.196 | 1.452 | 0.156 | 0.20 |
| Made one deadline earlier | 1 | 1.285 | 1.480 | 0.071 | 0.11 |
At the deadline the site's average error is the same as the feed's, as it should be: the next gameweek reproduces the feed. projections made one deadline earlier carry an average error of 1.29. The feed's row is averaged over the gameweeks the deadline row covers, not the whole season. A projection made at the deadline is the feed carried through expected minutes and fixtures; the earlier it was made, the more it rests on the site's own model, so the later rows are the honest test of the planner. Every row is averaged over the gameweeks it covers; per-gameweek entries are in the site scores folder.
| Chance of sixty minutes, as given | Players | Average given | Actually played sixty |
|---|---|---|---|
| 0% to 20% | 402 | 5% | 5% |
| 20% to 40% | 50 | 31% | 30% |
| 40% to 60% | 22 | 51% | 59% |
| 60% to 80% | 63 | 69% | 75% |
| 80% to 100% | 122 | 90% | 94% |
Over 2 graded gameweeks; the table is Gameweek 5. A well-calibrated chance means the last two columns agree in every row.
Scorecard generated 28 Sept 2026, 00:28 UTC. Latest graded gameweek: GW5. Method, source code and raw scores are on GitHub. Back to xPoints.