How the Model Works
Every probability on this site comes from the same source: a Dixon-Coles calibrated Poisson model. Here is exactly how it works, what the numbers mean, and where the model is weakest.
1. Poisson Goal Scoring
Goals in football follow a Poisson distribution — they arrive at a roughly constant rate, independently of each other. If we expect a team to score an average of λ goals, the probability of scoring exactly k goals is:
We calculate a separate λ for each team (home xG, away xG) and convolve the two distributions to get a full probability grid of every possible scoreline from 0-0 to 5-5. From that grid we can read off 1X2 probabilities, over/under lines, BTTS, Asian handicap — every market you see.
2. Dixon-Coles Correction
The standard Poisson model over-predicts 0-0 and 1-0 scorelines relative to real football data. Dixon & Coles (1997) introduced a correction factor ρ that adjusts the joint probability of low-scoring results:
τ(1,0) = 1 + ρ · λ_A
τ(0,1) = 1 + ρ · λ_H
τ(1,1) = 1 − ρ
We use ρ = −0.11, calibrated to World Cup historical data. This slightly reduces the probability of 0-0 and 1-1 draws and increases 2-0, 2-1 etc, which better reflects real tournament football.
3. Attack & Defense Strength Ratings
Each team gets an attack rating and a defense rating derived from their goals scored and conceded per game relative to the tournament average. A rating of 1.0 is exactly average.
defense = (GA per game) / (tournament avg goals per game)
λ_home = attack_H × defense_A × avg_goals
λ_away = attack_A × defense_H × avg_goals
A high attack rating means a team scores more than average. A high defense rating means they concede more than average (so a low defense rating = good defense). The expected goals for each team is then their attack strength times the opponent’s defensive weakness times the baseline tournament scoring rate.
| Team | GP | GF | GA | Attack ↑ | Defense ↓ | xG Proj (vs avg) |
|---|---|---|---|---|---|---|
| Germany | 1 | 7 | 1 | 4.40 | 0.63 | 4.40 – 0.57 |
| Sweden | 1 | 5 | 1 | 3.15 | 0.63 | 3.15 – 0.57 |
| United States | 1 | 4 | 1 | 2.52 | 0.63 | 2.52 – 0.57 |
| Norway | 1 | 4 | 1 | 2.52 | 0.63 | 2.52 – 0.57 |
| England | 1 | 4 | 2 | 2.52 | 1.26 | 2.52 – 1.13 |
| Canada | 2 | 7 | 1 | 2.20 | 0.31 | 2.20 – 0.28 |
| France | 1 | 3 | 1 | 1.89 | 0.63 | 1.89 – 0.57 |
| Argentina | 1 | 3 | 0 | 1.89 | 0.00 | 1.89 – 0.00 |
| Austria | 1 | 3 | 1 | 1.89 | 0.63 | 1.89 – 0.57 |
| Colombia | 1 | 3 | 1 | 1.89 | 0.63 | 1.89 – 0.57 |
| Switzerland | 2 | 5 | 2 | 1.57 | 0.63 | 1.57 – 0.57 |
| Australia | 1 | 2 | 0 | 1.26 | 0.00 | 1.26 – 0.00 |
| Netherlands | 1 | 2 | 2 | 1.26 | 1.26 | 1.26 – 1.13 |
| Japan | 1 | 2 | 2 | 1.26 | 1.26 | 1.26 – 1.13 |
| Iran | 1 | 2 | 2 | 1.26 | 1.26 | 1.26 – 1.13 |
| New Zealand | 1 | 2 | 2 | 1.26 | 1.26 | 1.26 – 1.13 |
| Croatia | 1 | 2 | 4 | 1.26 | 2.52 | 1.26 – 2.27 |
| Mexico | 2 | 3 | 0 | 0.94 | 0.00 | 0.94 – 0.00 |
| Czechia | 2 | 2 | 3 | 0.63 | 0.94 | 0.63 – 0.85 |
| South Korea | 2 | 2 | 2 | 0.63 | 0.63 | 0.63 – 0.57 |
| Bosnia-Herzegovina | 2 | 2 | 5 | 0.63 | 1.57 | 0.63 – 1.42 |
| Brazil | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Scotland | 1 | 1 | 0 | 0.63 | 0.00 | 0.63 – 0.00 |
| Morocco | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Paraguay | 1 | 1 | 4 | 0.63 | 2.52 | 0.63 – 2.27 |
| Ivory Coast | 1 | 1 | 0 | 0.63 | 0.00 | 0.63 – 0.00 |
| Curaçao | 1 | 1 | 7 | 0.63 | 4.40 | 0.63 – 3.96 |
| Tunisia | 1 | 1 | 5 | 0.63 | 3.15 | 0.63 – 2.83 |
| Belgium | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Egypt | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Uruguay | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Saudi Arabia | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Senegal | 1 | 1 | 3 | 0.63 | 1.89 | 0.63 – 1.70 |
| Iraq | 1 | 1 | 4 | 0.63 | 2.52 | 0.63 – 2.27 |
| Jordan | 1 | 1 | 3 | 0.63 | 1.89 | 0.63 – 1.70 |
| Portugal | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Uzbekistan | 1 | 1 | 3 | 0.63 | 1.89 | 0.63 – 1.70 |
| Congo DR | 1 | 1 | 1 | 0.63 | 0.63 | 0.63 – 0.57 |
| Ghana | 1 | 1 | 0 | 0.63 | 0.00 | 0.63 – 0.00 |
| South Africa | 2 | 1 | 3 | 0.31 | 0.94 | 0.31 – 0.85 |
| Qatar | 2 | 1 | 7 | 0.31 | 2.20 | 0.31 – 1.98 |
| Haiti | 1 | 0 | 1 | 0.00 | 0.63 | 0.00 – 0.57 |
| Türkiye | 1 | 0 | 2 | 0.00 | 1.26 | 0.00 – 1.13 |
| Ecuador | 1 | 0 | 1 | 0.00 | 0.63 | 0.00 – 0.57 |
| Spain | 1 | 0 | 0 | 0.00 | 0.00 | 0.00 – 0.00 |
| Cape Verde | 1 | 0 | 0 | 0.00 | 0.00 | 0.00 – 0.00 |
| Algeria | 1 | 0 | 3 | 0.00 | 1.89 | 0.00 – 1.70 |
| Panama | 1 | 0 | 1 | 0.00 | 0.63 | 0.00 – 0.57 |
Attack ↑ = higher is better · Defense ↓ = lower is better · refreshes every 5 min from ESPN
4. Closing Line Value (CLV)
CLV is the gold standard metric for evaluating betting skill. It measures whether your price was better than the closing market price — which, after removing vig, represents the sharpest collective estimate of true probability.
De-vig: implied(home) = (1/homeOdds) / (1/homeOdds + 1/drawOdds + 1/awayOdds)
Positive CLV means the model found value the market hadn’t fully priced in at closing. Sustained positive CLV across a large sample is the strongest evidence of genuine edge. Negative CLV means the market was sharper than the model on that outcome.
5. Kelly Staking & Bankroll Simulation
The Kelly Criterion tells you the optimal fraction of your bankroll to bet to maximise long-run growth, given your perceived edge:
We use ¼ Kelly (25% of the full Kelly fraction) for all simulations and recommendations. Full Kelly is theoretically optimal but very volatile — most professional bettors use half or quarter Kelly to reduce variance while retaining most of the growth benefit. We also cap any single bet at 5% of bankroll.
6. Where the Model Is Weakest
- Early group stage: strength ratings based on 1-2 games are very noisy
- Knockout rounds: single-elimination changes incentives; tournament fatigue matters
- Injuries & suspensions: the model doesn’t read team news; market prices often do
- Penalties: all markets exclude knockout penalty shootouts; these are ~50/50 regardless
- Home advantage: not modelled (no true “home” team at a neutral tournament)
- Weather & altitude: we display altitude badges but don’t adjust λ values for them