Building WAR for Football #4: Projections and Predictions
In Part I, I said there would be an article on per-season WAR and projections. While working on it, I realised the projection part needed an article of its own, so here it is. I still haven’t decided whether WAR is the right thing for football or whether we should go with PAR. But everything I’ve done so far was built on seasons that are already finished. In this part I want to look at seasons that are still going on: projections and predictions.
To be clear, this isn’t really WAR anymore. WAR is about what has happened, and a projection is about what will happen. It’s still relevant though, because I’m using the projection to predict what a player’s WAR will be at the end of the season. So the aim is simple: take the unfinished 2026 and 2026/27 seasons and predict the end-of-season WAR for every player.
This also happens in baseball as a separate system to WAR. Think of Marcel, ZiPS, Steamer. They live next to WAR rather than inside it. That’s what I’m doing here as well: a projection of what end-of-season WAR will be for seasons that haven’t finished yet.
If you need a refresher, these were the previous posts on building WAR for football:
So we’re looking at seasons that haven’t finished yet. One thing to keep in mind is that there are two types of leagues in the data: summer leagues that run within the calendar year (2026) and winter leagues that run from August to May (2026/27). They’re at very different stages of their season. The network has also grown since Part III, from 12 to 36 leagues. I added the second tiers and the third tiers in Germany, Spain and Italy. The version of the model I’m using here is WAR 2.3.
Above you can see where every league is right now. Some are nearly done, like Iceland, Finland and the Swedish second tier. The 2026/27 leagues in blue are all in the first third of their season. And that’s actually the hardest moment to make a projection: there’s a lot of season left and very little to go on.
Contents
- What a projection has to answer
- Model 1: the preseason view
- Model 2: the in-season update
- Model 3: minutes
- Model 4: uncertainty
- Testing the models
- Applying it to 2026/27
- Next
What a projection has to answer
When I make a forecast, I split it into four parts, and each part has its own model:
- How good is the player per 90 minutes?
- How much will they play?
- How do goals turn into wins?
- How wide should the range be?
Put together, end-of-season WAR is the WAR a player has already earned this season + the projected rate × the 90s still to play × wins per goal.
In the image above you can see how that works for Haaland. 0.27 WAR so far this season. A rate of 0.22 per 90 so far, against 0.28 before the season started, which gives a projected rate of 0.27 for the rest of the season. Add the 90s still to play and the Premier League’s wins per goal, and you end up at 2.28 WAR, with a 90% range from 1.34 to 3.21. Before the season the projection was 2.36, so it has barely moved.
Let’s go through the four models one by one.
Model 1: the preseason view
Before a ball is kicked, the model already has an expectation for every player. It takes the player’s on-ball value per 90 (adjusted for league strength), adds the off-ball value and subtracts the replacement level for the player’s role. Seasons are combined by minutes, so a season with 35 full 90s counts for more than one with 8. But I don’t take that average at face value. In Part III, using last season’s raw rate to predict the next season was 34% worse than just ignoring the player and using the role average. A season of football is part skill and part luck. The white dots in the chart below are those raw numbers.
So the model pulls every player back towards the average. How hard it pulls depends on how much evidence there is.Preseason rate = league average + reliability × (observed − league average), where reliability = 90s / (90s + m). Here, the number m is the number of 90s needed to have half signal in that role: 29 for deep playmakers, 49 for target strikers, 130 for stopper centre-backs and 380 for goalkeepers. And the average it pulls towards is the one of the league the player is in now. A new player in Latvia starts as an average Virsliga player, a new player at Bayern as an average Bundesliga player.
So what does that look like for real players? Kane, Haaland and Yamal have between 57 and 69 full 90s in roles that settle quickly, so the model keeps about 60% of their own numbers. Kane’s 0.50 becomes 0.36 and Haaland’s 0.38 becomes 0.28. Van Dijk has even more minutes (84 full 90s) but only gets 49%, because centre-back numbers take much longer to settle. Donnarumma gets 14%. Agazzi had a great Serie C season but gets 11%, so the model sees Agazzi as an average Serie B goalkeeper at Cremonese. And a player with 14 minutes on record gets no weight at all. There are things the model doesn’t do yet: it weighs every earlier season the same, it doesn’t age players during a season and it has no idea about coaching changes.
Model 2: the in-season update
Once the season starts, the model doesn’t build a separate forecast from the new games. I simply add this season’s minutes to the earlier seasons as extra evidence, and the same formula runs again. More 90s means more confidence, and it still pulls towards the same league average. So the weight on this season grows with the minutes played and depends on the role. I don’t pick a number for it. In the backtest, for players with earlier seasons, this season makes up 4% of the projected rate after 10% of the season, 13% at halfway and 20% after 90%. For new players it’s 5%, 14% and 22%. Haaland again: 0.22 so far, 0.28 before the season, 0.27 projected.
The chart above shows that weight over the season. The coral line is players with earlier seasons, the blue line players who are new to the data. Even after 90% of the season, this season is only 20% of the projection for players with history, and 22% for new players. The model never fully trusts one season.
Get Marc Lamberts’s stories in your inbox
Join Medium for free to get updates from this writer.
That looked very cautious to me, so I tested it. I replayed the most recent finished season of all 36 leagues, cut each one at 10%, 20% and so on up to 90%, and compared three predictions for the rest of the season. Using only the rate so far was by far the worst. After 10% of the season its error was 2.5 times bigger than just assuming everyone is league average. After 20% it was twice as big, and even after 90% it was still 8% worse. The preseason view and the blended model beat the league average every time. What this season adds is small at the start and biggest in the middle: after 10% of the season the blended model cuts the error by 3.8% against 3.6% for the preseason view, and at halfway it’s 3.3% against 1.9%.
The chart below shows the three forecasts. The dashed line at 1.0 is the league average: below it is better, above it is worse. The white line (rate so far) starts at 2.5 and stays above 1.0 for the whole season. So extrapolating someone’s form is worse than knowing nothing about them, even late in the season. The blue (preseason) and coral (blended) lines stay just under 1.0 all the way.
This chart zooms in on those two lines, because they’re almost on top of each other. Blue is the preseason view on its own, coral is the preseason view plus this season. At 10% they’re nearly equal (3.6% vs 3.8%). The blue bars shrink faster as the season goes on, because the information from earlier seasons gets older. By halfway, adding this season almost doubles the gain (1.9% vs 3.3%). So this season matters, but more as a top-up than as a replacement.
You can see this clearly in the hot starts this season. Raphinha is at 1.18 per 90 so far against 0.24 before the season, and the projected rate only goes up to 0.30. Yamal goes from 0.29 to 0.35 after a start of 1.12. It works the other way as well. Riley McGree is at -0.38 so far against 0.16 before the season, and the projection only drops to 0.13. Goalkeepers are the extreme case. They’re 9% of the players, but 70% of the 50 hottest starts. Shot-stopping needs around 380 full 90s to settle, so those starts hardly change their projections.
In this chart every row is a player in 2026/27. Blue is the preseason rate, white is the rate so far and the coral diamond is the projected rate for the rest of the season. The percentage on the right is the weight on this season. In every row the diamond stays close to the blue dot, no matter where the white dot is. Raphinha and Yamal had great starts and move a little (7%). Haaland and Kane had quiet starts and barely move (4%).
Model 3: Minutes
A projected WAR total is a rate multiplied by minutes, so minutes really matter. Everybody talks about the rate, but hardly anyone talks about minutes, and they’re even harder to predict. My rule is simple: projected final 90s = 90s so far ÷ share of the season played, capped at the number of league matches the team plays. Haaland’s pace works out to 41, so the cap brings it down to 38. Kane’s pace is 29, because of games missed early on. The big flaw is that the model doesn’t know why a player hasn’t played. Injury, rotation, suspension or the coach’s choice all look the same.
In the chart above, each dot is a player-season from the backtest. After 20% of the season (left) the cloud is wide and only 44% end within five full 90s of the projection. Most dots are above the line: for about two out of three players the early pace overestimates their minutes, by around 3 full 90s on average. Players who start the season in the team often lose minutes later through injury, rotation or a new signing. At halfway (right) the cloud is a lot tighter and 71% end within five full 90s. The straight edges on the left come from how I built the backtest (at least one full 90 before the cut and three after it), not from the model. The backtest also uses the pace without the cap, so the real model does a bit better than this.
In numbers, the minutes error is big. After 10% of the season the projected final 90s are off by 63% on average. After 20% it’s 41%, at halfway 21%, and only after 90% does it go below 10%. Early in the season I’m less sure about the minutes than about the rate. The interesting part is how little it matters for WAR. If I give the model the real final minutes in advance, the error in the end-of-season total only goes from 1.79 to 1.74 goals above replacement after 10% of the season. Most players are close to replacement level, so getting their minutes wrong barely changes their WAR. For the stars it does matter: every five full 90s Haaland misses cost about 0.3 WAR.
The chart above shows the same thing at every point of the season. The two coral bars are where the 2026/27 leagues are now. The minutes forecast only becomes reliable in the second half of the season.
Model 4: uncertainty
None of these projections is an exact number. They all come with a range, and that range is a model too. There are two sources of uncertainty. The first is the player’s true level: we don’t know exactly how good a player is, and that only gets better as the reliability goes up. The second is season noise. Even if we knew a player’s level exactly, the next 30 games would still bounce around it.
In this chart every row is a 2026/27 projection. The white dot is the projected end-of-season WAR, the grey bar is the full 90% range, and the coral bar inside it is what the range would be without season noise. The number on the right is the share of the uncertainty (variance) that comes from the player’s level. For outfield players it’s only 16 to 22%. Most of the range is season noise, not doubt about how good the player is. Even if I knew Haaland’s level exactly, the range would only be about 10% narrower. For goalkeepers it’s 7%. Hornicek and Donnarumma have the widest ranges on the chart (about 0 to 4 WAR), and almost all of that is shot-stopping noise.
A range is only useful if it’s honest, so I tested that too. In the same backtest, I checked how often the actual rest of the season ended up inside the range. At every cut from 10% to 90%, the 90% range contained the outcome 89 to 90% of the time. The 50% range did so 51 to 56% of the time, so it’s slightly too wide later in the season. I’d rather be wrong in that direction than look precise and miss.
In the chart above, the dashed lines are the targets (50% and 90%). The coral line shows how often the outcome was inside the 90% range, and the grey line the same for the 50% range. Both lines stay on or just above their target for the whole season.
The range gets smaller as the season goes on, for two reasons. There are fewer games left for noise to build up, and the model knows more about each player, because reliability goes up as the minutes come in. What the range doesn’t include is minutes. It assumes the minutes from Model 3 are right, so an injury or losing a place in the team falls outside it. It also doesn’t include uncertainty in the parts of WAR underneath it, like replacement level or league strength.
Testing the models
Each of the four models makes claims I can check, but not on the seasons that are still going on, because I don’t know how they’ll end. So I went back to the latest completed season of all 36 leagues and replayed it. I cut every season at 10%, 20% and so on up to 90% of its matches, based on match dates. At every cut the models only see the games played before that date, plus the earlier seasons. Then they forecast the rest of the season, and I compare that with what actually happened. That gives around 10,000 player-seasons at most cuts. At 90% it drops to about 3,200, because a player needs at least three full 90s left to be scored. Every forecast is compared with the simplest baseline there is: assume every player is exactly league average for their role. One caveat: the player data is fully out of sample, but the role settings (stabilisation points and noise levels) and the league strengths were estimated on all completed seasons, including the ones I replayed. So the test is clean at the player level, but not completely at the level of the whole model.
The table above puts all the tests on one page. Every row is a point in the season and every column is a test. “Rate so far error vs avg” is how much worse it is to extrapolate current form than to assume league average: 2.54 times worse at 10%, and still 1.08 times worse at 90%. “Projection gain vs avg” (in coral) is how much the full WAR 2.3 projection beats the league average: between 2.8% and 3.8% for most of the season, dropping to 1.2% at the end, when there’s little left to predict. The next two columns split that gain by type of player. Then you have how well the end-of-season total is predicted, the error of the minutes model and how often the outcome lands in the 90% range.
Two things in the table aren’t covered in the model sections. The first is the difference between players we know and players we don’t. For players with earlier seasons, the projection beats the league average by around 4 to 4.5% in the first half of the season. For players who are new to the data, it’s below 1% at every point. I don’t see that as a failure. For a new player the projection starts at the league average for the role, and a few weeks of games are too noisy to move it much, so it hardly differs from the baseline. But it does show where the value of the model comes from, and that’s knowing a player’s history. Without that, even a decent model can’t tell a new player from an average one until well into the season.
The second is the one most people care about: the final total. Early in the season, the projection explains less than you might hope about how players finish. The correlation between projected and actual end-of-season value is 0.46 after 10% of the season and 0.56 after 20%, which is where most of the 2026/27 leagues are right now. It goes up to 0.76 at halfway and 0.94 at 90%. Most of that increase isn’t the model getting better. It’s the banked part of the season getting bigger. Simple extrapolation (“on pace for”) is clearly worse early on, 0.36 against 0.46 after 10% of the season, and only catches up in the second half, when there’s not much left to predict.
In the chart above, white is “so far, extrapolated”, blue is what’s banked plus the preseason rate, and coral is what’s banked plus the full WAR 2.3 projection. All three lines go up as more of the season is banked. The gap that matters is early on: after 10 to 30% of the season, extrapolating current form is clearly behind. From halfway the lines come together, because by then the final total is mostly decided. The blue and coral lines are almost on top of each other, which is the same thing we saw in Model 2: the preseason view does most of the work and this season adds a bit on top.
Applying it to 2026/27
With the models tested, I can go back to the question I started with. For all 2026/27 players with at least 15 projected 90s, the projection now and the preseason expectation have a correlation of 0.89, and the median player has moved by 0.10 WAR. After 12 to 33% of the season, most players are almost exactly where the model had them before the first game. And that’s fine: according to the backtest, this is about how much a few weeks should move a forecast.
In this chart every dot is a 2026/27 player. On the horizontal axis you have the projected end-of-season WAR before the season started, and on the vertical axis the projection now. Dots on the dashed line haven’t moved. The grey outfield players stay close to the line. The coral goalkeepers are spread out a lot more, because a few weeks of shot-stopping can bank (or lose) a lot of WAR, even when the projected rate barely changes. The names are the five players who moved the most: Yamal and Raphinha at the top, and a few lower-league players and goalkeepers with extreme first weeks.
The leaders show the same two things. Yamal is projected for 4.19 WAR (2.49 before the season) and Raphinha for 3.82 (1.99), followed by Olise (2.64), Bruno Fernandes (2.60) and Saka (2.56). Yamal and Raphinha moved a lot, but it’s worth looking at where that comes from. Both already have about 1.8 WAR banked from seven games, and nobody can take that away. Their projected rate for the rest of the season only went up by about 0.06 per 90. So the model isn’t saying either of them suddenly became a 4-WAR player. It’s saying the first seven games happened. Haaland (2.28 now, 2.36 before the season) and Kane (2.14 and 2.32) are the other side of it. Kane’s drop comes almost entirely from the 3.4 full 90s played so far at a lower rate than usual. The projected rate for the rest of the season has hardly changed, from 0.355 to 0.349.
Each bar in this chart is a player’s projected end-of-season WAR. The coral part is already banked, the grey part is the forecast for the rest of the season and the line is the 90% range. It’s worth looking at the split and not just the total. Yamal and Raphinha are mostly coral, so their totals are driven by what has already happened. Haaland, Kane and Evanilson are mostly grey, so their totals are almost all forecast and rely on the preseason view. There are also two goalkeepers in the top 15 (Liesegang and Hornicek), with very wide ranges. That’s the noise from Model 4.
The calendar-year leagues show the projection at the end of its job. With 70 to 88% of the season played, most of every total is already banked and the forecast only adds the last few games. Mergim Krasniqi (GAIS) leads with 2.60, of which 2.45 is banked. Mohamed Badamosi (FC Riga) is projected for 2.49, while the preseason expectation was -0.09. That’s the biggest swing in the network, and nearly all of it is banked. Once a season is mostly played, the model trusts what has happened, because it’s not a forecast anymore. Isak Bjerkebo (Sirius, 2.17), Zlatko Tripic (Viking, 1.95) and Paulos Abraham (Hammarby, 1.93) make up the top five. At this point these numbers are a lot closer to the per-season WAR from the earlier parts than to a prediction.
This is the same chart for the Nordic, Baltic and Icelandic leagues. If you compare it with the 2026/27 one, almost every bar here is mostly coral and the ranges are short. At this stage of the season the projection has little left to do, and the uncertainty has shrunk with it. Side by side, the two charts show the models at both ends of a season.
Next
So, back to the question I started with: how much should a few weeks of football change what we expect from a player? Based on all the tests in this article, a lot less than it feels like. After 10% of a season, extrapolating a player’s form is two and a half times worse than assuming they’re average. The rate that best predicts the rest of the season is still 96% based on what we knew in August. Haaland’s quiet start moved the projection from 2.36 to 2.28 WAR. Raphinha’s great start moved the projected rate from 0.24 to 0.30 per 90. A lot of what looks like a story in September is noise, and a model that ignores most of it ends up more accurate than one that reacts to it.
That doesn’t mean the start of a season doesn’t count. It just counts in a different way. Whatever has happened is banked and the projection keeps all of it: the 1.8 WAR Yamal and Raphinha have from seven games is real value. What the start doesn’t tell us yet is how good a player has become. That difference, between what has happened and what we should expect next, is the reason to keep a projection separate from a season of WAR. Baseball figured that out a long time ago, when it built projection systems next to WAR instead of reading WAR as a forecast.
I’ll update the 2026/27 projections as the season goes on, and I’ll come back to them at 25%, 50% and 75% of the season to see how they hold up against what actually happens. That’s the test that really counts. Based on the backtest, I’d expect most players to finish inside their range, about one in ten to break out of it like Kane did last season, and the goalkeepers to be all over the place. The models still have clear limits: the minutes model knows nothing about injuries or transfers, there’s no adjustment for strength of schedule, every game this season counts the same, and goalkeepers stay mostly noise. In the next part I’ll bring everything from this series together in WAR 2.0: the replacement populations, the roles, the league network, the goals-to-points conversion and the full validation scorecard, test by test.








