Accuracy record · 2026-27 · settled
Gameweek 1
In GW1 the model missed by 2.75 points a player across the 95 likely starters it scored, and the real team scored 59.
There’s one of these for every settled GW, good or bad, and I don’t touch them once they’re up. The misses are at the top, and everything they’re worked out from is further down.
Where Gameweek 1 went wrong
- Worse than usual this week - the model was out by 2.75 points a player, against 2.44 across the season so far.
- Too optimistic overall: it predicted 332 points for 95 likely starters, who scored 302, so it was 10% too high.
- 11 points sat on the bench and did not count (no Bench Boost).
- Captain Mbeumo scored 2, tripled to 6 by the Triple Captain.
- The best team the model could legally have bought scored 38, 26% of the 148 a perfect-hindsight XI would have made.
What went right
- The model was closer than last season's points per game on points per player: 2.75 to 2.93 on the 95 players both scored.
- The model was closer than last season's points per game on the big misses: 3.35 to 3.38 on the 95 players both scored.
- The model ordered the players better than last season's points per game: 0.29 to 0.27 on the 95 players both scored.
- The team scored 59, 9 above the average manager's 50.
Not available this week
- No haul figures for this week. The predictions it's marked against didn't keep haul probabilities, so I've nothing to score this on.
- GW1 is marked against the predictions committed before the season started (the "seed"), because I wasn't keeping the live runs yet.
- There's no elite comparison this week because no top-10k sample was taken.
League-wide accuracy
Scored over predicted E[minutes] > 60 (n=95 of 584 player-fixtures). Every figure below is this gameweek only; the season-to-date line beside each one is the pooled figure across all settled gameweeks.
Prediction vintage: 18 Aug, 21:51 UTC seed · Predictions are from the last model run before each gameweek's deadline (90 minutes before the first kickoff). A gameweek marked 'seed' is from before I kept the runs, so it's scored against the pre-season predictions I committed.
95% percentile intervals from a row-level bootstrap (1000 resamples, seeded). Player-fixtures in the same GW share fixtures and clean sheets, which makes these intervals understate the true width - read them as a floor on the uncertainty. Fewer than 50 hauls is too few to claim a result from a haul AUC.
The same error on every group of players
I never show the every-player figure on its own (SPEC §1.6), so all four are here. Whichever group you think is the right one, my number for it is on the page - just compare it with other people's on the same rows.
| Population | n | MAE | RMSE | Season MAE |
|---|---|---|---|---|
| Every player-fixture with a prediction | 584 | 1.49 | 2.56 | 1.16 |
| Predicted E[minutes] > 0 | 519 | 1.67 | 2.72 | 1.35 |
| Played at least one minute (selected on the outcome)hindsight | 301 | 2.21 | 3.40 | 2.00 |
| Predicted E[minutes] > 60headline | 95 | 2.75 | 3.35 | 2.44 |
Reliability of the stated probabilities
In each bin of predicted probability, what fraction actually happened, with a Wilson 95% interval. A calibrated forecaster's observed column tracks its predicted column. The minutes model's P(60+) is read on every gameweek, the haul probabilities on the gameweeks whose run retained them.
| Predicted | Observed | 95% | n |
|---|---|---|---|
| 1% | 1% | 0–5 | 118 |
| 5% | 4% | 1–12 | 57 |
| 8% | 34% | 23–47 | 59 |
| 12% | 26% | 16–38 | 58 |
| 18% | 41% | 30–54 | 58 |
| 27% | 41% | 29–53 | 59 |
| 38% | 53% | 41–66 | 58 |
| 61% | 71% | 58–81 | 58 |
| 80% | 85% | 73–92 | 59 |
Against the comparators
The model's error next to a comparator's, on the same rows. If a comparator can't cover every row the model scored, I drop the rows it's missing and re-score the model on what's left. The model's headline number for the week isn't part of the comparison.
Each player's total FPL points last season divided by his appearances, which is the number most of us reach for before a ball is kicked.
Rows covered. This comparator scored 95 of the model's 95 rows for this GW, with none of the model’s rows excluded. Every “model” number in this table is the model re-scored on exactly the 95 rows it covers, which is the only like-for-like comparison.
Population: reference arm's predicted E[minutes] > 60, imposed on every arm (n=95 of 403 player-fixtures); players with a prior-season appearance only
| Metric | Model · these 95 rows | Last season's points per game |
|---|---|---|
MAE model ahead | 2.75 | 2.93 |
RMSE model ahead | 3.35 | 3.38 |
Spearman rank correlation model ahead | 0.29 | 0.27 |
Haul AUC, 6+ points not carried by this arm | — | — |
Haul AUC, 10+ points not carried by this arm | — | — |
A dash means there’s no figure for that metric from this comparator, which isn’t the same as a zero. “No direction stated” means the data doesn’t say which way is better for that metric, and without that I don’t call a winner.
How much the top-10k sample owned each player at the last capture before the deadline, including captaincy. It doesn't come with a points prediction so I only score it as a rank.
Different rows. This comparator scored 0 of the model's 95 rows for this GW; 95 of the model’s rows are left out because it has nothing to say about them. Every “model” number in this table is the model re-scored on exactly the 0 rows it covers. Its headline error for the GW (2.75, over 95 rows) is not the one to read against this comparator.
Population:
| Metric | Model · these 0 rows | Top-10k effective ownership |
|---|---|---|
MAE not carried by this arm | — | — |
RMSE not carried by this arm | — | — |
Spearman rank correlation not carried by this arm | — | — |
Haul AUC, 6+ points not carried by this arm | — | — |
Haul AUC, 10+ points not carried by this arm | — | — |
A dash means there’s no figure for that metric from this comparator, which isn’t the same as a zero. “No direction stated” means the data doesn’t say which way is better for that metric, and without that I don’t call a winner.
The expected-points figure FPL publishes for each player before the GW, captured between the previous deadline and this one. It's a per-GW number and can't tell you anything about the second game in a DGW, so like the ownership figure I only score it as a rank.
Different rows. This comparator scored 0 of the model's 95 rows for this GW; 95 of the model’s rows are left out because it has nothing to say about them. Every “model” number in this table is the model re-scored on exactly the 0 rows it covers. Its headline error for the GW (2.75, over 95 rows) is not the one to read against this comparator.
Population:
| Metric | Model · these 0 rows | FPL's own projection (ep_next) |
|---|---|---|
MAE not carried by this arm | — | — |
RMSE not carried by this arm | — | — |
Spearman rank correlation not carried by this arm | — | — |
Haul AUC, 6+ points not carried by this arm | — | — |
Haul AUC, 10+ points not carried by this arm | — | — |
A dash means there’s no figure for that metric from this comparator, which isn’t the same as a zero. “No direction stated” means the data doesn’t say which way is better for that metric, and without that I don’t call a winner.
How the comparators are scored Lower is better for MAE and RMSE, and higher is better for Spearman and haul AUC. Which way is better is stored with each metric and the verdicts just follow that. Each baseline is scored on the model's own likely starters (expected minutes over 60) and reports the model's score over those same rows, which keeps the two numbers like for like even when the baseline can't cover every row. Overall Spearman and AUC are averages over the GWs where both sides have a value. I don't pool them across gameweeks, because that would rank a GW1 blank against a GW7 haul.
Legal-squad Team of the Week
Picked from the last model run before the deadline, at the prices captured before it, then scored on what actually happened.
Not comparable with the real entry. A fresh £100.0m squad bought from scratch every gameweek - it never pays a transfer hit or banks a price rise and nothing carries over from the week before. Think of it as a weekly check on the model's picks within the real squad rules. Nobody could run a team this way in practice, so it's not comparable with a managed entry.
| Player | Club | Pos | Points |
|---|---|---|---|
| Raya | Arsenal | GK | 6 |
| Gabriel | Arsenal | DEF | 5 |
| O'Reilly | Man City | DEF | 2 |
| Virgil | Liverpool | DEF | 2 |
| Tarkowski | Everton | DEF | 6 |
| Mbeumo(C) | Man Utd | MID | 2 |
| B.Fernandes | Man Utd | MID | 2 |
| Szoboszlai | Liverpool | MID | 8 |
| Rice | Arsenal | MID | 3 |
| Wirtz | Liverpool | MID | 2 |
| Watkins | Aston Villa | FWD | 0 |
| Bench (does not score) | |||
| Dubravka | Spurs | GK | 0 |
| Diop | Ipswich Town | DEF | 2 |
| Destan | Hull City | FWD | 0 |
| Walle Egeli | Ipswich Town | FWD | 1 |
Against the real entry
Don’t read this as a head-to-head. A fresh £100.0m squad bought from scratch every gameweek - it never pays a transfer hit or banks a price rise and nothing carries over from the week before. Think of it as a weekly check on the model's picks within the real squad rules. Nobody could run a team this way in practice, so it's not comparable with a managed entry.
Deadline 21 Aug, 17:30 UTC · prediction 18 Aug, 21:51 UTC (seed) · prices 18 Jul, 13:53 UTC–21 Aug, 17:01 UTC (241 from an earlier capture) · pool 587 of 587 predicted · 587 of them had no earlier appearance to read position and club from, so those came from this gameweek
The real entry · Sideline's Team
This is the squad the model actually ran. Unlike the Team of the Week above, it has to live with its transfer hits, its bench and whatever it carried over from the week before.
| Player | Club | Mins | Bonus | Points |
|---|---|---|---|---|
| Raya | Arsenal | 90 | 0 | 6 |
| Gabriel | Arsenal | 90 | 0 | 5 |
| O'Reilly | Man City | 62 | 0 | 2 |
| Virgil | Liverpool | 90 | 0 | 2 |
| Calafiori | Arsenal | 80 | 0 | 9 |
| Tarkowski | Everton | 90 | 0 | 6 |
| B.Fernandes(V) | Man Utd | 90 | 0 | 2 |
| Szoboszlai | Liverpool | 90 | 1 | 8 |
| Wirtz | Liverpool | 62 | 0 | 2 |
| Mbeumo(C) | Man Utd | 90 | 0 | 2 |
| João Pedro | Chelsea | 90 | 2 | 11 |
| Phillipsbench | Hull City | 0 | 0 | 0 |
| Tavernierbench | Bournemouth | 90 | 3 | 10 |
| Walle Egelibench | Ipswich Town | 10 | 0 | 1 |
| Kusi-Asarebench | Fulham | 0 | 0 | 0 |
Cumulative after this gameweek: 59 · captured 28 Aug, 17:08 UTC · 25 squad captures
Where these numbers come from
Predictions are from the last model run before each gameweek's deadline (90 minutes before the first kickoff). A gameweek marked 'seed' is from before I kept the runs, so it's scored against the pre-season predictions I committed.
Population scored: predicted E[minutes] > 60 (n=95 of 584 player-fixtures).
This page is a slice of the same /performance/live payload that drives the full record, which means a GW page and the season page can’t disagree. The projections themselves are published in full at /data/gw/1.
The exact rows this GW was scored on (the last run before the deadline, as it was served) are at fpl-quant-api.fly.dev/performance/live/gw/1/predictions with sha256 4d566e22…dc02. The digest is of the rows array alone as compact JSON (no whitespace), rows sorted by player then fixture, and the response says so beside it. You can recompute any number on this page from them.
What this record measures, on which rows, against which comparators and at which checkpoints was fixed in advance: the pre-registration (sha256 27307797…ba4f, checkpoints GW10, GW19, GW38).
Every settled gameweek has a page: GW1, GW2, GW3, GW4, GW5, GW6, GW7, GW8.