How the predictions are made
No black box. Three named statistical models, a blending step fitted and checked on held-out data, and an outcome selector with an explicit data-quality gate. Here is each stage, including where it falls short.
1. Three independent models
Each model sees the same match data and forms its own opinion. They fail in different ways, which is the entire reason for running three rather than tuning one.
Elo ratings
A single strength number per team, updated after every match by how surprising the result was and by the margin of victory. Home advantage enters as a fixed rating offset. The rating difference is mapped to home/draw/away probabilities through a logistic curve fitted on historical outcomes.
Weakness: knows nothing about goals, only about who beat whom. It cannot tell a 1-0 grinder from a 4-3 thriller when both teams end up equally rated.
Dixon-Coles Poisson
Models goals directly: an attack strength and a defense strength per team, estimated separately for home and away, producing an expected goal rate for each side. Those two rates generate the full probability matrix over every scoreline, which is where over/under lines, both-teams-to-score and correct-score numbers all come from. The Dixon-Coles correction fixes a known flaw in plain Poisson, which understates 0-0, 1-0, 0-1 and 1-1.
Weakness: assumes the two teams' goal counts are independent, which they are not -- a team leading 3-0 stops attacking.
Gradient boosting
A scikit-learn ensemble over engineered features: points per game across a recent window, goals scored and conceded, home/away splits, clean-sheet rate, days of rest, and the Elo gap. It finds interactions the first two models can't express by construction.
Weakness: it needs training data per league. Where a league hasn't been trained, it drops out of the blend entirely and the other two carry the prediction -- the match page tells you when that happened.
A fourth, narrower signal: squad availability
Reported injuries and suspensions are pulled daily; confirmed starting lineups are polled in roughly the 60-90 minute window before kickoff, since that's when providers actually publish them. Neither feeds the gradient-boosting model directly -- a column that's zero for every historical match, because no lineup data existed back then, would teach it nothing. Instead, a missing regular starter shifts the match-result probability by a small, capped amount and is named as a factor in the explanation -- never a silent swing. With no reported absence and no lineup confirmed yet, it changes nothing.
2. Blending and calibration
The three sets of probabilities are combined on one set of weights, then renormalized. The weights are fitted on a validation split the models never trained on, pooled across every league -- fitting them league by league chased noise in a few hundred matches and did worse on the seasons that followed. A blended probability is not automatically an honestone, though -- a model can be 70% confident on a set of matches that only happen 55% of the time.
So every number is checked against a later, untouched test split. Match-result probabilities come out close to calibrated as blended; an extra per-league correction fitted on top made them worse on that test split and was removed. The goals markets do still get a held-out calibration pass. The result: the matches where the system says 70% are matches that historically resolved that way about 70% of the time.
Why calibration matters more than accuracy
A model that says "55%" on every match can be well calibrated and nearly useless. A model that says "95%" on everything can be accurate on the easy majority and catastrophically wrong when it matters. Accuracy alone hides both failures, which is why every prediction here also reports its confidence band, data-quality score and model agreement.
The confidence band follows the match-result pick's own probability. On held-out seasons, a pick at 60% or more (HIGH) came in about 7 times in 10; between 45% and 60% (MEDIUM), about half the time; below 45% (LOW), about 4 times in 10. A thin match history or models that split over the fixture cap the band lower, whatever the probability.
3. The Global Most-Likely Outcome
Rather than showing one market and leaving you to compare, every fixture is scored across the full outcome registry -- match result, double chance, both-teams-to-score, five over/under lines, and the correct-score grid -- and the single highest-probability outcome is surfaced.
The registry records which outcomes are mutually exclusive (home/draw/away must sum to one) and which are not (a home win and over 2.5 goals can both happen), so downstream consumers can reason correctly about combinations. Crucially, each outcome also carries a minimum data requirement: outcomes whose gate a fixture fails are excluded before the comparison happens. A team with three matches of history cannot produce a confident-looking correct-score call.
High probability is not high value
The most-likely outcome is frequently a low-information one -- a heavy favourite, or an "over 0.5 goals" line that clears 95%. The prediction models themselves still never look at bookmaker odds -- they form an independent opinion, not a re-derivation of the market's. Real captured prices are used separately to price the multi-leg accumulators you see elsewhere on the platform, but nothing compares those prices across bookmakers or tells you whether a given price is good value. If you want that comparison, it's still yours to make.
4. How it's evaluated
Train, validation and test are split by date and never shuffled. Every feature is computed as-of the fixture's own kickoff, reading only matches strictly before it. That's what makes the evaluation meaningful: a shuffled split would let the model learn from March to predict February and report a wonderful, fictional accuracy.
The baseline that matters: professional bookmakers, with paid feeds and larger models, land around 53-55% on football 1X2. Football is a low-scoring sport with enormous variance; a single deflection decides matches. Any system claiming 80%+ on match results is either measuring something other than what you think, or leaking future information into its features.
5. What it can't do
Listing these is not modesty; it's the difference between a tool you can calibrate your trust against and one you can't.
- Squad availability is a bounded nudge, not a trained feature. Reported injuries/suspensions and lineups confirmed near kickoff shift a match's probability by a small, capped amount and get named in the explanation -- they are not fed into the gradient-boosting model's training data, and the size of that nudge has not itself been backtested against real results. Treat it as a reasoned adjustment, not a measured one.
- No live shot-level statistics. In-play updates work by time-scaling the pre-match expected goals against the current score, adjusted for red cards. That's an honest approximation, not a substitute for live xG.
- No referee, weather or travel modelling. Each is a documented extension point rather than a shipped feature.
- No head-to-head weighting. Deliberate: squads turn over enough that a result from three seasons ago carries little signal. H2H is shown as context only.
- No odds comparison or value/edge assessment. Real bookmaker prices are captured and used to price accumulators, but nothing compares prices across bookmakers or tells you whether a given price is good value relative to the model's own probability -- that comparison, if you want it, is yours to make.
- Cold-start weakness. Newly promoted teams and early-season fixtures have thin history. The data-quality score reflects this, and the confidence band drops accordingly.
See it on real fixtures
Accounts are reviewed by a Super Admin before they go live.