Completed moves
1,502,179
passes + carries, open play
Goal-mouth cell value
0.266
P(goal this possession)
Own-half average
0.004
61× less than the goal-mouth
Sweeps to converge
36
to Δ < 10⁻⁵, pooled grid

The threat surface

This is the whole model in one picture. Each cell’s shade is its expected threat: the chance that a team in possession there goes on to score in this possession — by shooting now, or by moving the ball somewhere better and continuing the chain. Hover or use the arrow keys to inspect a cell; flip on the flow field to see the single best onward move from every square of the pitch.

Expected threat, cell by cell

cell labels: chance of scoring this possession, % · own goal left, attacking right

Hover a cell, or focus the map and use arrow keys.

    All 192 cell values as a table

    The surface obeys football’s geometry without being told to: value rises monotonically toward the goal you are attacking, hugs the centre of the box, and collapses to almost nothing behind the halfway line. The central goal-mouth cell is worth 0.266; its neighbour one cell out is already down to 0.111, and the average own-half cell is worth 0.004.1

    The flow field asks each cell a sharper question: of all the places a completed pass or carry from here actually goes, which one raises the possession’s value most? 191 of 192 cells have an answer. The exception is the central goal-mouth cell, where no onward move beats the alternative — the model’s advice there is simply shoot (players agree: 84.2% of recorded actions from that cell are shots). From the goal-line cell beside it, the best option is a low cutback into it, worth +0.187.

    1 Shot probability, move-success rate, per-shot xG and action counts in the tooltip always come from the pooled grid’s auxiliary surfaces; the flow field is likewise computed on the pooled grid. Switching corpus swaps only the xT values.

    Watching threat ripple backward

    Value iteration starts from zero and repeatedly applies one rule: a cell is worth shoot now plus move and continue. Sweep 1 knows only about immediate shots, so just the box glows. Each further sweep lets the model see one more action into the future, and value bleeds backward from the goal — through the channels, out to the wings, over the halfway line.

    1

    Reduced motion is on — drag the slider to step through the sweeps.

    The surface, sweep by sweep

    cell labels: chance of scoring within n actions, % · pooled grid

    Source: StatsBomb open data · pooled grid, n = 1,502,179 moves · sweep 1 and the fixed point are exact; intermediate frames interpolate on the recorded convergence schedule2 · computed by pipeline/model_expected-threat.py

    Convergence is geometric

    max |ΔxT| across all 192 cells per sweep · log scale · pooled grid

    All recorded sweep deltas as a table
    Source: value-iteration log, pooled grid · first 20 sweeps recorded; tolerance 10⁻⁵ reached at sweep 36 · computed by pipeline/model_expected-threat.py

    Sweep 1’s biggest update is 0.2449 — exactly the goal-mouth cell’s shoot-now payoff (0.842 shot probability × 0.291 xG per shot). After that the largest per-sweep change decays geometrically at a ratio of roughly 0.86, crossing the 10⁻⁵ tolerance at sweep 36 on the pooled grid (32 for club 2015/16, 43 for the sparser international corpus). Because the update is affine, the same answer drops out of one linear solve: the iterated surface matches (I − diag(m)·T)⁻¹(s⊙g) to within 4.6×10⁻¹⁰.

    2 The animation’s first frame is the exact shoot-now surface s⊙g and its last frame is the exact fixed point; the frames between interpolate each cell along the model’s recorded max-Δ decay schedule, since the 192×192 transition matrix is not shipped to the browser. The convergence chart above is the unmodified per-sweep record.

    The Özil proof

    Credit every completed pass and carry with the change in surface value between its start and end cell, sum by player, and the model re-runs an old verdict: Mesut Özil was the Premier League’s 2015/16 creator-in-chief with 18.37 xT over 4,119 completed moves — the same player Karun Singh’s original 2018 post crowned. Pick a competition, sort the table, and click a player to draw their three most valuable moves.

    # Player Team Moves xT added xT net xT /100

    Top three moves

    arrows: completed moves, labelled with ΔxT · attacking right

      • Pass
      • Carry
      Source: StatsBomb open data · ΔxT on the pooled grid

      Özil wins on volume; Dimitri Payet (15.03 xT) ran him close on half a season less of the ball, at a far higher rate — 0.60 xT per 100 moves to Özil’s 0.45. In Spain the same year, Neymar (18.54) out-created Messi (14.71). And the single most valuable completed move in all 990 matches belongs to neither: Marco Asensio — a 19-year-old on loan at Espanyol — swept a cross-box ball from (79.5, 77.1) to (113.9, 43.7) against Atlético Madrid, worth +0.257 xT on its own.

      The tournament tables tell the same story in miniature: at the 2022 World Cup Antoine Griezmann (3.19 xT) out-created both Messi (2.46) and Mbappé (2.05); at Euro 2024 a 16-year-old Lamine Yamal led every player at the tournament with 2.50 xT from just 399 moves (0.63 per 100).

      3 Following Karun’s original, the headline “xT added” clips negative moves to zero; the “xT net” column keeps them (honest accounting for backward passes). All attribution uses the pooled surface so players are comparable across competitions. The per-100 view requires at least 200 completed moves.

      One geometry, two eras

      Fit the surface twice — once on 1.11 million moves of 2015/16 club football, once on 200 thousand moves of international football from 2022–24 — and you get, to a remarkable degree, the same map. The rank correlation between the two grids is Spearman 0.998. Where danger lives is a property of the game itself, not of an era or a level.

      Spearman ρ
      0.998
      rank correlation, 192 cells
      RMSE
      0.0023
      in xT units
      Final-third ratio
      ×1.024
      international vs club
      Move completion
      88.8%
      international · club: 84.0%

      Where the two surfaces disagree

      per-cell difference, international 2022–24 minus club 2015/16 · xT units · own goal left, attacking right

      Hover a cell, or focus the map and use arrow keys.

        All 192 cell differences as a table
        Source: StatsBomb open data · club n = 1,112,262 moves · international n = 199,641 moves · computed by pipeline/model_expected-threat.py
        The five most divergent cells
        Cell (col, row) Zone Club xT Intl xT Δ

        The two corpora are not the same football: international sides in 2022–24 completed 88.8% of their moves against 84.0% in 2015/16 club play. Yet the surfaces differ by an RMSE of just 0.0023, and every one of the five most divergent cells sits on or beside the goal-line, where shot samples are thinnest. The one systematic wrinkle: the international final third runs about 2.4% hotter overall (ratio ×1.024) — tidier ball retention makes advanced territory slightly more valuable, without moving where that territory is.

        Method and caveats

        Corpora: Premier League 2015/16 and La Liga 2015/16 (380 matches each), World Cups 2018 and 2022 (64 each), Euros 2020 and 2024 (51 each) — 990 matches, 23,464 open-play shots. Grid indexing follows StatsBomb axes: columns run left to right toward the goal being attacked at x = 120; row 1 is the top touchline.