2025/26 FPL back-test: projected vs actual points
A retrospective back-test of KFT's current deterministic forecasting core across all 38 gameweeks of last season.
Test completed: · Report prepared: · Season: 2025/26, GW1–38
Read this before the numbers: these forecasts were reconstructed after the season. They are not predictions published during 2025/26, an untouched holdout, or a full replay of every live production input.
See the results · See the largest misses · Find a player · Read the method and limits
The result is mixed
On 8,258 player-weeks projected for at least 45 minutes, full-points RMSE was 3.087, versus 3.311 for a simple past-average baseline. Full-points MAE was 2.374, slightly worse than the baseline's 2.367. The model reduced large errors in this replay; it did not win on every metric.
Lower MAE and RMSE are better. MAE is the average absolute points miss; RMSE gives large misses more weight. Bias is projected minus actual, so a positive number means overprediction. All metrics are pooled over player-weeks, rather than an unweighted average of weekly scores.
| Target | Metric | KFT replay | Past-average baseline |
|---|---|---|---|
| Points excluding bonus · primary | MAE | 2.061 | 2.074 |
| Points excluding bonus · primary | RMSE | 2.601 | 2.804 |
| Points excluding bonus · primary | BIAS | 0.192 | -0.344 |
| Full FPL points · approximate bonus | MAE | 2.374 | 2.367 |
| Full FPL points · approximate bonus | RMSE | 3.087 | 3.311 |
| Full FPL points · approximate bonus | BIAS | 0.207 | -0.369 |
Points excluding bonus are the primary endpoint because bonus is only approximately forecast. The paired four-gameweek block-bootstrap 95% interval for the non-bonus MAE difference (model minus baseline) is −0.061 to +0.031, crossing zero; the RMSE interval is −0.276 to −0.146. These intervals are conditional on the reconstruction assumptions. This report does not establish an advantage over another forecasting website.
Keep the sample in view
| Pool | Rows | KFT MAE | KFT RMSE | Baseline MAE | Baseline RMSE |
|---|---|---|---|---|---|
| Predicted 45+ minutes | 8258 | 2.374 | 3.087 | 2.367 | 3.311 |
| All matched; includes non-players | 29646 | 0.909 | 1.917 | 1.075 | 2.098 |
All 29,646 matched player-weeks remain in the downloadable record. The all-player pool includes many straightforward zero-minute, zero-point rows, which makes its error look smaller. The headline pool is selected using projected minutes, never actual points or actual minutes; unexpected starters remain visible in the full record and explorer.
Coverage: 101 actual player-week entries were absent from the reconstructed pre-deadline rosters; nine were appearances. These are unscored coverage gaps, not zero-error forecasts. No roster row lacks an actual result. Blank and double gameweeks are retained.
All 38 gameweeks, including the bad ones
Same predicted-45+-minute pool each week. Projected and actual columns are mean full FPL points per selected player-week. The comparison CSV provides the individual scores.
| GW | Rows | Projected mean | Actual mean | KFT MAE | Baseline MAE | KFT RMSE | Baseline RMSE |
|---|---|---|---|---|---|---|---|
| 1 | 220 | 3.373 | 2.814 | 2.646 | 2.266 | 3.376 | 3.331 |
| 2 | 214 | 3.168 | 3.229 | 2.570 | 3.103 | 3.540 | 4.645 |
| 3 | 211 | 3.183 | 3.265 | 2.326 | 2.775 | 2.994 | 3.673 |
| 4 | 214 | 3.270 | 3.355 | 2.315 | 2.413 | 2.993 | 3.181 |
| 5 | 216 | 3.281 | 2.870 | 2.173 | 2.205 | 2.881 | 3.083 |
| 6 | 218 | 3.304 | 2.839 | 2.251 | 2.248 | 2.968 | 3.108 |
| 7 | 216 | 3.319 | 3.185 | 2.180 | 2.329 | 2.883 | 3.054 |
| 8 | 223 | 3.280 | 3.318 | 2.390 | 2.477 | 3.272 | 3.576 |
| 9 | 214 | 3.370 | 3.421 | 2.534 | 2.513 | 3.475 | 3.632 |
| 10 | 218 | 3.370 | 3.294 | 2.213 | 2.301 | 2.785 | 2.957 |
| 11 | 215 | 3.428 | 3.428 | 2.464 | 2.533 | 3.186 | 3.438 |
| 12 | 216 | 3.407 | 3.380 | 2.548 | 2.504 | 3.526 | 3.655 |
| 13 | 217 | 3.361 | 3.028 | 2.334 | 2.484 | 3.012 | 3.337 |
| 14 | 221 | 3.331 | 3.167 | 2.446 | 2.395 | 3.244 | 3.325 |
| 15 | 228 | 3.281 | 2.996 | 2.349 | 2.155 | 3.006 | 2.908 |
| 16 | 223 | 3.305 | 3.260 | 2.399 | 2.473 | 3.197 | 3.385 |
| 17 | 221 | 3.472 | 3.308 | 2.353 | 2.368 | 3.122 | 3.396 |
| 18 | 220 | 3.411 | 3.445 | 2.380 | 2.452 | 3.224 | 3.551 |
| 19 | 225 | 3.381 | 3.347 | 2.417 | 2.349 | 3.028 | 3.179 |
| 20 | 227 | 3.322 | 3.079 | 2.234 | 2.323 | 2.963 | 3.309 |
| 21 | 223 | 3.325 | 2.996 | 2.228 | 2.004 | 2.827 | 2.843 |
| 22 | 218 | 3.430 | 3.174 | 2.416 | 2.344 | 2.961 | 3.095 |
| 23 | 215 | 3.399 | 3.019 | 2.469 | 2.284 | 3.036 | 3.040 |
| 24 | 220 | 3.406 | 3.041 | 2.288 | 2.232 | 2.866 | 3.069 |
| 25 | 222 | 3.319 | 3.090 | 2.343 | 2.224 | 3.056 | 3.198 |
| 26 | 225 | 3.694 | 3.356 | 2.564 | 2.523 | 3.297 | 3.647 |
| 27 | 212 | 3.412 | 3.335 | 2.408 | 2.267 | 3.126 | 3.187 |
| 28 | 222 | 3.388 | 2.887 | 2.263 | 2.128 | 2.785 | 2.893 |
| 29 | 225 | 3.350 | 3.133 | 2.366 | 2.321 | 3.041 | 3.235 |
| 30 | 226 | 3.318 | 3.075 | 2.264 | 2.265 | 2.739 | 2.954 |
| 31 | 180 | 3.294 | 3.328 | 2.449 | 2.302 | 3.110 | 3.191 |
| 32 | 219 | 3.353 | 2.945 | 2.353 | 2.155 | 3.175 | 3.236 |
| 33 | 237 | 4.230 | 4.291 | 2.623 | 2.893 | 3.488 | 4.214 |
| 34 | 158 | 3.283 | 3.057 | 2.352 | 2.288 | 2.970 | 3.106 |
| 35 | 217 | 3.392 | 2.917 | 2.271 | 2.160 | 2.965 | 3.041 |
| 36 | 226 | 3.648 | 3.212 | 2.282 | 2.248 | 2.859 | 3.006 |
| 37 | 216 | 3.342 | 3.014 | 2.270 | 2.160 | 3.027 | 3.178 |
| 38 | 220 | 3.338 | 2.836 | 2.495 | 2.446 | 3.025 | 3.165 |
The largest misses stay in
The 20 largest absolute full-points errors across all matched player-weeks, chosen by error magnitude, including zero-minute forecasts. A negative error is an underestimated return; a positive error is an overprediction. These are descriptive examples, not a separate performance sample.
| GW | Player | Position | Projected | Actual | Error | Expected mins | Actual mins |
|---|---|---|---|---|---|---|---|
| 2 | J.Timber | DEF | 3.68 | 24 | -20.32 | 64.8 | 63 |
| 9 | Van de Ven | DEF | 3.02 | 23 | -19.98 | 90.0 | 90 |
| 17 | Lewis-Potter | DEF | 3.01 | 21 | -17.99 | 55.6 | 90 |
| 38 | Dorgu | DEF | 0.99 | 18 | -17.01 | 14.8 | 61 |
| 16 | Hudson-Odoi | MID | 2.04 | 19 | -16.96 | 39.2 | 90 |
| 28 | Damsgaard | MID | 1.10 | 18 | -16.90 | 15.3 | 90 |
| 32 | Mavropanos | DEF | 4.39 | 21 | -16.61 | 81.5 | 90 |
| 18 | Schade | MID | 3.82 | 20 | -16.18 | 71.1 | 90 |
| 14 | Romero | DEF | 0.91 | 17 | -16.09 | 31.5 | 90 |
| 20 | Rice | MID | 1.39 | 17 | -15.61 | 27.2 | 90 |
| 16 | Sangaré | MID | 2.61 | 18 | -15.39 | 56.3 | 90 |
| 35 | Awoniyi | FWD | 0.72 | 16 | -15.28 | 2.6 | 90 |
| 25 | Palmer | MID | 4.87 | 20 | -15.13 | 73.0 | 60 |
| 12 | Murillo | DEF | 2.06 | 17 | -14.94 | 90.0 | 90 |
| 33 | Gibbs-White | MID | 5.28 | 20 | -14.72 | 90.0 | 88 |
| 13 | L.Miley | MID | 0.34 | 15 | -14.66 | 3.5 | 90 |
| 29 | João Pedro | FWD | 4.44 | 19 | -14.56 | 90.0 | 84 |
| 19 | Gabriel | DEF | 0.50 | 15 | -14.50 | 8.4 | 76 |
| 16 | Gusto | DEF | 3.61 | 18 | -14.39 | 83.2 | 90 |
| 10 | Gomez | MID | 1.63 | 16 | -14.37 | 40.0 | 80 |
When the projection was too high
The ten largest overpredictions across the same complete matched pool. The largest absolute misses above happen to be underestimated returns; both directions of error remain in the record.
| GW | Player | Position | Projected | Actual | Error | Expected mins | Actual mins |
|---|---|---|---|---|---|---|---|
| 1 | Adingra | MID | 18.17 | 6 | +12.17 | 90.0 | 75 |
| 33 | Palmer | MID | 12.66 | 2 | +10.66 | 180.0 | 90 |
| 33 | João Pedro | FWD | 8.91 | 0 | +8.91 | 162.3 | 0 |
| 1 | Harrison | MID | 9.72 | 1 | +8.72 | 90.0 | 12 |
| 6 | Chalobah | DEF | 4.85 | -3 | +7.85 | 90.0 | 52 |
| 2 | Haaland | FWD | 9.68 | 2 | +7.68 | 88.0 | 90 |
| 6 | B.Fernandes | MID | 6.43 | -1 | +7.43 | 90.0 | 90 |
| 35 | Palmer | MID | 7.05 | 0 | +7.05 | 90.0 | 90 |
| 13 | M.Salah | MID | 6.91 | 0 | +6.91 | 90.0 | 0 |
| 38 | Haaland | FWD | 6.87 | 0 | +6.87 | 90.0 | 0 |
Expected-minutes MAE was 18.01 minutes with +8.90 minutes bias in the headline pool. Minutes allocation remains a weakness. Stronger results later in some metrics do not mean improvement was steady.
Inspect any matched player-week
The explorer starts with every matched row, ordered by largest miss. Search, gameweek and pool controls change only the table; the headline results above always use the stated full sample.
The complete CSV is also available below. No sign-in needed.
| GW | Player | Position | Projected | Actual | Error | Expected mins | Actual mins |
|---|
What this test does and does not measure
Each week's player inputs were reconstructed from archived pre-deadline snapshots. Rates and minutes histories use earlier fixture rows whose kickoff plus three hours precedes the deadline. Target results are joined only for scoring. Previous-season priors use completed 2024/25 data with unambiguous normalized-name matches; unmatched players use available-data fallbacks. Team models are refitted using eligible earlier Understat matches.
The baseline is each player's points from earlier completed gameweeks divided by elapsed completed gameweeks, including blanks. For GW1 it uses the matched previous-season total divided by 38, or zero without an unambiguous match. It is intentionally simple, is not adjusted for the new defensive-contribution rules at GW1, and is compared on exactly the same rows.
- The model design and constants were chosen after this season. This is a development back-test, not an untouched out-of-sample accuracy record.
- Fixture assignments use the final archived schedule rather than timestamped as-of schedules. Blanks have zero fixtures; doubles sum the week's fixtures.
- 2025/26 goalkeeper-goal and defensive-contribution scoring are applied. Bonus is an approximate current-design forecast; the primary endpoint excludes it.
- Archived statistics may include later revisions. Promoted and foreign-player priors are incomplete. Unmatched new players can receive weak fallbacks, including zero forecasts.
- Untimestamped closing odds, today's market targets and trained ML/Monte Carlo artifacts are excluded. Some live team-form, player-Understat and market-calibration layers have no equivalent historical inputs.
- These are rolling one-week-ahead projections. Their sum is not a preseason season-total prediction. This report does not validate Monte Carlo ranges or compare competitor models.
Download and audit the record
Every projected vs actual row (CSV) · Deadlines, snapshot dates and coverage (CSV) · Unrounded metrics and weekly-file checksums (JSON) · Snapshot source URLs and checksums (JSON)
The CSV keeps full exported precision, model and baseline scores, non-bonus points, minutes, sample membership and each week's deadline/snapshot date. Display tables round values for readability. The 409 blank-roster rows retain their player IDs; unavailable names or positions are labelled explicitly. No misses were trimmed and no missing players were converted into correct zero predictions.
Source archives: Fantasy-Premier-League historical actuals, FPL Core Insights snapshots and Understat match history. Snapshot URLs and hashes are listed in the source download. Learn how the live model works on the methodology page.