⚑ Updates Daily: 02:30 & 08:30 UTC
Last Update: 2026-08-02 09:24 UTC
Target: GW1
NEW
2026-27 Season Ready! Predictions for GW1 are live. In GW1–3, positional price priors guide predictions, automatically transitioning to 3-match and 5-match rolling ML ensembles as official match data unfolds.
πŸš€ Open Pre-Season Squad Builder

The Engineering Behind FPL Prophet

A technical breakdown of our data pipeline, modeling choices, and why we chose Gradient Boosting over Neural Networks.

1. The Signal-to-Noise Problem

Fantasy Premier League (FPL) is notoriously noisy. A defender can concede a goal in the 95th minute and lose their clean sheet (-4 points relative to expectation) due to a random deflection. Capturing the "true talent" signal amidst this variance is the core challenge.

Early iterations of this project attempted to predict exact raw points for a single gameweek. This failed miserably due to variance. We pivoted to predicting Expected Points (xP)β€”a robust long-term metric that minimizes error over time, rather than trying to guess a specific hat-trick.

2. Data Pipeline & Processing

Data quality is paramount. Our pipeline runs every 6 hours and processes data from three primary layers:

  • Official Source: Base stats, prices, and ownership data directly from the Premier League servers.
  • Advanced Metrics (xG/xA): We utilize native "Expected Data" (xG, xA, xGI). Predicting chance quality rather than just outcomes filters out "lucky" goals.
  • Granular Strength Ratings: Instead of the generic "1-5" Difficulty Rating, we recalculate opponent strength daily (e.g., "1100" vs "1050") to differentiate between a "Hard" game vs Man City and a "Hard" game vs a depleted rival.

3. Feature Engineering: The "Efficiency" Metric

One of our key differentiators is how we handle user consistency. We engineered a proprietary feature called Efficiency Score, defined as:

Efficiency = Mean_Points / Coefficient_of_Variation

This metric heavily penalizes Volatility. A player who scores 12, 2, 12, 2 (High Variance) will have a lower Efficiency score than a player scoring 7, 6, 7, 8 (Low Variance). This aligns with long-term probability theory: "Haulers" are often statistically lucky, while "Grinders" are statistically sustainable.

The "Clinicality" Myth: Notably, our model explicitly excludes raw `goals_scored` from its training features. We rely entirely on xG. If a player scores 5 goals from 0.5 xG, the model treats this as a negative signal (unsustainable overperformance) rather than a positive skill.

4. Architecture & Interactions

We use a Gradient Boosting Regressor (GBR) ensemble, chosen for its ability to handle non-linear interactions between features, such as the Teammate Cannibalization effect (when a premium asset like Salah returns, teammates' projections drop due to xG redistribution).

We use a novel Hybrid Ensemble approach:

  • Model A (Cumulative): Trained on all historical data. Captures long-term player quality and "baseline" performance.
  • Model B (Rolling): Trained only on the last 5 Gameweeks. Captures immediate "hot form" and tactical shifts (e.g., a player moving Out of Position).

The final prediction is a weighted average of these two models, giving you the stability of history with the responsiveness of form.

Specialized Goalkeeper Model: Goalkeepers are fundamentally different from outfield players. They rely on clean sheets and saves, which are rarer events. For GKPs, we use a separate model architecture with a Log-Transformed Target to handle the high variance and skew in their points distribution.

5. The Optimization Engine

Predicting points is only half the battle. The other half is the Knapsack Problem: fitting the best players into a budget constraint.

Our "Transfer Strategizer" is a Mixed-Integer Linear Programming (MILP) solver. It constructs a decision tree of every possible transfer combination for the next N weeks.

Maximize: Sum(Predicted_Points) - (Transfer_Hits * 4)
Subject to:
1. Total Cost <= Budget
2. Players per Team <= 3
3. Position Constraints (1 GK, 3-5 DEF, etc.)

This allows us to suggest "optimal" pathways that a human might missβ€”such as selling a premium asset this week to fund two mid-priced upgrades next week.

6. Season Start & Early Gameweek Strategy

At the start of a new season (e.g. 2026-27), in-season rolling statistics are completely absent for Gameweeks 1 through 3. Our primary prediction model requires a minimum of 3 Gameweeks (~21 days) for basic last_3_* rolling metrics and 5 Gameweeks (~35 days) for full rolling volatility & ensemble stability.

To account for different rolling data requirements across early gameweeks without altering saved model schemas or disrupting regular prediction pipelines, our architecture operates across three distinct model evolutionary phases:

Early-Season Model Evolution Architecture

FPL API / Bootstrap Static Data
↓
Finished Match Count Check (<3 GWs | 3-4 GWs | ≥5 GWs)
Phase 1: GW1 - GW3
(0-2 Matches Completed)
  • Priors: Price & 2025-26 baseline
  • Blending: $w_k = k/3$ ($0.0 \rightarrow 0.67$)
  • Imputation: Positional Group Means
Phase 2: GW4 - GW5
(3-4 Matches Completed)
  • 3-Match Metrics: 100% In-Season
  • 5-Match Metrics: Hybrid padded
  • Model A: Cumulative Primary
Phase 3: GW6+
(5+ Matches Completed)
  • All Metrics: 100% In-Season
  • Volatility: Full Efficiency/Std
  • Ensemble: Retrained Model B
↓
Unified Input Vector & Knapsack Optimization Solver

Detailed Model Phase Mechanics:

  • Phase 1 (GW1 – GW3 Prior Mode): In-season match history is insufficient ($k < 3$). The engine blends prior-season metrics and price priors ($\text{Baseline Points} = \alpha + \beta \times \text{now\_cost}$) into feature vectors. Promoted teams receive default strength ratings (Attack ~1020, Defence ~1070).
  • Phase 2 (GW4 – GW5 3-Match In-Season Active): At GW4 (3 completed matches), 3-match rolling features (last_3_*) become 100% pure in-season data ($w_{\ge 3} = 1.0$). 5-match rolling features (last_5_*) transition dynamically with 3-4 current-season matches plus 1-2 padded prior baseline matches.
  • Phase 3 (GW6+ Full In-Season Ensemble): At GW6 (5 completed matches), both 3-match and 5-match rolling features are 100% in-season. All rolling volatility stats (last_5_std, last_5_cv, last_5_efficiency) reflect purely 2026-27 form, and Model B (Rolling Model) is retrained exclusively on 2026-27 match data.

7. Squad Hierarchy & Expected Minutes Engine

A key challenge in fantasy models is handling squad rotation and bench reserves. Our engine incorporates a dynamic Squad Hierarchy Model:

  • Positional Depth Ratio: Players are ranked within their club and position using price tiering, historical baseline xP, and squad status. Expected minutes (expected_mins) scale proportionally from key starters (~75–90 mins) down to fringe reserves (~0–25 mins).
  • Availability Flag Scaling: Official Premier League injury and fitness flags (chance_of_playing_next_round) serve as direct multiplicative multipliers ($0.0 \rightarrow 1.0$) on expected minutes, ensuring doubtful or sidelined assets are accurately discounted.

"All models are wrong, but some are useful." β€” George Box

View Model Accuracy πŸ“Š