Live · Fully Automated

🧠 How It Works

The actual scoring model, weights, and rules behind every decision — kept in sync as the tool evolves.

📊 Scoring every player

Every player gets a single number each week: a blend of five signals, weighted by how much each one actually predicts real points (tested against two seasons of historical gameweek data, not guessed). Goalkeepers use a slightly different mix, noted below.

Baseline projection — 35% (40% for GKP)

FPL's own official next-gameweek projection, floored by recent points-per-game so a single lucky/unlucky projection can't dominate. Points-per-game itself is ignored below 900 minutes played — too small a sample to trust.

Recent form — 20%

FPL's own rolling recent-form stat — how hot or cold a player has been lately, independent of their season-long average. Ramped down early in a season (or after injury) when it's only 1-2 games of history, not yet a real average — otherwise a single freak game reads as sustained form.

Fixture ease — 30%

How favourable the upcoming run of fixtures is, decayed so nearer matches matter more. Position-aware: defenders/keepers care about the opponent's attacking threat (clean-sheet odds); attackers care about the opponent's defensive solidity (scoring odds) — two different things a single 1–5 difficulty rating conflates.

Underlying stats delta — 10%

Over/under-performance vs expected goal involvement (xG + xA). A player consistently outperforming their underlying chances is more likely to regress; one underperforming is more likely to catch up.

ICT index — 5% (0% for GKP)

FPL's Influence/Creativity/Threat stat. Zeroed for goalkeepers — it's driven by save volume, which tracks facing more shots (often on a worse team), not the clean sheets that actually earn a keeper points.

Team defense signal — −20% (GKP/DEF only)

Each team's underlying expected goals conceded per 90, while this player was on the pitch. A stronger defense genuinely means more clean sheets, beyond what season stats alone capture. Zero weight for MID/FWD, where clean sheets barely matter for points.

Set-piece duty — flat bonus

+0.75 for the confirmed primary penalty taker (+0.25 for backup), +0.15 for primary direct free-kicks, +0.10 for primary corners. A different evidence tier from the rest — not backtested, since its real value is catching a player who just inherited duty, which a season-long backtest can't see (an established taker's value already shows up in their normal scoring stats).

Also applied to every score: a reliability multiplier — 0 if injured or suspended, scaled to the club's own "chance of playing" percentage if flagged, 0.3 if the player hasn't played a minute all season, and scaled down toward 0.5 for a proven starter whose starts-per-90 has quietly dropped well below 1.0 (rotation risk no injury flag would ever catch).

⚖️ Picking the squad

Not a greedy "best single upgrade" search — a proper integer program (PuLP/CBC solver) that considers the whole 15-player squad and starting XI jointly, so it can see combinations a step-by-step search would miss (sell a little here, upgrade a lot there, all in one move).

What it's actually maximizing:

Starting XI value — full weight

Valued by a horizon score: each of the next 5 gameweeks scored individually using that week's specific fixture, discounted 15% per week further out (HORIZON_DECAY = 0.85) to reflect growing uncertainty. A rough week ahead of a strong run isn't undervalued, and vice versa.

Bench value — 15% weight

BENCH_WEIGHT = 0.15. A bench player only scores when actually subbed in, which is rare — especially a backup keeper. Without this discount, the optimizer once priced a strong second-choice keeper as if he were a nailed-on starter (see change feed below).

This-week tactical nudge — 50% weight

TACTICAL_WEIGHT = 0.5. Controls how much "hot right now" matters relative to "good over the next few weeks" when deciding who starts vs sits.

Cost of a paid transfer

HIT_COST = 4 — FPL's actual point deduction. A hit is only taken when the projected gain clearly clears that bar, not a hand-picked "feels worth it" threshold. How many hits it's allowed to take in one week is effectively uncapped (MAX_EXTRA_HITS = 14, the true ceiling being squad size) — it doesn't take reckless hits just because it can, since each one still has to individually clear its own cost, but it's no longer artificially blocked from proposing a bigger rebuild when the numbers genuinely support one.

Minimum value threshold for any transfer

TRANSFER_FRICTION_COST = 1.0. A free transfer still isn't a costless one in real life (churn, price-change risk, giving up a transfer you could've saved) — without a floor here, the optimizer would take literally any transfer with positive expected value, however tiny. Every transfer, free or paid, has to clear this bar to be worth making at all.

Hard constraints (not tunable — just FPL's actual rules): budget, 2/5/5/3 squad composition, max 3 players per real club, legal formation (1 GKP, 3–5 DEF, 2–5 MID, 1–3 FWD in the starting XI).

🏆 Picking the captain

Deliberately not the same scoring as squad selection. Squad choices are a multi-week commitment (transfers cost money or a hit), so they use the horizon score above. Captaincy can be changed for free every single week, so it's scored purely on that week's projection only — same five weights, but with zero look-ahead beyond the immediate match. Highest scorer is captain, second-highest is vice.

🧪 Kept honest by data

Every weight above was arrived at by backtesting against two real seasons of gameweek-by-gameweek FPL data (2024–25 and 2025–26), not intuition. Two different tests are used, because they answer different questions:

Prediction accuracy — does a signal correlate with a player's actual points? The current formula scores r = 0.571 correlation with real outcomes. When a signal's own isolated correlation looked backwards (the underlying-stats delta correlates at −0.14 alone) it got tested in the full combined formula rather than flipped on a hunch — flipping it actually scored worse (r = 0.563) than leaving it alone.

Decision quality — for a ranking problem like captaincy, correlating well in general isn't the same as picking the single best candidate from a pool. A dedicated simulation replays every historical gameweek and compares what each rule would actually have earned as captain: the current formula outscored the alternative by roughly 0.46 points per gameweek, averaged over 56 simulated gameweeks.

📋 Change feed

Loading history…