Methodology

How the forecasts are made

Plain-language notes on what goes in, what the model does, how we check it, and what it deliberately leaves out.

01

Data

Results and fixtures come from OpenFootball football.json, released under CC0. Each run records the exact repository commit and file checksums. A newer commit is only used after it passes validation (20 clubs, 380 fixtures, no duplicate pairings); otherwise the last pinned commit is kept. Championship play-off rounds are excluded. Club membership comes from the season file itself, not a hard-coded list.

Freshness is measured against the schedule: if a fixture's date has passed and the source has no score, it's flagged as a missing result and no forecast is shown for it as "upcoming". Data cutoff, source fetch time and model run time are shown separately — Pitchcast doesn't claim to be live.

The football-data.co.uk archive is used only as a private cross-check of scores. The free football-data.org API supplies kickoff times and supplements delayed community results with validated final scores. All 380 pairings must match, and existing final scores must agree before new results enter a fresh model run. Football data provided by the Football-Data.org API.

We don't use Fantasy Premier League data (its terms restrict commercial reuse), bookmaker odds, or player and injury data.

02

Team strength

For Premier League matches, ratings learn from 75% historical shot-based expected goals (Understat) and 25% actual goals. Chance quality reduces the influence of unusually good or bad finishing. The provider scale is fitted from earlier training matches only; Championship ratings still use goals. All required Premier League xG records must match the result, teams and date before a new run can publish.

The xG weight was selected on 2024/25. Later-season tests show a small improvement, with uncertainty spanning no improvement; see the track record. This remains an experimental model change.

Each team has an attack and a defence rating. The expected goals for the home side are exp(μ + home + attackhome − defenceaway), and the same for the away side without the home term. Because ratings are estimated together from every match, a goal against a strong defence counts for more than one against a weak defence.

Recent matches count more (exponential decay, ξ = 0.001 per day, 365-day window). Ratings are pulled gently toward average (ridge = 0.05) so small samples don't produce extreme ratings. Form is just this recency weighting — there are no streak bonuses on top.

Promoted clubs: Championship matches are fitted in the same model with their own league scoring level. Clubs that moved between divisions link the two scales, so promoted teams start from a calibrated estimate rather than their raw Championship scoring rates.

A Dixon–Coles correction (ρ, estimated from the data) adjusts the four lowest scorelines, where plain Poisson models are known to misfit. Expected goals are bounded to 0.05–5.5 purely for numerical safety; every run records how often that limit applied.

03

Season simulation

The real table is frozen. Only the remaining fixtures are simulated: each score is drawn from the model's full scoreline grid (0–20 goals each side, normalised to sum to one). A run targets 100,000 simulated seasons, executed in batches with a recorded seed so it can be reproduced exactly. The completed count is shown with every forecast.

Ranking follows Premier League rules as far as scores allow: points, goal difference, goals scored, then head-to-head points and head-to-head away goals. Any remaining tie — in reality a play-off where it matters — is settled by a seeded random draw. This approximation is noted with each run.

From the simulations we get expected points, 10th–90th percentile points, the probability of every finishing position, and title, top-four, top-six and relegation chances. Top four/six are league finishing positions, not guaranteed European places. "Expected goals" throughout means the model's predicted goal rate, not shot-based xG. Score grids cover 0–20 goals per side; the omitted tail is under one in a million.

04

Two kinds of uncertainty

Sampling error comes from running a finite number of simulations. At 100,000 runs it's at most about ±0.3 percentage points (95%), and we show it.

Model uncertainty — that the ratings themselves could be wrong — is larger and is not captured by the simulation spread. We don't yet publish a separate estimate of it, so read the probabilities as conditional on the fitted ratings.

05

Validation

We refit the model each week using only earlier matches, and score it on that week's results using log loss, Brier score and accuracy. Settings were chosen on 2024/25; 2025/26 and 2026/27 to date are held out. We compare against Elo, plain Poisson and base-rate baselines. See the track record, including where a baseline does better.

06

Feature status

  • active

    Shot-quality team ratings

    Premier League ratings blend 75% verified historical Understat xG with 25% goals, scaled to actual scoring using training matches only. Championship inputs remain goals. Selected on 2024/25; later-season gains are modest and uncertain.

  • active

    Opponent-adjusted attack & defence ratings

    Fitted jointly over Premier League and Championship results with ridge shrinkage.

  • active

    Home advantage

    Single fitted coefficient, shared by all teams.

  • active

    Recency weighting (form)

    Exponential time decay on past matches; no streak bonuses.

  • active

    Low-score (Dixon–Coles) correction

    ρ fitted by profile likelihood; adjusts 0-0, 1-0, 0-1, 1-1 only.

  • active

    Promoted-team priors

    Championship results linked to the PL scale via teams that moved divisions, shrunk toward average.

  • disabled

    Player availability & injuries

    No licensed, verified player data source yet. Not part of the baseline.

  • disabled

    Rest days & fixture congestion

    Requires kickoff times and an estimated, tested coefficient. Off until validated.

  • disabled

    Market odds

    Not used as an input or benchmark until timing and licence are established.

Player effects are designed — dated player/team identities, minutes-shrunk per-90 metrics, projected availability vs a replacement level, bounded team-rating deltas — but stay off until a licensed source is verified and the effect is shown to improve held-out scores.

07

Version history

  • pitchcast-research-v1 — Owner-run reference model (Python): penalised Poisson with 180-day half-life, ridge 12, promoted-team prior, Dixon–Coles ρ; 100,000 simulations, seed 2627006. This reference forecast remains archived with its separate held-out evaluation. New forecasts use the app engine shown on each snapshot.
  • pc-xg-2.0.0 — Time-decayed ridge Poisson with Dixon–Coles ρ, joint PL+Championship fit, 100k-run seeded simulation, PL tie-break rules, walk-forward evaluation.

Pitchcast's earlier site advertised a Monte Carlo approach, but its source code wasn't recovered. This version is a fresh implementation and doesn't claim continuity with those numbers.