Number of games in the sample window. Use last 6–15 games for best results. More games = higher model confidence.
Total goals scored by this team across the MP window. Used to estimate the team's attack rating relative to the league average.
Total goals conceded across the MP window. Used to estimate the team's defence rating. Lower = stronger defence.
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.
PPGScore = tanh(pts/mp − 1.35) — "are results better than a 1.35 PPG average lately?"
GFScore = tanh((recentGFRate − seasonGFRate) / seasonGFRate) — "are they scoring more than their season baseline?"
FormIndex = 65% × PPGScore + 35% × GFScore
FormMult = 1 + FormIndex × 0.12 → range (0.88, 1.12)
Defensive Form (separate channel) compares recent GA rate vs season GA baseline and is applied to the opponent's lambda — not the team's own attack. This keeps attack and defense form signals on completely separate inputs with zero shared data.
Sample-size confidence ramps — both signals scale up gradually: attack form reaches full weight at 6 games, defensive form at 8 games (it's noisier). A 2-game sample contributes ~33% / 25% of face value respectively — consistent with the same pattern used for rho/tau calibration.
Combined cap — the attack FormMult and defensive multiplier are combined, then hard-clamped to ±20% of baseline (ADJ_CAP), so no single match's form can swing a lambda more than 20%.
lgNeutral = (lgH + lgA) / 2
homeAdv = lgNeutral / lgH
For symmetric leagues (lgH = lgA = 1.65, as in the WC preset), homeAdv = 1.0 — no change. For asymmetric leagues (lgH=1.50, lgA=1.20), homeAdv ≈ 0.90 — the home team's lambda is reduced by ~10%.
Use for: cup finals, playoff legs at neutral venues, international tournaments. The WC 2026 section enables this automatically.
The model blends these into the qualification baseline at 2× weight — each WC game counts as two qualification games. The rationale: tournament matches are higher-stakes, current-form, and same-competition data; they should carry more weight than a friendly from 8 months ago.
effectiveGF = qualificationGF + (wcGF × 2)
effectiveMP = qualificationMP + (wcMP × 2)
Leave blank to use qualification data only. The fields are saved across sessions so you don't need to re-enter them.
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 (v3) — 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) / calibMax) ^ 0.85. For standard league matches, full calibration is reached at 18 games. For cup matches (toggle the Cup match checkbox in League Avg Inputs), full calibration is reached at 10 games, reflecting the smaller typical cup sample. At 5 games confidence≈34%, at 10 games≈61%, at 16 games≈91%, at 18 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 — When FH GF data is entered for both teams, the model derives the actual goal-timing split from the data (e.g. 41% FH / 59% SH) rather than assuming a fixed 43/57 split. Falls back to 43/57 if FH data is absent. This makes FH predictions more accurate for leagues or teams that deviate from the average (high-press sides score earlier; low-block sides concede later).
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.
The EV Finder covers 11 markets: 1X2 (Home/Draw/Away), Over/Under 1.5, Over/Under 2.5, Over/Under 3.5, BTTS Yes/No. Enter the bookmaker's decimal odds for any market to see EV instantly. Rows highlighted in blue indicate >3% edge; 🔥 badge indicates >7% edge.
The Combo Market in the probability bars shows BTTS Yes × Over 2.5 as a joint probability — a popular accumulator leg that isn't directly priced by most bookmakers but can be derived by multiplying the individual prices.
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.
Team Database — All 48 qualified teams are pre-loaded with stats compiled from their respective qualification campaigns (CONMEBOL 18-game qualifying, UEFA qualifying + Nations League, CAF, AFC R3, CONCACAF R3, and intercontinental playoffs). Select any team from the World Cup 2026 dropdown to auto-fill.
Neutral Venue Settings — WC matches are played at neutral venues. The model sets lgH = lgA = 1.65 goals/game (based on WC 2026 group stage pace) and homeAdv = 1.0, eliminating home advantage asymmetry. This is the correct setting for tournament football.
Group Stage vs Knockouts — Group stage matches tend to be more open (teams chasing qualification); knockout matches are tighter (elimination pressure, more conservative tactics). Consider adjusting league averages slightly downward (e.g. 1.10/1.10) for semi-finals and finals where both teams play cautiously.
Intercontinental teams — DR Congo, Bahrain, and Curaçao are making rare or debut World Cup appearances. Their stats are based on qualification data but treat model confidence accordingly — smaller competitive sample sizes mean higher uncertainty.
Tournament starts: June 11, 2026 · Final: July 19, 2026 · MetLife Stadium, New Jersey.
✉️ kipvic@yahoo.com WhatsApp: (+254) 794 755 670 📞 (+254) 794 755 670