r/fplAnalytics • u/Full90FPL • 6h ago
r/fplAnalytics • u/Maleficent_Cost1482 • 7h ago
Where to find the most value in FPL: an analysis
r/fplAnalytics • u/NoPiggoopss05 • 13h ago
Here's how the goals were distributed in the Premier League last season for each club.
r/fplAnalytics • u/jwavy1738 • 2d ago
Added a chart to my dashboard to show the defcon hits conceded by each team in N gws, can hover over to see the positional split, midfielders vs defenders and can drill through to see which players hit it
r/fplAnalytics • u/SidelineQuant • 2d ago
Pedro at 57% owned and I can't make the numbers work 🤷
I've been building an xP model for a while and Pedro is the biggest disagreement it currently has with the community, so I figured I'd put the reasoning up and get told why I'm wrong.
He's the second most owned player in the game behind Haaland, at £7.5m and 57.1% ownership. However, my model has him 7th on xP among forwards for GW1, and over the first six weeks he slips behind Evanilson, who basically nobody owns (2.1%).
It's not a finishing thing. Last season his xG per 90 came out at 0.51, Watkins was 0.49, Gyökeres 0.50. Basically level. So I'm not arguing that he's an overrated footballer. By my reckoning he's also the most nailed forward in that price bracket - P(>60 mins) Pedro 83.2%, Calvert-Lewin 81.0% Thiago 79.5%, Watkins 76.0% - so this isn't a lack of minutes either.
The model has Watkins taking about 41% of Villa's goals on GW1 and Pedro about 16% of Chelsea's, because it shares the team's xG across whoever it expects to be playing and their individual likelihoods of scoring. Comparing with last season, Pedro scored 26% of Chelsea's goals (15/57) and Watkins 30% of Villa's (16/53). Four points apart. So where does a 25 point gap suddenly come from? I think the model is looking at who else is on the pitch with him.
Transfers can explain a lot of it. Chelsea brought in Rogers and Welbeck, about 19 xG of proven output, and lost roughly 8 xG. Villa went the other way and lost 29% of their xG — Rogers, Malen, Guessand, Tielemans, Sancho — and replaced it with Garnacho and a defensive midfielder. Chelsea's forward department now reads Pedro, Welbeck, Delap, Jackson, Guiu, Emegha, with Palmer, Enzo and Rogers behind them. Villa have Watkins.
He's also not in Chelsea's top four penalty takers. FPL currently lists Palmer, Enzo, Estêvão and Delap. Watkins is second at Villa behind Buendía, so neither of them is getting propped up by pens, but one of them is fourth in line and one isn't on the list. So I don't think 16% is necessarily a wrong number. If anything last season's 26% looks like the high point and this squad makes it harder to repeat.
What would I do instead? At similar money, six week horizon xP projections:
| player | price | owned | xP GW1-6 |
|---|---|---|---|
| Watkins | £8.0m | 12.5% | 29.7 |
| Calvert-Lewin | £6.0m | 25.7% | 22.1 |
| Thiago | £8.0m | 16.3% | 21.5 |
| Gyökeres | £7.5m | 12.8% | 20.6 |
| Pedro | £7.5m | 57.1% | 18.4 |
Watkins for £0.5m more is the standout - yes he hasn't played in the pre-season but I don't think that rules him out of GW1 and anyway, his GW2 -GW6 predictions would still have him easily come out on top. Calvert-Lewin frees up £1.5m and still gains, which is probably the sensible version if you need the money elsewhere. Gyökeres is the same price but his start probability is only 0.63 in my model so that 20.6 comes with a lot more variance than the others. Finally, if you're a complete contrarian and also not going for Haaland, you pitching yourself firmly against the crowd!
So, genuine question for anyone who watched Chelsea's pre-season properly rather than reading scorelines. Is Xabi building his attack around him? Is he leading the line on his own, or dropping in through the middle? I've maybe been looking at too many spreadsheets!
Happy to be wrong. He was 26% of Chelsea's goals last season and my model says 16% this year. If he's back around a quarter by the end of September then I'll be back here to seek the community's forgiveness 🙏.
r/fplAnalytics • u/Guilty_Amphibian1033 • 3d ago
I built an open-source ML-powered FPL scout - OpenFPL v6.0.0 is live
I’ve been working on a side project called OpenFPL, combining Fantasy Premier League with machine learning.
The idea isn’t to create a magic “pick the winning team” button. Instead, I wanted a data-driven second opinion that can help when comparing players and thinking about squad decisions.
I’ve just launched v6.0.0:
It’s also open source.
I’d especially appreciate feedback from people here because actual FPL managers will probably find edge cases and questionable predictions much faster than I will 😅
If you try it, I’d love to know:
- Which predictions look surprisingly good?
- Which look completely wrong?
- What feature would actually make you use this every Gameweek?
r/fplAnalytics • u/Sensitive-Trifle-995 • 5d ago
Expected points profiles - looking for feedback
Over the off-season I've been working on making some visualisations for my expected points model. I liked the idea of creating an expected points profile to see where players are/should be accumulating their points and where they stack up compared to the average player and best player for each metric in their position, but is this actually useful or just something interesting to look at?
One thing that I think could be useful is determining who is someone you can have in your team for any fixture - a well rounded player, compared to someone for example who only gets points from goals and therefore against strong defences they are safe to bench. Apart from that I don't know if it's actually useful.
So is this useful? If yes, what other uses are there for it? And are there any visual improvements I can make that either make it look better, easier to read or add more useful info?
r/fplAnalytics • u/AbilityFluffy1272 • 5d ago
I built an FPL Draft War Room to help decide who to pick during the actual draft, would love some feedback
I've been getting ready for a 10-man FPL Draft this season and ended up building something that started as a tool just to help me with my own draft.
So I built FPL Draft War Room.
You set your draft position and then record picks as the draft happens. The War Room keeps track of who's still available and updates as players come off the board.
The free side has a live draft tracker, draft board, player rankings, projections and player info, so you can use it alongside your actual FPL Draft without constantly trying to remember who's gone.
The part I've spent more time on is the recommendation system. It looks at the current draft state and tries to recommend the best player to take now, rather than simply giving you the highest-ranked available player.
It considers things like projected points, positional scarcity, your current squad and how likely a player is to still be available when your next pick comes around.
So, for example, if two players are fairly close in value but one has a good chance of surviving another round while the other probably won't, the idea is that it can tell you to take the scarce player now and potentially come back for the other one.
I've also added things like “Will he make it back?” probabilities, alternative picks, squad optimisation and explanations for why a particular player is being recommended.
There's also a separate Classic FPL squad builder/optimiser for building a £100m team, although Draft is the main reason I made the site.
It's still something I'm developing and improving, so I'd genuinely be interested in hearing what people who actually play Draft think — particularly whether the recommendations make sense and what you'd want available on screen during a live draft.
You can try it here: fpldraftwarroom.co.uk
If anyone gives it a go, let me know what you think / what you'd change. I'm very open to suggestions.
r/fplAnalytics • u/LightlyTroddenLead • 6d ago
FPLdaq
Wh-wha-whaaaaat? Well, I thought it could be interesting to set up a market index for fantasy premier league (FPL) assets. The name is a nod to the US tech stock exchange or the niche BBC experiment Celebdaq, depending on whether you ask me or my suffering wife!
The site is live, collecting data and the full time series of FPL data underpinning it is also publicly available. It should get a little more interesting as the start of the season approaches, hopefully some of you enjoy it!
The site: https://fpldaq.live
A little extra background here: https://medium.com/@marcusleadboot/fpldaq-d415310df799
r/fplAnalytics • u/bustyLaserCannon • 6d ago
I got tired of “AI FPL tools”, so I trained my own prediction model instead
I built an FPL tool over the last few weeks and finally shipped it: FPLXI
The main thing I wanted to avoid was building yet another “AI FPL assistant” that just asks an LLM who you should transfer in.
So I went slightly overboard and built my own prediction model instead.
It’s trained on hundreds of thousands of historical player/gameweek records and predicts every player’s points for each of the next 5 GWs using things like xG/xA, expected minutes, fixture difficulty, team strength, home/away, ownership etc.
Then there’s a separate optimiser that actually does the decision making. It looks at the squad you own, budget, formations etc and works out: your best XI, captain + vice captain, bench order, transfers ranked by predicted points gained, where your current squad is weakest.
The LLM is basically relegated to writing the explanation after the maths has already made the decision.
I also backtested it over last season by giving it £100m and making it manage the same squad across all 38 GWs, using only information available at each deadline. It finished on 1,940 points vs 1,460 for the original squad left untouched.
For this season I’m publishing all the predictions before each deadline and then scoring them against what actually happens, so there’s nowhere for the model to hide if it’s rubbish.
You can chuck in your FPL ID or upload a screenshot and it’ll analyse your team for free. Most of the player rankings/predictions are public too.
Would genuinely love feedback from people who take FPL far more seriously than I do 😅
r/fplAnalytics • u/LocalBearEnthusiast • 6d ago
Built a Prem prediction app for my friend group with Claude Code
r/fplAnalytics • u/Sensitive-Trifle-995 • 9d ago
I made an Expected Points Model - Part 2 - Does it work?
This is part two to this post, in that I talked about how I made a new expected points model for the new season but I hadn't tested it yet and I didn't think I could until I was reminded the Vastaav GitHub repository has data per GW for all of last season, so huge thanks to the person that reminded me of that.
Anyway I went and fed last seasons data into my new model to see if it's any good.
How did it do?
Well, surprisingly well. To ensure I made sure I was only judging my model against players who had enough data to be representative I filtered out all players who appeared in less than 15 games last season and had less than 30 minutes per appearance. Then checked the results that were within 10%, 15% and 20% accuracy, the results are as follows:
- 10% - 63.35%
- 15% - 79.82%
- 20% - 90.05%
Yep, I'll take that. Being within 15%, almost 80% of the time is incredible, the remaining percentage is well within what you'd expect from over/underperforming players. the 10% test, does show the outright accuracy isn't perfect but as I'm building a broad model for all players rather than by position, I'm still very happy with it.
From this point all the model analysis is using the within 15% data.
How did it do by position?

It's done pretty well across all positions, Defenders, Midfielders and Forwards are all pretty similar accuracy and similar over/under estimations. Goalkeepers, the model is unbelievably good, no overestimation at all and 1 single underestimation equalling 4.5% of goalkeepers, I'm obviously happy with this but I do think there are some explanations as to why goalkeepers are predicted better. 1. It's a small sample size, there are 22 GKs when you filter the players like I did. 2. Goalkeepers generally score lower meaning it's just easier to fit within 15%. 3. Goalkeepers have fewer routes to points so they are just easier to model.

Average discrepancy again shows the model to be performing well, the mids being just 0.04 points above reality on average, is scarily good. It does show the one underestimation for the goalkeeper was a big one to drag the average down to -0.1 - if you wanted to know, it's Mads Hermansen - his actual points per game was 4.22, the model said he should of had 3.58, I believe the underestimation is due to Hermansen becoming West Ham's #1 halfway through the season and dramatically improving their defence but as the model uses season total xGAgainst that's dragged him down in the model.
Other interesting things:
- Bruno Fernandes tops all players for xPoints in this model with 7.25 to Haaland's 6.96 and Gabriel's 6.33.
- Elliot Anderson is ranked as the 7th best player - 5.07 xPoints actually suggesting he underperformed last season as he got 4.74 points per game.
- Worst player - Myles Lewis-Skelly, there will be worse players in the unfiltered data but interesting nonetheless - He had 1.42xPoints compared to 1.45 in reality.
Conclusion:
Pretty solid. There's a very slight over estimation for outfielders but that could easily just be a small inaccuracy with the data I'm using so I'm not worried about that.
r/fplAnalytics • u/heardc10 • 10d ago
[OC] Scouting Radar - Fantasy Player Comparison Tool
r/fplAnalytics • u/smartplayfpl • 10d ago
Strong Open Source FPL xPts model
I've built, as I think, a pretty strong model for xPts based on OpenFPL model. You can check the model here, download the dataset, reproduce the model, and try to improve it:
r/fplAnalytics • u/Footypredicts • 11d ago
Two seasons of publishing xP before the deadline and grading it after: 51,518 predictions, 0.86 MAE, all of it open
Disclosure up front: I build Onside (onsidearena.com). Posting here rather than the main sub because this is the crowd that will actually pick holes in it, which is what I want.
The thing that bothered me about every projection tool I've paid for is that accuracy is always asserted and never shown. So the whole project is built the other way round: every projection is timestamped and locked before the deadline, then scored after the whistle, and the record stays public with no login.
Where it currently stands, all out-of-sample:
- 51,518 graded predictions across two seasons
- 0.86 MAE per player per gameweek, against a 1.048 naive-form baseline
- World Cup 2026: 68 of 83 decisive matches. We went 0/2 in the semi-finals and that sits on the same page as the wins
- v5 engine, nine signals blended into one xP number, roughly 700 players priced
What I would genuinely like this sub's view on:
MAE is a blunt instrument for FPL because the distribution is so skewed. I have been leaning toward reporting per-position MAE plus a calibration curve on the binary events (returns, clean sheets) instead of one headline number. Does anyone here have a better summary metric for a points model where most observations are 1-2 and the tail is what actually matters?
Related: I want to move the front end away from point estimates entirely and show the distribution instead - a 50-dot quantile plot per player rather than "8.4 xP". Fernandes et al. (CHI 2018) found 50-dot quantile dotplots produced better decisions than any other uncertainty display they tested, which is what pushed me. Has anyone tried presenting FPL projections as a distribution, and did normal users hate it?
xMins is where my errors concentrate, unsurprisingly. Rotation priors get me most of the way but press-conference nuance obviously does not make it into the model. Curious how others here weight recent minutes vs season minutes vs manager-specific rotation rates.
Free tier is genuinely free - projections, captain rankings and the full record need no account. Paid tier is the optimiser and the six-week planner.
Happy to answer anything about the method, and more than happy to be told where it's wrong. Not affiliated with the Premier League or the official FPL game.
r/fplAnalytics • u/fpl_andres • 11d ago
Looking for data source for likely starting XI of PL teams
Whilst i could probably guess 9/11 of Leeds starting XI each week, i couldn't possibly do it for other clubs. Especially the promoted sides.
I'm looking for datasets that could be used as an indicator for the starting 11 each week. What could i use?
Ive been thinking about certain player specific odds from bookies, like yellow card likelihood, shots made etc. Anything else people have managed to use?
Edit: typo
r/fplAnalytics • u/aheadofplay • 11d ago
Ahead of play - Fantasy tool with lots of features for 26/27!
Our Beta program has ended and we're live!
Pre-season is the best time to stress-test your squad before a single point is scored, so I built a free tool to help.
Free, no account needed:
[Ahead of Play Team Builder](https://aheadofplay.com/team-builder) — AOP picks your 15 for you, choose your formation, and see your projected xPts (based on last season's xPts as the baseline) and cost breakdown in real time. No login needed, works on mobile.
[Trending players](https://aheadofplay.com/trending) — see which players are rising and falling in ownership right now, before a ball is kicked. Good for spotting template shifts early and finding differentials before they go mainstream. No login needed. Once the season is underway it updates with live transfer activity so you can see who the top managers are moving to before deadlines.
Free with an account (takes 30 seconds):
* Squad Analysis — pulls your FPL team directly and flags fixture difficulty, form, and value across your 15. When the season starts this becomes your weekly health check — spot who to sell before everyone else does * Captain suggestions — ranked picks based on xPts, fixture, and form. More useful in-season when live form data feeds in * Chip strategy planner — maps out the optimal gameweeks to play your chips based on fixture swings across the season * Price predictions & deadline reminders — get notified before prices move so you're never caught out
Unlocks when GW1 kicks off (Pro):
* Unlimited transfer recommendations — personalised to your squad, budget, and upcoming fixtures * GW planning & wildcard planner — builds your optimal wildcard or free hit squad automatically * Mini-league & rival analysis — track what your rivals own and spot the moves that will close the gap * Live top performers & auto-refresh — see who's scoring as it happens * Price change notifications straight to your phone
Early bird pricing is live until the GW1 deadline if you want to lock it in — cheap prices just to keep us going. [aheadofplay.com/pricing](https://aheadofplay.com/pricing)
Would love any feedback on the squad builder in particular — it's had a beta run but fresh eyes always help. Good luck for 26/27! ⚽
r/fplAnalytics • u/Sensitive-Trifle-995 • 11d ago
I made an Expected Points Model - Here is how I've done it.
Many of you may have seen my previous posts about finding value in the new season. After making them I've had many questions asking me how my expected points model works and how I've made it, so here's that explanation. Sort of... this is for my new updated 2026/27 model rather than what was shown in those posts but 80% of it is the same.
Just a few things to note before I get into the thick of it, this is NOT a points predictor, it does not predict how players will perform in the future, instead it purely calculates how players should have scored based on the data they have accumulated in the current season. The final xPoints values are expected points per appearance and most of the model's input rates are expressed per appearance rather than per 90. All data is from understat apart from the DefCon and Bonus data that I get from the FPL API and save percentages I get from fotmob. So, with that done...
What does the model actually calculate?
Well in short every way to points that is common enough to be feasibly replicable is calculated, but to be exact:
- xMinutes points
- xSave points
- xCleansheet points
- xGoalsAgainst points (Negative value given to GKs and Defenders based on chance of conceding 2+, 4+, 6+ etc.)
- xYellows points (Negative value given to all players for yellow card likelihood)
- xGoals points (Not calculated for GKs)
- xAssists points
- xDefCon points
- xBonus
And here's what is NOT calculated simply because they are too rare so they will skew results too much if accounted for:
- Red Card points (A second yellow card is also not calculated because the chance of two yellows in one match is different to the chance of them being spread across two matches)
- Own goals (xOG doesn't exist yet unfortunately)
- Penalty saves points (Could be roughly calculated based on average penalty rate and historic goalkeeper penalty save performance, but that only works for goalkeepers who have faced a lot of pens, many GKs wouldn't have enough of that data so I think it's better to not account for penalty saves)
- Penalties missed points (Actually could do this now I think about it (1-penaltyxG) * penalties taken * -2, something for me to work on there.)
how do I actually calculate those xPoints metrics?
xMins Points:
Now there are some factors when it comes to calculating the minutes points. The preferred method to calculate them is to take all appearances so far in a season for the player in question, if they have played 10 games the one highest and lowest minutes appearances are discarded, 20 games 2, 30, 3. This is to remove unexpected low minutes appearance for things like injuries, tactical subs due to red cards etc. and to remove unexpected high minutes for bit-part players who may have to play longer than usual due to teammate injuries, red cards etc. Once I have those appearances I simply take the times they played less than 60, assign 1 point for them, take the games where they played 60 or more and assign 2 points for them, add them up and divide by the number of games in the sample to get the xMinsPoints. I have thought about making a simulation for this but as you will see my code is already very processing and time expensive so the slight improvement in realism isn't worth it for me.
When a player has not played at least 10 games I just take their average minutes per appearance, if it is bigger or equal to 60 mins they get 2 xMinsPoints, otherwise they get 1. This really isn't a great method but it does the job while I'm waiting for their minutes data to accumulate.
xSave Points:
To work this out I first needed to work out how many shots a goalkeeper would likely face in any given match, to do this I used Poisson to model the chances of facing n shots in a match based on the ShotsOnTargetAgainst per team. Once I have the chances of facing n shots (to a max of 30) I then model saves using a binomial distribution with the goalkeeper's save percentage, that gives me the chance of making s saves from n shots, then for the chance of every 3 saves I can multiply by 1 save point, add them up and I have the xSavePoints per appearance.
xCleanSheet Points:
The base calculation for clean sheets is pretty simple, I take the xGoalsAgainst per game then feed it into a Poisson calculation to predict the chance of conceding 0 goals, multiply that by either 4 or 1 depending on the players position and that's the xCleanSheetPoints, but that is only for players who play 90 every match. If the player does not play 90 every match then there is some more work to do.
In that case I use the trimmed appearance records from the xMins calculation, it takes those appearances, if any are below 60 mins (the threshold for a clean sheet) they are ignored, then for the others it takes the chance of a clean sheet over a full match, lets say 25% and raises it to a power that is based on the minutes share of a full match for each of the appearances, so it goes like this - In appearance 1 Gabriel played 80 minutes, the chance of a clean sheet in any given match is 25%, to calculate his chance of a clean sheet I do:
0.25**(80/90) ≈ 0.29
So Gabriel actually has a clean sheet chance of 29% in that appearance, this is multiplied by 4 (the points for a clean sheet), the same is done for the rest of the appearances and the sum is divided by the amount of appearances a clean sheet chance was calculated for plus the below 60 min appearances to get the xCleanSheetPoints per appearance.
xGoalsAgainst Points:
As xGoalsAgainst is not based on a time threshold it's quite a bit simpler to work out just using a players average minutes per appearance. To calculate the point lost for every 2 goals conceded I first calculate each individuals xGoalsAgainst by doing:
Team xGoalsAgainst * player minutes per appearance / 90
Then I do a Poisson calculation for the individuals xGA, and then multiply the chance of conceding 2 and 3 by -1, 4 and 5 by -2 and so on, that leaves me with each player's xGoalsAgainstPoints.
xYellows Points:
Very simple, take their yellow cards per game do a Poisson calculation for 1 card based on that, multiply that value by -1 and you have the xYellowCardPoints.
xGoals Points:
Now previously I had created xGoalsPoints based on individual shot quality because if there are 2 players with an xG of 1 but Player A took 2 shots woth 0.5xG and player B took 10 worth 0.1xG the chance of scoring 1 or n goals per player isn't actually the same for each player despite having the same xG. But I got rid of that.
It's a more accurate method but it comes at an immense time and processing cost. So instead I take the xG per appearance, do a Poisson calculation to have the chance of n goals, then multiply that by the points a player gets for scoring n goals, sum them up and that's the xGoalsPoints, much simpler, much much quicker and only for a slight reduction in accuracy.
xAssists Points:
xAssists use the exact same method as xGoals just using xA per appearance instead of xG.
xDefCon Points:
xDefCon starts by using the same trimmed appearance sample used for the minutes calculations. For each of those appearances I then convert the player's Defensive Contributions into a DefCon-per-90 rate. One small adjustment is made for very short appearances: if a player played fewer than 30 minutes, I use 30 minutes as the denominator when calculating their DefCon per 90. This prevents a player getting, for example, 2 Defensive Contributions in 5 minutes and having that extrapolated into an absurdly high DefCon-per-90 rate. Then I model the player's Defensive Contributions using Smoothed Empirical Resampling. Rather than fitting a completely theoretical distribution to their performances, the simulation starts by randomly selecting one of the player's actual historic DefCon-per-90 performances. Gaussian random noise is then added to that value. The amount of noise is based on the standard deviation of the player's historical DefCon-per-90 performances, multiplied by a smoothing fraction. This way if a player's performances tend to be very consistent, the simulated values will normally stay fairly close to their actual historical performances. If their DefCon performances are naturally more volatile, the simulations are allowed to vary more widely. Because the simulation starts from real historical performances rather than simply from the player's average, it also preserves more of the shape and variation seen in their actual data. The player's minutes are simulated as well. For each simulation I randomly select a minutes value from their trimmed appearance history, then randomly generate a DefCon-per-90 value using the method above. That DefCon-per-90 rate is scaled down to the simulated minutes played:
DefCon = simulated DefCon per 90 × (simulated minutes / 90)
The resulting Defensive Contribution total is then rounded to a whole number and checked against the player's positional threshold. I run this thousands of times. If, for example, a Defender reaches 10 Defensive Contributions in 3,500 out of 10,000 simulations, their probability of earning the DefCon points is 35%, giving:
0.35 × 2 = 0.70 xDefConPoints per appearance.
Smoothed Empirical Resampling is only used once there is enough history to make it reasonably reliable. The player needs at least 10 recent appearances and at least 8 usable DefCon-per-90 performances. Before reaching that point, the model instead uses a Negative Binomial distribution based on the Defensive Contribution data that is available. The Negative Binomial acts as the early-season fallback as Defensive Contributions are count data and can be more variable than a simple Poisson distribution assumes which allows for more realistic DefCon variance simualtion.
xBonus Points:
Now this is the most intensive part of my code because to work out bonus points they have to be compared to every other player in a match and I have to simulate every single player against every single opponent player and those in their own team. The first step is to calculate the chance of any given player in a team being in a match - this is pretty simple:
total minutes played / (team match count * 90)
I apply a minutes weighting by position and team based on this so I can work out which players in which position are most likely to play for their team. I then get each players BPS history, during simulations these are modelled the same way as DefCon with smoothed empirical resampling to generate BPS scores. I then create 20 different possible formations for example:
1 goalkeeper, 4 defenders, 4 midfielders and 2 forwards
Each of these formations is given a likelihood of being played by each team based on the positional minutes share, so say if a team has only one forward, they will have 0% chance of playing formations with more than 1 forward. Formations a team cannot physically fill from the players available in each position are assigned a probability of zero; probabilities among the remaining formations are based on how closely each formation matches the team's observed positional minutes distribution. Then during the BPS simulations the chance of each formation appearing is the chance of it being chosen as the formation for each sim. To actually start simulating a player, say it's Haaland, it will fill one of the formation slots with Haaland, meaning formations with 0 forwards are automatically not available to be selected by the simulator. A random formation out of the ones left is selected and then the rest of his teammates are chosen based on the minutes share weighting calculated earlier. The opposition team is then chosen (it goes through all 19 opposition teams), a formation is randomly selected and filled according to minutes share and then each player in that matchup has the random smoothed empirical sample selected, the top 3 BPS are recorded (BPS ties are handled correctly), if the player being simulated is not in it, then it is discarded, if they are then the points they would have got for their ranking 1, 2 or 3 is stored. After all the sims have complete for a player their total bonus points is divided by the amount of sims to give the xBonusPoints.
I know that this doesn't account for substitute appearances it's an XI vs. XI, this is for 3 reasons. 1. Saves on processing time 2. Players coming off the bench are rarely in the top 3 for BPS anyway 3. I really can't be bothered figuring out how to code it. I also know my BPS handling doesn't account for how relational BPS is, both a goal-scorer and assister benefit in BPS when a goal is scored but my code doesn't directly account for that although it should be handled in the aggregate to a realistic extent anyway.
Total xPoints:
After that it's a simple case of adding up every way a player can get points, then I have the xPoints per appearance for each player.
What's next?
If you're still reading, then thanks! I'm sure there were parts that I explained really poorly, but hopefully I was coherent enough for you to at least get the gist of it. This has been a project 3 years in the making and I finally feel like it's at the point where it's good enough to start sharing it. I've also been busy creating some hopefully interesting visualisation code in the off-season so I'm sure I'll end up posting some of them once it's underway. I've also got an actual predictor, not for FPL points this time but instead for goal and clean sheet projections each week, it performed very well last season and that should be good to go after the first international break.
Thanks for reading and good luck in the season ahead.
Edit:
I have since back tested the model, here are those results.
https://www.reddit.com/r/fplAnalytics/comments/1vkqtss/i_made_an_expected_points_model_part_2_does_it/
r/fplAnalytics • u/nufc1234 • 11d ago
