Skip to main content

We use cookies for analytics. Privacy

Back to Work
AI & Machine Learning/ Case study

FPLBench

A Fantasy Premier League forecast that is committed before every deadline and scored in public

Built with

Python / LightGBM

Source code

Inside the project

01 / 01

FPLBench

FPLBench1 / 1

FPLBench

FPLBench

The brief

The problem

Fantasy football models are easy to evaluate badly. Statistics from the same gameweek can leak the answer, double gameweeks can contaminate each other's history, and a live score can still change while FPL reviews it. Most published models are graded on data they could not have had at the deadline.

Our approach

The data pipeline shifts every performance feature so a row only sees what was known before its first fixture, including in double gameweeks. FPL's post-match expected points are kept as a baseline and never used for training. LightGBM models predict minutes and points, and a calibrated classifier predicts the new defensive-contribution bonus. The weekly forecast is committed to git before the deadline, and a guard rejects later overwrites. Scores are written only after FPL marks the gameweek finished and data-checked. A transfer planner picks moves for the model's own FPL team. Injured, suspended or doubtful players (flagged below 75%) can never start or be bought. The bench is ordered by simulating 4,000 scenarios under FPL's autosub rules, because the bench scored 9, 17, 14, 25 and 16 points in the first five gameweeks.

Features

What it does

  1. 01

    Forecasts committed before each deadline, with overwrites rejected

  2. 02

    Scored only after FPL finalises the gameweek

  3. 03

    Minutes, points and defensive contributions modelled separately

  4. 04

    Transfer planner that never starts or buys injured or doubtful players

  5. 05

    Bench order chosen by simulating FPL's autosub rules

  6. 06

    Public dataset, board and model-run FPL team

Results

What happened

  • Holdout MAE of 0.876 points on 29,417 player-fixtures from 2025-26, against 1.053 for a last-five-games average

  • Beat FPL's own pre-deadline forecast in gameweeks 1 to 3 of 2026-27 (MAE 1.569 against 1.690 in GW1)

  • Lost to FPL's forecast in gameweeks 4 and 5. In GW5 the model's MAE was 1.306 against 1.156 for FPL

  • Published dataset of 139,029 rows and 165 columns, with row counts and hashes in its manifest

  • The model's own FPL team has 318 points after five gameweeks, 102 of them in gameweek 2

State
Live, scored weekly
Holdout MAE
0.876
Last-five baseline
1.053
Rows
139,029

Working on something similar?

Tell us what you are building or fixing.