Rating target is α·goals + (1−α)·xG. Cross-validation picks α≈0.25–0.4 in every tournament (2018, 2022, 2026), with a flat basin — but both endpoints always lose, and the optimizer always shrinks scorelines harder than xG. The τ shown is the CV-tuned prior width at the current α.
Columns: xGF/90 = μ·eatt, expected goals scored vs an average team; xGA/90 = μ·e−def, expected goals conceded vs an average team. Their gap vs μ is the attack/defense breakdown in goal units. Extra-time games are normalized to 90′; shootout goals are excluded (decided games use the 120′ scoreline). Click any team for its match log with model retrodictions.
Each dot is a team: x = xG-only rating, y = goals-only rating. The dotted line is the OLS fit of goals-only on xG-only (goals-only ratings are more shrunken, so the slope is <1 — comparing to y=x would tag every strong team as cold). Hot/cold = residual beyond ±1σ from that line; same rule drives the chips in the table.
Pick any two teams; probabilities use the current preset/slider fit (per 90′, independent Poissons).
Each team carries a probability density over percentiles (0 = worst, 1 = best), starting uniform and updated by every scoreline through an opponent-aware likelihood kernel. The dot is the expected percentile; the curve is the full posterior — wide = still uncertain. Beta/Bernstein framework; tournament results only, no xG.
Realized win-probability movement per game (sum of squared 5-minute changes across the regulation-time W/D/L betting markets), against its pregame expectation (the tick) — a martingale invariant. Bars past the tick ran hotter than priced. Swing (Brier, squared change) rewards outcome flips; Surprise (KL, in bits) weights leaving a near-certain state more — so comebacks from long odds rank higher. Advance swing is the same Brier swing, just measured on the binary who-advances market (which runs through extra time & penalties) instead of the ternary W/D/L — so knockout drama that only resolves in ET/PKs still shows up.