← Back

How It Works

SmartPlay does two things: it predicts how many FPL points each player will score (xPts), then it optimises your squad — finding the best transfers, captain, and line-up given your budget and the rules. Here's how both pieces work, how we know they're accurate, and where they fit in the broader FPL prediction landscape.

Backed by published research

SmartPlay's feature engineering is built on OpenFPL, an open-source FPL prediction framework created by Daniel Groos at Groos Analytics. His published research is one of the most rigorous open evaluations of FPL prediction models to date.

OpenFPL provides the core rolling features from publicly available FPL and Understat data. Dastan extends that pipeline to 286 deadline-safe inputs, including defensive workload, fixture congestion, opponent defensive contributions allowed, FPL's pre-deadline projection, and official availability. Its position-specific multibucket base is blended with a direct points model using a separately fitted weight for each position.

Dastan is transparent by design. We publish the code, trained weights, six-season training data, feature contract, evaluation harness and negative results in the open Dastan repository. The checked-in evidence includes row counts, hashes and the exact commands needed to reproduce the published scores.

The pipeline

01
Step 1
Data

Builds 286 deadline-safe features per player from FPL and Understat data

02
Step 2
Minutes

Estimates how likely each player is to start and play significant minutes

03
Step 3
Base model

Runs position-specific models for appearance and points outcomes

04
Step 4
Blended model

Blends the base with a direct points model for outfield players

05
Step 5
Solver

Finds the best transfers, captain, and line-up for your squad and budget

Steps 1–4 produce xPts — a predicted score for every player every gameweek. Step 5, the solver, takes those predictions and works out what you should actually do with your squad.

From predictions to decisions

xPts tell you how many points each player is likely to score, but they don't tell you what to do. That's the solver's job. It takes your current squad, your budget, your free transfers, and xPts for every player across multiple upcoming gameweeks, then finds the mathematically optimal plan.

Under the hood, it's a mathematical optimiser powered by HiGHS, a high-performance open-source solver. It respects every FPL rule — max 3 per team, valid formations, budget constraints, transfer costs — and looks ahead several gameweeks to avoid short-sighted moves.

Captain selection is baked into the optimisation itself, not bolted on as an afterthought. The solver uses conditional xPts — expected points given the player starts and plays significant minutes — so it naturally favours nailed-on starters for the armband. Bench order is also adaptive: when your starters are rotation risks, the solver values a strong bench more highly.

Inputs
  • Your squad, bank & free transfers
  • xPts for all players (multi-GW)
  • All FPL rules & constraints
Outputs
  • Best transfers to make
  • Captain & vice-captain pick
  • Starting line-up & bench order

The solver looks several gameweeks ahead, weighting this week more heavily so it doesn't sacrifice short-term points for a speculative payoff in GW35. It handles all four chips (Wildcard, Free Hit, Bench Boost, Triple Captain), and automatically compares scenarios — rolling a transfer vs. taking a hit, playing a chip now vs. saving it — so you can see the trade-offs before committing. Results come back in seconds.

How we test

Dastan was tested in three non-overlapping clean walk-forward blocks covering 24 gameweeks of 2024-25. For each block, it trains only on rows available before the test window, then predicts those later matches. Every result is averaged over three random seeds. Later-season data is removed entirely when these blocks are scored, so no test result can reach its own features or training labels.

Earlier data only
8-GW unseen block × 3 seeds × 3

Data quality

Predictions are only as useful as the data behind them. Every pipeline run passes through four validation layers and 50+ automated checks before anything reaches you. If something goes wrong, the system rolls back to the last known good state automatically — you never see broken data.

QA
Validate

Every incoming API response and every computed prediction is checked for completeness, valid ranges, and internal consistency before it can be published.

OK
Guard

Hard constraints block bad data at publish time — missing values, out-of-range numbers, and duplicate records are caught and rejected automatically.

RB
Rollback

After publishing, the system re-checks the live data. If anything looks wrong, it automatically restores the previous good version and alerts the team.

Every check is logged, every result is traceable, and the team is alerted within seconds of any anomaly. We track performance at every step so we can spot issues before they become a problem.

Walk-forward accuracy

How the production model scored across the clean eight-gameweek blocks. Use the switch to choose who gets counted: the whole player pool, or only the players who actually started. The second is the harder read and the one closer to picking a captain — on the full pool, most players in any gameweek never come on and score nothing, which makes the average error look smaller than the model's real work.

Ranking accuracy (Spearman)

Did the model correctly predict who would outscore whom? 1.0 means perfect ranking, 0.0 is random. It doesn't care about exact scores — just the order. Higher is better.

Prediction error (MAE)

How far off were the predictions, on average? Measured in FPL points. Dastan averages about 0.92 across the clean walk-forward windows. Lower is better.

Top-pick ranking (NDCG@10)

Did the players with the strongest actual returns appear near the top of the model's list? Higher is better.

The same model, on players who actually played

Roughly three in five rows in the pool above are players who never came on. Predicting zero for them is easy and correct, and it pulls the average error down. Scored only on players who reached 60 minutes, the numbers look very different — and this is the harder cut, the one that describes choosing a captain.

Scored onSpearmanMAERows
Every player24 walk-forward gameweeks0.7460.91817,622
Starters only (60+ mins)same 24 walk-forward gameweeks0.2882.1714,849

These are two cuts of the same Dastan predictions and the same clean test blocks. The starters row removes player-gameweeks below 60 minutes; it does not substitute an older live model or a different season.

Accuracy benchmarks: 2024-25 and 2025-26

A model score only becomes useful when it is compared with alternatives. We test Dastan against FPL's official projection, OpenFPL, recent points, and player price. Every comparison below uses the same player-gameweek rows on both sides; when a baseline is missing, Dastan is removed from that row too.

The number shown is the decision score: 0.5 × Spearman + 0.5 × NDCG@10. Higher is better. It measures ranking quality and is not a percentage.

Against FPL's official projection

Clean 2024-25 walk-forward blocks · 17,307 identical player-gameweeks · 98.2% coverage

exact-row comparison
CohortDastanFPL ep_nextDelta
Every player0.60970.5321+0.0776
60+ minutes0.39630.3139+0.0824

On those same rows, all-player MAE is 0.930 for Dastan and 1.070 for FPL. Missing official forecasts are excluded from both sides, never filled with zero.

Controlled head-to-head with OpenFPL

2025-26 GW1-24 · 18,173 identical player-gameweeks · Dastan mean of seeds 42, 7, 2026

OpenFPL source
CohortDastanOpenFPLDelta
Every player0.56410.5044+0.0597
60+ minutes0.26260.2564+0.0062

Paired 95% gameweek interval: +0.0412 to +0.0798 for every player, and -0.0093 to +0.0224 for 60+ minutes. The full-pool advantage is clear; the starter-only comparison is a tie on this sample.

Simple baselines

Clean walk-forward decision score. Each row rescored Dastan on that baseline's eligible rows.

ReferenceRowsDastanReference
Previous-five mean17,5470.60930.5317
Last-match points17,5470.60930.4978
Player pricerank-only17,6220.60900.3571

Price is deliberately rank-only: cost and points use different units, so a price MAE would be meaningless.

Where the OpenFPL difference comes from

RMSE by realised return, following OpenFPL's published categories. Lower is better.

ReturnRowsDastanOpenFPL
0 minutes10,9020.5830.964
Played, ≤2 pts4,5621.3811.518
3–4 pts1,1121.4421.304
≥5 pts1,5975.7565.675

Dastan wins on non-players and low returns. OpenFPL is slightly better on 3–4 point returns and hauls. That is why we publish the split, not only the overall score.

Evidence and full caveats: public Dastan accuracy report. FPL Review is not shown because synchronised proprietary predictions are not available for these rows; copying its score from a different sample would not be a controlled comparison.

Where FPL Review's Massive Data model fits

FPL Review's Massive Data model is a closed, premium projection system. We cannot reproduce its internals, and we do not have its synchronised forecasts for Dastan's test rows. The evidence instead forms two carefully labelled comparisons:

Published 2024-25 test

OpenFPL ≈ Massive Data

OpenFPL reported comparable prospective accuracy to FPL Review.

Controlled 2025-26 test

Dastan > OpenFPL, full pool

Dastan improved ranking and error on 18,173 identical rows.

Supported conclusion

A credible open competitor

Not proof that Dastan directly beats Massive Data.

Read the OpenFPL paper and inspect or reproduce the Dastan release on GitHub. A direct winner would require both models' pre-deadline forecasts on the same players and gameweeks; we will not disguise a cross-season chain as that test.

What the model can't do

Football is inherently unpredictable. No model can foresee red cards, injuries during a match, penalty decisions, or a 30-yard screamer. In the published walk-forward suite, average absolute error is 0.918 points per player-gameweek, while the 60-minute cohort is 2.171. Football outcomes remain noisy. These numbers support comparisons across the player pool, not exact-score promises.

The model is strongest at ranking — identifying which players are likely to outscore others — rather than predicting exact point totals. That's why ranking accuracy is the metric we care about most. The research score balances full-pool Spearman with NDCG@10 so improvements at the top of the ranking are not hidden by a season-wide average.

The clean walk-forward evaluation covers 24 gameweeks of 2024-25. A separate controlled OpenFPL test covers 24 gameweeks of 2025-26, but it uses a different training regime, so its numbers are shown separately. Newly promoted clubs, transfers without Premier League history, and early-season minutes uncertainty remain the main live risks.

We update this page as the model evolves. The full codebase is on GitHub. If you have questions, reach out at [email protected].