| Team | Games Played | Goals Scored | Goals Conceded |
|---|---|---|---|
| Team | ⚽ GF L5 | 🥅 GA L5 | 🏆 PTS L5 | Form | State |
|---|---|---|---|---|---|
| HOME | — |
|
|||
| AWAY | — |
|
Step 1 — Full Match Stats: Enter both team names, the number of games played (last 6–15 recommended), total goals scored and goals conceded for that period.
Step 2 — 1st Half Stats (Optional): Tap the [+ 1st Half Stats] button to reveal the half-time inputs. Enter goals scored & conceded in the 1st half only. 2nd half values are automatically calculated as Full Time minus 1st Half — no extra entry needed.
Step 3 — League Averages: By default, Home avg = 1.50 and Away avg = 1.20 goals/match. Toggle Advanced if you want to override these for a specific league (e.g. EPL, Serie A).
Step 4 — Calculate: Hit ⚡ Calculate Predictions. Your most likely score, confidence meter, and all market probabilities will be generated across all tabs.
Step 5 — EV Finder: Navigate to the EV Finder tab and enter bookmaker odds to instantly identify positive expected value (+EV) bets.
New Match: Press the subtle ⊕ NEW button above the team statistics table to clear all fields and start fresh.
Enter team data on the Inputs tab and press Calculate.
Enter team data on the Inputs tab and press Calculate.
Calculate predictions first, then enter bookmaker odds to find value bets.
Dixon-Coles (DC) — the foundation. Models each team's goals as an independent Poisson process, then applies a τ (tau) correction to the four low-score cells (0–0, 1–0, 0–1, 1–1) which plain Poisson systematically underestimates.
Bivariate Poisson — an extension that adds a covariance term ρ (rho) to model the positive correlation between both teams' scoring. Open, high-scoring games tend to produce goals for both sides — Bivariate Poisson captures this structural dependency that independent Poisson misses.
Both models are blended adaptively: ρ and τ are calibrated together using league GPG and matches played via getCorrelationParams(leagueGPG, minMP). The top-right badge always shows the live values.
Bivariate Poisson adds a covariance parameter ρ (rho):
P(h,a) = Σk [ Poisson(k,λ₃) × Poisson(h−k,λ₁) × Poisson(a−k,λ₂) ]
where λ₃ = ρ√(λH·λA) captures shared scoring momentum.
Effect on outputs: Bivariate raises BTTS Yes probability slightly, raises scorelines like 2–2 and 3–2, and marginally lowers clean-sheet probabilities — all in the correct direction for open attacking matches.
When it activates: ρ scales in smoothly from game 1 using the league GPG context. High-scoring leagues (Bundesliga, Eredivisie) get a lower ρ base since goals are already baked into the lambdas; low-scoring leagues (Serie A) get a higher ρ base to capture their tighter score correlation patterns.
eloFactor = 10^((HomeElo − AwayElo) / 400)
Capped at ±20% effect on lambdas. A 200-point gap (mid-table vs top-4) gives approximately ×1.12 / ×0.89.
Sources: club-elo.com (European clubs) · eloratings.net (international) · FIFA Ranking · Leave blank to skip.
blendedRate = 70% × recent(per game) + 30% × season(per game)
This blended rate feeds into Bayesian shrinkage, then into the attack/defence ratings. It answers: how many goals is this team scoring per game right now?
Form multiplier (L5 PTS) captures win/loss momentum as a separate signal:
FormMult = 1 + 0.15 × tanh((pts_L5 − 7.5) / 5) → range (0.85, 1.15)
It answers: are results trending up or down regardless of scorelines?
Why pts-only for FormMult? Using GD in FormMult would double-count the same L5 GF/GA that already shifted the lambda base via recency weighting — inflating hot teams by up to +65% over baseline. By keeping the two signals on separate data (GF/GA → rate estimation; PTS → momentum), each adjustment is independent and additive rather than compounding.
The GD from L5 is still shown in the form index display for context.
1. Bayesian Shrinkage — Attack and defence ratings are shrunk toward the league average using an 8-game prior. A team with 4 games and 12 goals is rated closer to 2.0 goals/game (not 3.0) — preventing extreme early-season overreaction.
2. League-average fallback — If inputs produce an invalid lambda, the model falls back to lgH/lgA (league average) rather than 0.5, giving a sensible neutral estimate.
3. Decoupled form multiplier (v2.3) — FormMult is driven by L5 points only (range ×0.85–×1.15), keeping it structurally independent from the L5 GF/GA used in recency weighting. This eliminates double-counting of recent scoring. GD context is shown in the form index label but does not affect the multiplier.
4. Confidence bands — Model confidence is classified as LOW (<50%), MEDIUM (50–80%), or HIGH (>80%) based on matches played, so users know when to trust the output.
5. Dynamic matrix size — The score matrix expands automatically for high-scoring teams: maxGoals = max(10, ceil(λH + λA + 5)), capturing more tail probability instead of clipping at a fixed ceiling.
leagueGPG = lgH + lgA — the total goals per game context of the league. Higher GPG (Bundesliga, Eredivisie) → lower rho and tau base values, because open high-scoring leagues have less low-score clustering. Lower GPG (Serie A, Ligue 1) → higher base values.
Confidence curve — both parameters scale together from game 1 using: confidence = (min(homeMP, awayMP) / 15) ^ 0.85. This smooth power curve reaches full calibration at 15 games. At 5 games confidence≈39%, at 10 games≈71%, at 15 games=100%.
Why both parameters together? — A high-scoring league not only needs less bivariate covariance (ρ) but also less DC low-score correction (τ), because 0-0 and 1-0 results are genuinely rarer. Calibrating them independently would be inconsistent.
The live ρ, τ, and confidence % are always shown in the top-right badge and Results context bar after you calculate.
1. FH/SH League Baselines — FH uses 43% of lgH/lgA; SH uses 57%. These reflect the lower-scoring nature of each period.
2. Recency Blending — L5 full-match recent rates are scaled proportionally (×0.43 for FH, ×0.57 for SH) and blended 70/30 with the season FH/SH rate. A team that has been pressing aggressively in recent games will show in FH lambda too.
3. Bayesian Shrinkage — FH/SH samples are smaller than FT, so shrinkage toward the league baseline is even more important here. Same 8-game prior as FT.
4. Attack/Defence Ratings — Same cross-division formula as FT (hFHAtt = fhGFRate / lgFHH; hFHDef = fhGARate / lgFHA).
5. Elo Adjustment — Applied to FH and SH lambdas. Stronger teams tend to dominate first halves too.
6. Decoupled Form Multiplier — The same pts-only FormMult from the FT pipeline is applied. No separate FH form system needed.
7. Standard Dixon-Coles (no Bivariate) — FH/SH use DC with tau correction only (rho=0). FH/SH score distributions are much tighter, so the Bivariate covariance term is not needed.
2nd half goals are auto-derived as Full Time minus 1st Half.
No highlight — edge between 0–3%. Marginal value, within typical model variance.
Blue highlight — edge >3%. Meaningful value worth considering.
🔥 Strong badge — edge >7%. Strong value signal — the model sees a significant mispricing.
These thresholds are guides, not guarantees. Always consider sample size and context.