Knockout & Tournament Modelling

Overview

A Poisson model produces 90-minute scoreline probabilities. That is exactly what the main betting market (1X2, "full-time result") prices — including in knockout matches, where the draw is a real 1X2 outcome even though someone must advance. Once the model is asked about advancement, outright winners, or group standings, three new layers appear: extra time, penalty shootouts, and tournament structure.

1X2 vs to-qualify

Two distinct markets, two distinct quantities:

  • 1X2 — result after 90 minutes. Use the scoreline matrix directly; no change from group-stage logic.
  • To qualify / to advance — P(advance) = P(win in 90) + P(draw in 90) × P(win ET+pens | draw)

Mixing these up is a classic settlement error: a team that wins on penalties did not win the 1X2 market.

Extra time and penalties

Extra time is 30 minutes at a lower per-minute scoring rate than regulation (fatigue, caution — empirically roughly 10–20% below regulation rate). A serviceable model: rerun the Poisson with λ_ET ≈ λ_90 × (30/90) × 0.85 for each team, conditioned on the match being level. From the ET scoreline matrix, the diagonal goes to penalties.

Penalty shootouts are close to a coin flip. Empirical studies find no robust team-strength effect and only weak order effects. Default P(win pens) = 0.5; refinements (shootout records, goalkeeper quality) are v3 territory at best.

Putting it together for evenly matched teams: if P(draw in 90) ≈ 0.28, then P(advance) ≈ P(win90) + 0.28 × (P(win ET) + P(ET draw) × 0.5). With symmetric teams this collapses to 0.5 each, as it must.

World Cup 2026 format

First edition with 48 teams: 12 groups of 4, then a 32-team knockout (top two per group + the 8 best third-placed teams). 104 matches total. Modelling consequences:

  • Best-thirds rule couples the groups — whether a third-placed team advances depends on other groups, so advancement probabilities require simulating all groups jointly, not one group at a time
  • Tie-breakers within groups: points → goal difference → goals scored → head-to-head → fair play → drawing of lots; the simulator must implement these to get standings right
  • Dead rubbers and rotation: a team already qualified often rotates in match 3 — a real effect the base model won't capture; at minimum flag such matches in EV reports rather than trusting the model edge
  • Bracket asymmetry: knockout paths differ greatly in difficulty; outright-winner probabilities are path-dependent and only obtainable by simulation

Monte Carlo tournament simulation

The standard architecture on top of any per-match model:

import numpy as np

def simulate_tournament(model, fixtures, n_sims=20_000, rng=None):
    """fixtures: remaining schedule + bracket logic. model.match_probs(a, b, neutral) -> (pW, pD, pL).
    Returns advancement / winner frequencies per team."""
    rng = rng or np.random.default_rng()
    counters = {}
    for _ in range(n_sims):
        # 1. simulate remaining group matches by sampling scorelines
        #    (sample from the Poisson scoreline matrix, not just W/D/L,
        #     because tie-breakers need goal difference and goals scored)
        # 2. compute group tables incl. tie-breakers; rank third-placed teams
        # 3. fill the round-of-32 bracket per the official slotting rules
        # 4. simulate knockouts: 90-min matrix; if level, ET matrix; if level, coin flip
        # 5. tally: group winner, advance, reach QF/SF/F, champion
        ...
    return counters

Key disciplines: sample scorelines, not outcomes (tie-breakers need goals); freeze the model parameters at simulation time (no peeking); and use enough sims that the probabilities you bet on have Monte Carlo error well below your edge (20k sims gives ~±0.3pp at p=0.5).

This also gives the tournament-level markets for free: group winner, to reach the quarter-final, outright winner — all of which can be compared against bookmaker futures and Polymarket prices for expected-value-ev screening.

Pitfalls

  • Settling to-qualify logic against 1X2 odds — bookmaker knockout 1X2 prices include the draw; don't "correct" the model's draw away
  • Reusing 90-minute λ for extra time unscaled — overstates ET goals and understates shootouts
  • Ignoring group coupling via best-thirds — per-group simulation silently miscalculates advancement in 2026's format
  • Static strengths across a 5-week tournament — injuries, suspensions, and form shifts accumulate; refresh inputs between rounds
  • Trusting model edge in dead rubbers — rotation breaks the team-strength assumption; filter or down-weight these in value-bet output

See Also