Touchline Intelligence
Loading live model data…
The page reads the model API on every request, so the first paint waits for the real numbers rather than showing placeholders.
Touchline Intelligence
The page reads the model API on every request, so the first paint waits for the real numbers rather than showing placeholders.
An expected-goals model on pinned StatsBomb event data, evaluated under locked tournament splits and served with its evidence attached.
Read from the model API on this request, not restated from a build-time snapshot.
The model estimates how likely a recorded, non-penalty shot is to become a goal. It was trained on a pinned StatsBomb Open Data snapshot: 230 matches, 843,050 recorded events, 5,606 modeled shots across four international tournaments.
It is an independent Touchline Intelligence model, not StatsBomb's proprietary xG. The ingest strips provider xG before anything reaches storage, so it can never quietly become a feature.
The model is the visible part. The lifecycle around it is what makes its numbers mean anything.
465 hashed StatsBomb event files at one fixed commit. Reproducibility starts with a source revision that cannot move.
Ordered migrations load the snapshot into normalized PostgreSQL. Missing optional values stay missing, and provider xG is excluded by a database constraint.
Shot geometry and recorded context feed an L2-regularized logistic model. Gradient boosting and a small neural network got a fair run under the same locked protocol and did not beat it.
A content-hashed serving bundle runs behind FastAPI. This site reads it live and checks artifact identity across endpoints on every request.
Euro 2024 was opened exactly once, after the model and its calibration were frozen. Both the raw and calibrated variants are reported, and neither was tuned afterwards.
match clustered paired bootstrap: 2,000 whole-match resamples at 95% confidence. Shots share context within a match, so matches, not shots, are resampled.
Calibration was adopted on World Cup 2022, before Euro 2024 was ever opened. On the holdout, the calibrated variant then scored slightly worse than the raw one on both proper scores. The release ships calibration anyway: reversing the decision after seeing the holdout would have turned it into a second selection set.
Provider terms do not yet resolve publishing probabilities for individual historical shots, so the API refuses those rows outright. It substitutes and reconstructs nothing.
The model reads recorded event fields and geometry derived from them. Shot freeze frames are event snapshots, not continuous tracking data, and are never treated as such.
Each value is an estimate for a shot as recorded. It supports analysis; it does not establish cause, player quality, or the right next decision.