Predictions methodology

How we build win probabilities

Open model. Open track record. Open limitations.

What we predict

For every upcoming match in our football predictions hub, NeatSports publishes four probabilistic forecasts before kick-off:

  • Full-time result (1X2): probability of home win, draw, away win, summing to 100%.
  • Both teams to score (BTTS): probability that each side scores at least one goal.
  • Over / under 2.5 goals: probability that the match ends with 3 or more total goals.
  • Most likely correct score: the single scoreline with the highest probability under the model.

Every probability is shown next to the prediction. We never publish a “pick” without the underlying probability so you can judge our confidence yourself.

How the model works

The NeatSports model is an in-house implementation that combines two well-understood ideas from sports analytics:

1. ELO-style team strength ratings

Every team has a numeric strength rating. After each finished match, both teams’ ratings are updated based on the result and the rating differential entering the match. Strong teams that beat weak teams gain little; weak teams that beat strong teams gain a lot. The K-factor controls how quickly ratings respond to new results; we use a higher K-factor for newly tracked teams and decay it as the sample of matches per team grows.

The rating differential between two teams maps to a baseline win probability via the standard ELO logistic curve. A team rated 100 ELO points above its opponent has roughly a 64% baseline win probability on neutral ground.

2. Poisson goal-scoring model

On top of the ELO-derived strength differential, expected goals for each side are drawn from a Poisson distribution whose mean is derived from the league average (current season) modulated by attack/defence factors implied by the rating gap and adjusted for home-field advantage. Convolving the two Poisson distributions gives a full probability matrix over every possible scoreline (0-0, 1-0, 1-1, …). From that matrix we sum over the relevant cells to derive:

  • 1X2 by summing scorelines where home goals > / = / < away goals
  • BTTS by summing scorelines where both sides scored at least once
  • Over 2.5 by summing scorelines where total goals ≥ 3
  • Correct-score pick by taking the argmax of the matrix

The full probability matrix is what we display, not an opinion on top of it. There is no manual override.

Features the model uses

  • Current ELO rating of each side (the strongest single feature).
  • Recent form: last 5 matches per team. Form is implicit in the ELO update path rather than a separately weighted feature.
  • Home-field advantage: a league-specific additive bonus to the home team’s expected goals, recalibrated when seasons turn over.
  • League scoring environment: the running average goals-per-match in the current season of the relevant competition, used as the Poisson base rate.
  • National / international flag: international fixtures (friendlies, qualifiers, World Cup) use a separate rating pool because club and international strengths don’t transfer.

Features we deliberately don’t use

  • Bookmaker odds. We don’t reverse-engineer market probabilities. Our forecasts are derived from match data only, which is what makes them comparable to (and gradable against) the market.
  • Injury news. Squad availability would meaningfully improve forecasts but our pipeline doesn’t yet ingest a reliable injury feed. We flag this as a known limitation below.
  • Weather. Effects are small and noisy at the population level.
  • Manager identity. We track managers for content reasons but don’t use them as a model feature.

When the model retrains

  • ELO ratings update after every finished match the moment the final whistle is reflected in our data feed (typically within ~60 seconds).
  • League scoring environment (Poisson base rate) recalculates daily from completed fixtures in the running season.
  • K-factors and home-advantage constants are reviewed at the start of each major competition season and after every international tournament. The current values, with their last review date, live in the plugin source so an audit is reproducible.

There is no model retraining in the deep-learning sense. The model is parametric and updates continuously rather than in periodic batches.

Track record

Every finished fixture with a pre-match prediction is graded into our database and aggregated into the snapshot below. We do not edit historical predictions. The number we showed the day before a match is the number we score ourselves against. You can browse every live forecast we have published on the football predictions page.

1307 graded fixtures Snapshot generated 7 Aug 2026 UTC. Updated nightly.
Market Sample Top-pick hit rate Naive baseline Brier score
1X2 (full-time result) 1307 50.3% 33.3% 0.631
Both teams to score 1307 53.3% 50.0%
Over / under 2.5 goals 1307 53.1% 50.0%
Correct score 1307 12.2% ~8% (1/12)
How to read these numbers
  • Top-pick hit rate is the percentage of finished matches where the outcome we assigned the highest probability to is the outcome that actually happened. A coin-flip on three outcomes would average 33.3%.
  • Brier score measures the squared distance between the probabilities we issued and the binary outcome that actually occurred, summed over Home/Draw/Away. Lower is better. A uniform “always 1/3 each” prior scores ~0.667; bookmaker odds typically score 0.55-0.60 once converted to probabilities.
  • Sample is the count of finished fixtures we’ve graded since outcomes started being recorded. The model improves as the sample grows. We do not retroactively edit historical predictions; you can grade us on the same numbers we showed before kick-off.
  • Raw per-fixture data is available via the /wp-json/sm/v1/predictions/accuracy REST endpoint for anyone wanting to audit the calculation.

Source data: /wp-json/sm/v1/predictions/accuracy. Snapshot table backs every number on this page; nothing here is hand-curated.

Limitations we want you to know

  • Sample size is still small. We started graded snapshots after the predictions feature shipped. The numbers above will become more reliable as the sample grows. Treat the current Brier score as preliminary.
  • Home-pick bias. The current parameter set tends to over-pick home wins on close matchups in lower-volume leagues. We’re aware of this and recalibrating.
  • No injury / suspension data. A starting goalkeeper out for cup-tie reasons can move a fair price by 10-15%; our model won’t know about it.
  • Cold-start teams. Newly promoted or international teams with few matches in our sample get higher uncertainty until the ELO settles.
  • Cup competitions. Single-leg cup ties (especially with significant rotation) are harder than league fixtures. Expect wider error bands.

Who builds and reviews this

NeatSports Data Team. The model, the codebase that runs it and this methodology page are maintained in-house by the NeatSports engineering team. The same model powers every probability you see on the football predictions page.

How it’s built

The model runs on a standard server-side stack. There is no external prediction service, no third-party betting feed and no closed-source “AI” black box. Match data is ingested from a licensed football-data feed and the rating + Poisson math runs locally on our own servers in well under a second per fixture.

The algorithm, end to end

  1. Ingest the result. Every finished match is committed with its final score, goal events, lineups and minute log. Friendly internationals are tagged separately so their results don’t pollute club ratings.
  2. Update both teams’ strength ratings. We use an ELO-style update: Rnew = Rold + K · (result − expected) where expected comes from the standard ELO logistic curve over the rating differential, result is 1 / 0.5 / 0 for win / draw / loss, and K is a tier-aware factor (higher for newly tracked teams and for high-leverage matches such as finals; lower for teams with hundreds of recorded fixtures).
  3. Estimate expected goals per side. For an upcoming fixture we take the league’s running goals-per-match average for the current season as the base scoring rate, then modulate it by the rating gap and a league-specific home-field bonus. The result is two means: λhome and λaway.
  4. Convolve two Poisson distributions. Treating goals as independent Poisson draws, we compute the joint probability of every reasonable scoreline (0-0 through 6-6) by multiplying the marginal probabilities. That gives a full 7×7 matrix that sums to ≈ 100%.
  5. Project markets from the matrix. Each published probability is a sum over cells of that matrix:
    • Home win = sum of cells where home goals > away goals.
    • Draw = sum of the diagonal.
    • Both teams to score = sum of cells where both rows and columns are ≥ 1.
    • Over 2.5 goals = sum of cells where home + away ≥ 3.
    • Most likely scoreline = the single cell with the highest probability (argmax).
  6. Publish and freeze. The probabilities are written before kick-off and never edited afterwards. When the match finishes, the pre-match snapshot is graded against the actual result and rolls into the track record table above.

There is no manual override, no tipster overlay, no “value pick” recommendation layer. What you see is the raw output of those six steps.

If you spot a calculation error or want to challenge a published probability, email hello@neatsports.com with the fixture URL and the prediction snapshot. We respond to every audit request in writing.

Page last reviewed: . Methodology version: 1.0.

Disclaimer

NeatSports football predictions are statistical estimates, not advice and not tips. They reflect what a published model believes the probability of each outcome is, given the inputs listed above. They do not constitute a recommendation to place a bet of any kind. Past performance does not predict future results; a 60% probability win can and routinely does lose.

Football is intrinsically uncertain. Any single match can defy any model. If you choose to use these probabilities to inform a wager, please:

  • Bet only what you can afford to lose.
  • Set deposit and time limits with your operator before you start.
  • If your gambling stops feeling fun or you’re chasing losses, stop and talk to someone.

Free, confidential gambling support:

NeatSports has no commercial partnerships with bookmakers, no affiliate odds links and earns nothing if you choose to wager. Our incentive is to publish accurate probabilities, not to drive bet volume.