Every number on Gaffer Maths comes from the pipeline below. We test it two ways: on a whole past season the model never saw, and every week against this season's results. Both are compared with simple baselines anyone could compute, and the weak spots are shown, not hidden.
Every hour from FPL: results, minutes, xG/xA, bonus, prices, ownership, fixtures and injury news. Stored per gameweek in our own database.
Four XGBoost models, one per position, trained on 2022/23–2025/26 with 20 features: recent points and minutes, xG/xA/xGI, ICT, clean sheets, starts, price, home/away, and the opponent's xG created and conceded over its last six matches.
85% ML + 15% recent form, plus an estimate of defensive-contribution points from each player's tackles, blocks and recoveries.
Injury news scales each gameweek ("75% chance" counts 75%, a return date switches the player back on). A minutes model learnt from three seasons turns recent starts, minutes and price into a start chance: on 2025/26 it beat "same as last match" (Brier 0.082 vs 0.111).
Separate 10th and 90th percentile models give every projection a low-to-high range, used for captain risk and Monte Carlo simulation.
A mixed-integer solver picks transfers, captain and chips over up to 8 gameweeks under every FPL rule: budget, 3 per club, banked transfers, hits.
Straight from FPL: points, minutes, goals, xG, prices, ownership, injury flags. We don't change these.
Our estimates: expected points (xP), the 10–90% range, chance of playing, chip and transfer values. Always shown with reasons.
Team news after the last sync, manager rotation hints, penalty takers changing, weather. Treat projections as a strong starting point, not a promise.
We retrained the same models on 2022/23, 2023/24 and 2024/25 only, then predicted all 27,238 player-fixtures across 37 gameweeks of 2025/26, using only information available before each match.
| Method | MAE ↓ | RMSE ↓ | Rank ↑ | Top-20 ↑ | Captain ↑ |
|---|---|---|---|---|---|
| Gaffer Maths xPtsLive | 1.003 | 1.929 | 0.341 | 4.35 | 5.92 |
| Without opponent features | 1.006 | 1.934 | 0.336 | 4.23 | 5.84 |
| ML core only | 1.000 | 1.919 | 0.346 | 4.33 | 5.27 |
| Form (last 5) | 1.036 | 2.085 | 0.276 | 3.95 | 4.92 |
| Last 3 average | 1.042 | 2.152 | 0.262 | 3.77 | 4.84 |
| Season average | 1.061 | 2.080 | 0.263 | 3.79 | 5.51 |
| Last GW | 1.136 | 2.565 | 0.235 | 3.49 | 4.84 |
Rank = Spearman correlation among players who featured. Top-20 = average actual points of each method's 20 highest-projected players per gameweek. Captain = actual points (before doubling) of each method's #1 pick. Best value in each column highlighted.
Why the “without opponent features” row: until October 2026 our training data gave every fixture the same difficulty, so the model couldn't learn anything about the opponent. It now sees each opponent's recent xG created and conceded. Same data, same settings, only that change: rank correlation 0.336 → 0.341, top-20 picks 4.23 → 4.35 pts. A real but modest gain.
Projections grouped by size. On the dashed line, a player we project for 3 points scores 3 on average. Dot size = number of samples; buckets with fewer than 30 are hidden.
Weak spot: in 2025/26, players we projected for 4+ points scored 0.6 pts less than projected on average (1,458 cases). Our biggest projections run optimistic, which matters most for captaincy.
If the range is honest, about 10% of scores fall below it and 10% above (black tick). Players are grouped by their minutes over the previous three gameweeks, which is known before kick-off.
What this tells us: for regular starters and rotation players the range is close to honest, and the average projection matches the average score almost exactly. For fringe players it's too wide: most of them score nothing, so their low end rarely gets beaten.
Our #1 pick beat every baseline in 2025/26 (5.9 vs 4.9 for form and 5.5 for season average). But with ±0.78 points of noise per pick over 37 gameweeks, those gaps aren't statistically meaningful. The best possible pick averaged 16.4: nobody calls hauls reliably. That's why the captain page shows blank and haul chances, not just one name.
Walk-forward: for each finished gameweek, every player is predicted using only data from before it. 3,273 player-gameweeks so far (GW2–GW6). Early-season samples are small, so expect these to move.
| Method | MAE ↓ | RMSE ↓ | Rank ↑ | Top-20 ↑ | Captain ↑ |
|---|---|---|---|---|---|
| Gaffer Maths xPtsLive | 1.178 | 2.104 | 0.390 | 4.47 | 15 |
| ML core only | 1.184 | 2.099 | 0.394 | 4.98 | 15 |
| Blend 70/30 | 1.179 | 2.127 | 0.380 | 4.43 | 16 |
| Blend 50/50 | 1.194 | 2.187 | 0.367 | 4.25 | 9 |
| Form (last 5) | 1.285 | 2.460 | 0.324 | 4.15 | 14 |
| Last 3 average | 1.278 | 2.474 | 0.328 | 4.03 | 18 |
| Points per game | 1.368 | 2.560 | 0.313 | 4.05 | 0 |
The live xPts mixes the ML projection with recent form (85/15). That weight was chosen on these same gameweeks, so expect slightly worse results going forward; the full-season holdout above is the fairer test. Captain = total actual points of each method's weekly #1 pick (best possible: 90). Our #1 pick returned 6+ points in 20% of gameweeks and was a top-5 scorer in 0%.
Average error, lower is better (axis starts at 0.97)
Same check as above, on 2026/27 so far. Buckets with few players (the biggest projections) swing a lot week to week.
| GW | Gaffer Maths' #1 | Form's #1 | Actual top scorer |
|---|---|---|---|
| 2 | Palmer (7) | De Cuyper (0) | B.Fernandes (23) |
| 3 | B.Fernandes (2) | B.Fernandes (2) | Mitchell (15) |
| 4 | B.Fernandes (2) | Gakpo (1) | Groß (17) |
| 5 | B.Fernandes (2) | Bogle (5) | Semenyo (17) |
| 6 | Saka (2) | Groß (6) | Henderson (18) |
Four XGBoost models, one per position, 20 features, tuned with Optuna (cross-validated) and trained on every season we hold. Scores below are on a random 20% held out from training.
20261014-095726_0068ad3trained on 2022/23, 2023/24, 2024/25, 2025/26 · 103,745 rowsPromoted 5 d ago over 20261014-091400_99c6382 after scoring MAE 1.179, RMSE 2.104, rank 0.390 on 2026/27 GW2-6. Every new model must be at least as good as the live one on all three before it goes live; older versions are kept for rollback.
Use xP to compare players and plans, not to predict exact scores. Look at the range for risk and the reasons for context. The optimiser maximises projected points under FPL's rules; it's only as good as these projections. Both backtests are re-run automatically: the live one every morning, the holdout whenever the models are retrained. About Gaffer Maths →