One of the highest-turnover football markets is deceptively simple: will the total goals in a match go over or under 2.5? Where does that line come from, and what is the "fair" probability of each side?
Here's the full derivation, with numbers you can reproduce from one formula.
Step 1: goals are (approximately) Poisson
A team's goal count in a match can be approximated by a Poisson distribution:
P(X = k) = λ^k · e^(−λ) / k!
where λ is the team's expected goals (estimated from recent attack strength, opponent defense, home/away). Two independent Poisson variables sum to a Poisson with λ = λ_home + λ_away — convenient.
Step 2: worked example
Say λ_home = 1.45, λ_away = 1.10 → match λ = 2.55. "Under 2.5" means 0, 1, or 2 total goals:
import math
lam = 2.55
p = [math.exp(-lam) * lam**k / math.factorial(k) for k in range(3)]
print([f"{x:.4f}" for x in p]) # ['0.0781', '0.1991', '0.2539']
print(f"under 2.5: {sum(p)*100:.1f}% over 2.5: {(1-sum(p))*100:.1f}%")
# under 2.5: 53.1% over 2.5: 46.9%
Step 3: the line moves fast with λ
Same 2.5 line, very different probabilities:
| match λ | under 2.5 | over 2.5 | scenario |
|---|---|---|---|
| 2.0 | 67.7% | 32.3% | defensive grind |
| 2.55 | 53.1% | 46.9% | league average |
| 2.8 | 46.9% | 53.1% | attacking matchup |
| 3.2 | 38.0% | 62.0% | mismatch / open game |
λ moving from 2.0 to 3.2 swings the over from 32.3% to 62.0% — estimating λ well is the entire game. How we do time-decayed λ estimation is in our Dixon-Coles write-up.
Why 2.5 and not 2 or 3?
- The long-run average lives there. Top-league historical averages sit around 2.5–2.8 total goals, so 2.5 splits the market near 50/50.
- Half-lines can't push. A line of 2 or 3 produces exact-landing pushes (stakes refunded). 2.5 always resolves — clean for the book and for modeling.
Where plain Poisson fails (honesty section)
- It under-predicts 0-0 and 1-1. Real low-scoring draws exceed Poisson expectations — the reason Dixon-Coles adds a low-score correction term. We apply it.
- Goals aren't independent. Teams leading shut up shop; teams trailing push. In-play λ shifts.
- λ is an estimate. Injuries, weather, motivation (relegation battle vs. mid-table) all move the true value.
Our pipeline: Poisson backbone → Dixon-Coles low-score correction → cross-check against market odds (how we remove the vig) → nightly recalibration. When model and market disagree beyond a threshold, we log it as a research event — not a tip.
Full Traditional-Chinese long-read with the complete tables: 大細球 2.5 的數學. All numbers in this post were verified by actually running the code shown.
Statistical research and education only — not betting advice. 18+. If gambling stops being fun, seek help (HK Ping Wo Fund: 1834 633).
Top comments (0)