About Fulltime Stats
Fulltime Stats publishes statistical football predictions in plain English. For each match we show a win / draw / win probability split, the most-likely scoreline, and a "fair odds" figure — all produced by our own model from expected-goals data. The site carries no bookmaker odds and no gambling-affiliate content.
What follows is the whole method, in the order the numbers actually travel, including the parts that do not work. If you want to know why this site thinks a match is 62/22/16 rather than something else, everything you need is on this page.
If you want the shorter question first — why we publish any of this, and what we do with a prediction after the match is over — that is on our mission page.
The short version
Predictions come from our own Poisson / Dixon-Coles model — not from a third party, and not from any bookmaker's prices. The pipeline is five steps:
- Estimate every team's attack and defence rating from its recent expected goals, adjusted for how good its opponents were.
- Regularise those ratings so a short, one-sided sample cannot produce a confident prediction.
- Level them across leagues, so a Danish side and a Portuguese side can be compared at all.
- Turn the two teams' ratings into expected goals for this specific fixture.
- Convert those into a probability for every scoreline, then add the scorelines up into 1/X/2 and the derived markets.
Step 1 — Attack and defence, adjusted for who you played
A team's raw scoring rate is a poor rating because it says as much about the fixture list as about the team. Four goals against the division's worst defence is not the same evidence as four against its best.
So the ratings are solved rather than averaged. Every team starts at 1.00 — exactly league average — and we repeat the following twelve times: each team's attack becomes its goals scored divided by the league average and by the current defensive rating of each opponent it faced; its defence becomes the same calculation from the other side. After each pass the whole league is renormalised so the mean is 1.00 again. The ratings settle into a set where every team's number is expressed net of the opposition it happened to meet.
The input is expected goals rather than goals wherever the data provider has them, because xG measures the chances a side created and conceded instead of how they finished on the day, and it stabilises faster on a short sample. The window is the last six matches. That is deliberately short: what a team is doing right now predicts Saturday better than what it did in October.
Two gaps are handled explicitly. Where a competition has no xG feed, the same arithmetic runs on actual goals — the structure is identical, the input is noisier. And a team no tracked league gave us a rating for (a promoted side, a cup entrant from a division we don't cover) is rated from its own recent goals with no opponent context, then regressed hard: we keep only 40% of that estimate and mix in a deliberately below-average newcomer prior. An unadjusted lower-division scoring rate would otherwise walk into a top flight looking like a title contender.
Step 2 — Regularisation, and why the model refuses to be certain
Six matches is not much football. A side that has kept four clean sheets in that window has a raw defensive rating near zero, and a model that believes it will happily print a 90% probability — we have watched it try. Two things stop that.
Every rating is shrunk toward the league average: the published figure is 1 + 0.35 × (raw − 1), so a raw 2.00 attack becomes 1.35 and a raw 0.40 defence becomes 0.79. Then both are capped to the band 0.55–1.75. The cap is a backstop for the extreme tail, not the main mechanism; the shrink is what does the work on ordinary matches.
This is the single biggest reason our probabilities look less decisive than some competitors'. It is a choice, and we think it is the honest one: a confident number that is confidently wrong is worse than a hedged number that is right about its own uncertainty.
The season table projection on our Tables page uses a different shrink, because it is answering a different question. The match model wants recent form; a projection over thirty remaining rounds must not treat six matches as settled evidence. There the trust placed in a rating grows with the number of matches behind it, so six games barely move a team off average while a full season nearly earns its raw rating.
Step 3 — Comparing teams from different leagues
Ratings are normalised within a league, which means an average Bulgarian side and an average Spanish side both rate 1.00. That is fine until they meet in a European tie, at which point the model would call it even.
So each country gets a level multiplier derived from its UEFA coefficient, compressed by a power of 0.4 and anchored so that a top-five European league sits at about 1.00, with the result bounded to 0.50–1.06. A team's attack is multiplied by that level and its defence divided by it. Because both sides of a domestic fixture carry the same multiplier, it cancels exactly and domestic predictions are untouched; it only bites when two leagues meet.
A coefficient describes a country's top flight, though, and we also cover five second divisions. Until 22 August 2026 they ran through the same country multiplier as the division above them, so England was simply England: an average Championship side and an average Premier League side leveled to identical numbers. Because the factor cancels inside a league this looked harmless, and inside a league it was — but a promoted club carries its rating across the two, and that is where the cancellation stops. On the opening weekend it made newly-promoted Hull City a 47% home favourite against Manchester United, and rated Middlesbrough, who are still in the Championship, above United. A second division now carries a further multiplier of 0.70 against its own top flight. That figure is the midpoint of two independent readings of the Championship-to-Premier-League step: what promoted sides have historically gone on to do in the top flight suggests about 0.65, and the roughly 200 Elo points between mid-table clubs in the two divisions suggests about 0.75. One number covers all five second divisions, because we have no measurement that would justify claiming to know how Serie B differs from Ligue 2.
Leagues outside UEFA — Brazil, Argentina, Mexico, the United States — have no UEFA coefficient, and for a long time they fell through to the neutral 1.00, meaning the model quietly rated the Argentine top flight as the equal of the Bundesliga. They now carry estimated UEFA-equivalent coefficients that run through the same formula. A real UEFA coefficient always wins, so this can never override the published ones.
Placing a division correctly is not the same as trusting a rating that crosses one, and two clubs a season go each way. So a rating carried into a different division is blended halfway toward the seam between the two — the geometric mean of their levels, which is where a promoted or relegated club sits by construction, being the top of one division and the bottom of the other. Not toward the new division's average: that would drag a promoted club up toward mid-table, which is the opposite of what promotion means. The downward crossing is the one that needed this most. The regularisation in step 2 pulls every rating toward its own league's average, a relegated club is among the weakest in that league, so the flattering estimate is the one that gets carried into a division whose average is 30% lower.
One implementation detail is worth stating because it caused a real bug: the 0.55–1.75 band has to be scaled by the league level too. Clamping a levelled rating against the unlevelled band re-broke the cancellation, and in weak leagues it pinned half the division to the floor — teams that the model could then no longer tell apart. The band moves with the level, and the only guard left against an absurd cross-league projection is a hard ceiling of five expected goals for one side, which nothing on the current board comes near.
Step 4 — Expected goals for this fixture
With ratings in hand, each side's expected goals is a product (the multiplicative form Maher set out in 1982):
λhome = league average × home attack × away defence × √(home advantage)
λaway = league average × away attack × home defence ÷ √(home advantage)
The league average is measured from that competition's own finished matches rather than assumed. Home advantage is split between the two sides — the home figure multiplied by its square root, the away figure divided by the same — so the ratio between them is exactly the stated advantage while the total goals expected in the match are left alone. It is currently 1.35 for club football, 1.08 for international qualifiers and the Nations League, 1.05 for friendlies, and exactly 1.00 for a World Cup played at a neutral venue.
That 1.35 is not a convention we inherited; it is the most-corrected number in the model, and the correction is described in the next section.
Step 5 — From expected goals to probabilities
Goals in football are close to a Poisson process, so from the two expected-goal figures we compute the probability of every scoreline from 0-0 up to 8-8. Summing the cells where the home side scores more gives the home-win probability; the diagonal gives the draw; the rest gives the away win. Both teams to score and over/under 2.5 are sums over different regions of the same grid, which is why they can never contradict the 1/X/2 split.
Plain Poisson treats the two teams' scores as independent, and at low scores that is measurably false — 0-0 and 1-1 happen more often than independence predicts, 1-0 and 0-1 slightly less. The Dixon-Coles correction adjusts exactly those four cells, with a parameter currently set to −0.05.
One design choice on the displayed scoreline is worth flagging, because it surprises people. We show the most likely exact score within the predicted result, not the most likely score overall. The global mode is very often 1-1, which would mean a page headlined "62% home win" illustrated by a draw. Agreeing with our own headline seemed more useful than being technically the modal cell.
Fair odds explained
Alongside each probability we show a "fair odds" figure. This is simply the mathematical conversion of our model's probability into decimal-odds format: fair odds = 100 ÷ probability. For example, a 42% chance converts to fair odds of 2.38. It represents the break-even price for that outcome according to our model — the price at which backing it would, if our probability were exactly right, neither gain nor lose over the long run. These figures come entirely from our own statistical model. They are not odds offered by, quoted from, or linked to any betting operator, we do not compare them with anyone's prices, and this site carries no bookmaker advertising.
Where the model is wrong
A methodology page that only lists strengths is marketing. These are the known weaknesses, in rough order of how much they matter.
It was under-calling home wins, and no longer is. Measured in July 2026 across 173 settled pre-match predictions, the model gave home sides 41.7% while they actually won 51.4% of the time. Home advantage was raised twice in response, 1.15 → 1.30 → 1.35, both deliberately as half-steps: the value that would have closed the gap in one jump was around 1.56, but on a paired bootstrap its improvement could not be distinguished from noise, while 1.35 could. Re-run in August on 942 settled predictions — five times the evidence, and a month of league football rather than a week of summer qualifiers — the model now gives home sides 46.8% against 47.2% observed. No value in the search improves on 1.35 by more than a rounding error, so it stays. We are recording this because a methodology page that only ever lists open problems is telling you as little as one that lists none.
It predicts too many goals. Across 1,395 settled pre-match predictions made on the current parameters it expected 3.16 goals a game and got 2.89 — about 9% too many. Until 6 September 2026 this page quoted a harsher figure, 3.24 against 2.82 on a 942-match sample, and said that scaling every expected-goals figure down by about 13% would match; on today’s log the scaling that would match is nearer 8%. The direction was right and the size was not, so we are correcting it rather than leaving the more damning number up. We still have not applied the scaling, because doing so also pushes the home/draw/away split away from the observed one, which says the fault is more likely in how the ratings or the league averages are built than in a multiplier at the end. This is the one weakness on this list that changes numbers we display directly: the over-2.5 and both-teams-to-score figures are read straight off that goal level, and they are currently too high.
It backed away favourites too hard, and on domestic football no longer does. When the model made the away side the favourite it gave the home team 19–20% while the home team won 32–34% of those matches: a 13-point miss, and the largest single calibration error we could measure in our own log. On 27 August we wrote that this had been measured on the old model, that it had not been re-measured on the current one, and that we would not claim it fixed until it had been. It has now been re-measured. Of the settled predictions in the log, the 125 made on the old parameters give the home side 25.0% where it went on to win 39.2% of the time — a 14-point miss. The 354 made since give 27.3% against 29.1% observed, a miss of 1.8 points. Split by competition the closure is not even: domestic leagues account for it (288 matches, 0.8 points), while European ties still show a 6-point gap across 66 matches, which is too small a sample to call in either direction. So it is closed where we can see it and open where we cannot yet, and we would rather say that than round it to fixed.
It knows nothing about players. No injuries, no suspensions, no rotation before a European tie, no manager change, no red card in the first ten minutes. A team rated on six matches with its first-choice forward is rated the same the week he is ruled out. This is the largest single piece of information we do not use, and adding it is the clearest improvement available to us.
Its evidence is uneven. Expected-goals coverage is a property of the competition, not of our subscription: some leagues supply xG for nearly every fixture, others for a fraction, and those fall back to a goals-based estimate that is structurally identical but noisier. Early in a season every rating in a league is short of data at once, which is when the shrink in step 2 is doing most of the work and our probabilities are at their flattest — correctly so.
International football is the weakest case, and it is the one we have just changed. National-team competitions are played in divisions and groups whose teams never meet outside them — in the Nations League, League A plays only League A and League D only League D. That is not a thin sample, it is a disconnected one: the ratings graph falls into four pieces with no result linking them, and our estimator centres each piece on the same average, so a League D side comes out looking like a League A side. No volume of results repairs it, because the information is not in the results. Since 7 September 2026 a national side's rating is pulled instead toward the strength implied by its FIFA World Ranking points — the release of 20 July 2026 — which is the only measurement of these teams that comes from outside the competition, and it is the same number shown in the FIFA column on their tables. The constants that turn ranking points into a strength are declared, not fitted: our settled-prediction log holds two national-team matches, which is nothing to fit against. So these predictions are uncalibrated, we will keep saying so until the log is large enough to test them, and the fixtures remain sparse enough that a rating rests on games months apart.
And the base rate is humbling. Even a good football model is right about the outcome somewhere near half the time and names the exact scoreline in about one match in ten. Our running record is in that range. Anyone quoting a much higher figure is either counting differently or not counting.
How we check ourselves
Every prediction is written to a log before kick-off and never edited afterwards, together with the expected goals and the parameter values that produced it. That last part matters: without freezing the parameters, a later change to home advantage would silently rewrite history and make every past prediction look like something the model never said.
The log is then scored against results — how often the 1/X/2 call was right, how often the exact scoreline was, and how the probabilities perform under proper scoring rules that reward being well-calibrated rather than merely confident. The comparison that matters is not against zero but against a model that learned nothing, and a parameter change is only accepted when its improvement survives a paired bootstrap over that log. A fuller public scorecard is planned once a season's worth of European league fixtures is in the sample; the summer window we have now is too short and too odd to conclude much from.
What our predictions are — and are not
Advertising on this site
Fulltime Stats is supported by standard display advertising, kept clearly separate from the predictions and analysis. We have no commercial relationship with any team, competition, or gambling operator.
Data sources
Fixtures, results, live scores, standings, expected-goals and player data come from API-Football (api-sports.io). The data is refreshed automatically several times a day; live scores reflect the most recent refresh. UEFA country coefficients are the published ones. The prediction model, the ratings, the levelling and all editorial framing are our own, and no part of any prediction on this site comes from another forecaster.
Corrections
When we find a mistake in the model we change it and say so on this page rather than quietly re-running the numbers. The home-advantage correction described above is the first entry; it will not be the last.
6 September 2026 — the away-favourite gap has closed on domestic football, and one of our published weaknesses was overstated. Two figures on this page were measured in August and had not been re-checked since. Both were re-run against the log as it stands today, and both moved in our favour, which is the direction that most needs saying out loud. The away-favourite gap — the error this page called the largest it could measure — is 1.8 points on the 354 settled predictions made since the current parameters were adopted, against 14.2 points on the 125 made before them; the closure is carried by domestic leagues, and European ties still show a 6-point gap on 66 matches. And the goal level, which this page said was about 13% too high, is about 9% too high on 1,395 matches, needing a scaling nearer 8% than 13%. We are recording an entry for a correction that flatters us for the same reason we record the ones that do not: a page that only updates its numbers when they get worse is not being audited, it is being curated. Neither weakness has been deleted from the list above — the old figures are still there beside the new ones, because the path is the documentation.
27 August 2026 — home advantage was adding goals to every match. The formula above
multiplied only the home side’s expected goals by the home advantage, with nothing on the other side to
balance it, so every fixture asked for league average × (1 + 1.35) goals instead of
league average × 2. Measured across 1,031 settled matches, the model expected 3.31 goals a game
where 2.82 were scored — 17% too many. It showed up where you would expect: over 2.5 goals was published at
61.8% against a real 53.8%, and both teams to score at 59.4% against 51.9%. Splitting the advantage across
the two sides, as described in step 4, leaves the ratio between them untouched and brings the goal level to
2.80 against an observed 2.79. Two independent checks agreed the formula was the cause before it was changed:
the arithmetic predicts a 17.5% excess and the data showed 17.4%, and a fit that sees only which result
occurred — nothing about goals — recovered the exact correction the goal counts imply.
27 August 2026 — the model was too sure of itself. When it put an outcome above 65% it was right 59% of the time; when it put one below 10% that outcome still happened 18% of the time. Those are one error seen from two ends, not two errors: the three probabilities in a match add to 100 and exactly one result occurs, so every point handed to a favourite is a point taken from an underdog. The cause was the shrink in step 2 — ratings were left too far apart — and it has moved from 0.65 to 0.35, which is the value that best fits our own settled predictions and still fits them when tested on matches it was not fitted on. Two consequences we would rather state than have found. Predictions published before today were scored in the accuracy log against the numbers the model actually gave at the time, and we have not rewritten them, so the track record on our accuracy page covers two different models and will show a step where they meet. And the away-favourite gap described above was measured on the old model; it has not yet been re-measured on this one, and we will not claim it is fixed until it has been.
22 August 2026 — home advantage re-checked, and left alone. Not every entry here is a change. The 1.35 figure was set in July on 173 summer matches, which is thin evidence for the single largest multiplier in the model, so it was re-run against 942. It held, and the home-win gap it was raised to close is now closed. The same run showed the model's breakdown by competition type suggesting one home advantage for domestic leagues and a much larger one for European ties; that split was tested on matches it had not been fitted on, performed worse than the single value, and was not adopted. We are recording the check because "we looked and changed nothing" is a result, and a page that only reports the changes would imply the rest went unexamined.
22 August 2026 — second divisions were rated as though they were top flights. Described in step 3 above. The visible symptom was the opening-day Hull City vs Manchester United page, which gave a promoted side a 47% home win; the cause was that our cross-league leveling knew about countries and not about divisions. Predictions between two clubs in the same division were never affected. Those involving a promoted or relegated club were, in both directions: promoted sides were rated too highly, and relegated sides visiting their new division were rated too low. Pages published before this date were scored in the accuracy log against the numbers the model actually gave at the time, and we have not rewritten them.