The algorithm
How the model works, and how we tune it.
The model estimates the chance of each outcome from past results. In backtests it is a little worse than the betting market, so we say so on every tip. This page is the single place where the current version, the evidence behind it and the way we will change it are written down. Nothing here is edited quietly: a change is a new version.
The version in use
The same goals model as version 1, but each past match teaches it from half the real score and half what the team's shots on target were worth. Goals are rare and lucky; shots on target say more about how a team plays.
What it learns from
- • Results of the last three seasons of the league (football-data.co.uk), recent matches counting more
- • Shots on target of every past match (0.3375 goals per shot on target, estimated on the train seasons)
- • Home advantage of the league
What it does not know
Lineups, injuries, suspensions, rest days, motivation, weather. The market knows these, which is the main reason it beats us.
Settings
- Half-life of a match
- 365 days
- Shrinkage toward the league average
- 3 matches
- Low-score correction (Dixon-Coles rho)
- -0.05
- Weight of shots on target
- 50%
How a tip is decided
- 1The model gives a probability to every outcome of the match (1X2, over or under 2.5 goals, both teams to score).
- 2We compare it with the odds. The edge is the model's probability minus the probability the odds imply, in percentage points.
- 3We publish only if the edge is at least 2 pp, the odds come from a named bookmaker, the match has not started, and the reasoning is backed by at least 2 blocks of data.
- 4Confidence and stake stay at the minimum (1 out of 5, 0.5u) while our track record is empty. Stakes never go above 1u.
- 5If a team has no rating, or the edge is too small, we publish “No bet” with the reason. We never guess a probability.
- 6A published tip cannot be edited or deleted. A correction is a new tip, and both stay visible.
What the backtest says
Walk-forward test on 12 European leagues: every match is predicted using only earlier matches, and the numbers below come from seasons the model never saw (2024/25 to 2026/27, 5 818 matches with Pinnacle odds). Log-loss measures how good the probabilities are: lower is better. The market column is Pinnacle’s odds with the margin removed, the sharpest price of the day.
| Version | Log-loss | vs market close | Bets at 3 pp edge | ROI | EV at close |
|---|---|---|---|---|---|
| poisson-dc-2 Goals and shots on target | 0.9859 | +0.0197 | 3134 | -16.5% | -4.5% |
| poisson-dc-1 Goals only | 0.9873 | +0.0211 | 3098 | -17.5% | -4.8% |
| Pinnacle, opening odds | 0.9692 | ||||
| Pinnacle, closing odds | 0.9662 | ||||
- • The model is well calibrated, but the market is better in every one of the 12 leagues.
- • Mixing the model into the market’s odds never helps: the best weight for the model is 0. It adds no information the odds do not already have.
- • Betting where the model disagrees with the odds would have lost money in the backtest, and bigger disagreements did not do better. That is why every tip carries the minimum confidence and stake.
- • The real test is the live record below. It is the only number that can change this page.
Where the data comes from
“In use” feeds the model or the live pages. “Daily analysis” means a person reads it for the reasoning on a tip, and it does not change the probability yet. A source only enters the model as a new version, after a backtest.
| Source | What it gives us | Status |
|---|---|---|
| livescore.cz | Fixtures, live scores, Tipsport 1X2 odds; after full time, events, statistics and line-ups | in use |
| football-data.co.uk | Past results, shots, opening and closing odds (Pinnacle, Bet365 and others)Fits the model; also the backtest | in use |
| Understat | Expected goals (xG) of every team and match, top five leaguesRead by hand for the rationale; not in the model yet | daily analysis |
| SofaScore | Injuries and suspensions, probable line-ups, form, standings, head-to-headRead by hand for the rationale; not in the model yet | daily analysis |
| FBref | League tables, form, scorersRead by hand for the rationale | daily analysis |
| FotMob | Line-ups, xG, injuries | daily analysis |
| WhoScored | Previews with missing players and formIts terms forbid automated access | not used |
How we will adjust it
- 1Wait for at least 50 settled tips before changing anything. Fewer than that is noise.
- 2Look at calibration first: when the model says 40%, does it happen about 40% of the time? If not, the probabilities are wrong, not just unlucky.
- 3Then look at the size of the edge: the backtest says big gaps between the model and the market are the least reliable. If the 10 pp and above band loses more, raise the ceiling or cut the stake there.
- 4Then closing line value: tips that keep beating the closing odds are a better sign than profit, which is noisy.
- 5Change one thing, give it a new version name, repeat the backtest, and only then use it. The old version and its results stay on this page.
What we can change
- • The minimum edge to publish (now 2 pp) and a ceiling for suspiciously large gaps
- • Confidence and stake rules, once there is a record to base them on
- • The model’s settings: half-life, shrinkage, weight of shots
- • Which leagues get tips, and which markets
What we do not do
- • Change a published tip, or remove a lost one
- • Move results from one version to another
- • Promise profit: the backtest does not support it
Changelog
- 2026-10-16poisson-dc-2 becomes the active version: ratings learn from half goals, half shots on target. Slightly better in the backtest, still behind the market.
- 2026-10-16All model tips are published and visible, with confidence 1 and stake 0.5u while the record is empty.
- 2026-10-15poisson-dc-1, the first version, goes live. The backtest shows it does not beat the market, and we publish that.