Premier League & Champions League: pick two clubs and see who's
likely to win, powered by a Dixon-Coles model fitted on Europe's top leagues.
VS
Squads & availability
Untick anyone who won't play (injury, suspension, rotation)
and the odds update. Ratings come from each player's non-penalty xG + xA in the
big-five leagues; with a full squad this changes nothing.
win
Draw
win
Expected goals
–
average goals per match for each side
Most likely scorelines
Victory margin
exact scorelines split a favourite's dominance into many small slices; this view groups them back together
Model vs bookmaker
bookmaker prices come from ESPN (DraftKings) for this
fixture. "Edge" is the model's expected profit per unit staked at the
bookmaker's price: positive means the model thinks the price is too long.
The market knows lineups and news the model doesn't - treat edges as
conversation starters, not bets. Not betting advice.
Betting view: fair odds
fair odds = the break-even price for each market. A real bet only has value
if a bookmaker offers higher odds than shown here. Probabilities refer to the 90-minute
result, are estimates with no lineup/injury knowledge, and are not betting advice. If you
bet, bet responsibly.
How this predictor works
Under the hood this page runs the same Dixon-Coles model as the
international predictor, but fitted on club football: nine seasons of the
Premier League, La Liga, Bundesliga, Serie A and Ligue 1 (plus six feeder
leagues), together with every Champions League match in that window. The
Champions League games matter twice: they sharpen each club's rating and
they are the only matches where clubs from different leagues meet, so they are
what puts Arsenal and Bayern on one comparable scale. Because club squads
change every transfer window, results lose half their influence per
year (the international model uses four): the ratings live in the
present. From each club's attack and defence rating the model computes
expected goals, builds a probability grid over every scoreline (with the
Dixon-Coles low-score correction) and reads off the win/draw/loss odds,
margins and fair odds. Clubs with little recent top-level data are blended
toward an Elo prior. In back-testing on the most recent season it beat that
Elo baseline on every metric, most clearly in the Champions League.
Everything runs locally in your browser, no server involved.
What the tags mean
Expected goals (xG home / xG away)
The model's average goals per match for each side: if this matchup were
played many times, this is what each club would score on average. A 1.8–0.9
reading is not a score prediction; it says team 1 creates about twice
team 2's scoring output.
Team 1 at home
Applies the fitted home-advantage boost (roughly 24% more goals). Club
matches are almost never on neutral ground, so it's on by default;
turn it off for a cup final on neutral turf.
Dixon-Coles vs Skellam
Dixon-Coles evaluates the full scoreline matrix with the low-score
correction, the accurate choice. Skellam approximates using only the
distribution of the goal difference; slightly faster, slightly cruder.
Most likely scorelines
Exact probabilities computed from the model's full scoreline matrix,
not random samples, so the same matchup with the same settings always
shows the same numbers. In football the top scorelines are often nearly
tied at around 10% each; no single final score is ever truly "likely".
Betting view: fair odds
Each market's model probability converted to decimal odds (1 ÷
probability), the break-even price. Bookmakers add a margin, so their
odds on "safe" favourites are usually below fair value; a bet is only
mathematically good when their offered odds are higher than the fair odds
here. Markets settle on the 90-minute result: in knockout games a win
bet loses if the team only wins in extra time. The model knows nothing about
lineups or injuries. Not betting advice.
Victory margin
The same probabilities regrouped by the final gap in goals instead of the
exact score: "how big will the difference be?" rather than "exactly
which scoreline?". A club's "win by 2+" bundles 2-0, 3-0, 3-1, 4-1… into
one group that can be the most likely outcome even though each exact score
looks small alone.
Squads & availability
Each player carries a rating built from his non-penalty expected goals +
expected assists per 90 minutes over the last two seasons (recent season
counting double), shrunk toward his position's average so short stints don't
produce absurd numbers. A club's baseline adds up its players' ratings weighted
by how much they actually play, and by construction that matches the club's
team rating - so with everyone available, the player layer changes
nothing. Unticking a player replaces him with a bench-level stand-in
and rescales the club's attack; missing defenders and goalkeepers instead
concede a little extra to the opponent (a flat approximation - defensive value
can't be measured from xG). Player data covers the big-five leagues, so clubs
from other countries show no squad list. Ratings reflect last season's squads
until the new season's data starts accumulating.
Use xG data
Switches to team strengths fitted on expected goals (Understat's
shot-quality model) blended with actual goals, instead of goals alone.
Goals are a tiny sample - a whole season is ~55 scoring events - so a
team's goal tally carries a lot of finishing luck; xG measures the
chances created and conceded. In back-testing the xG fit beat the
goals-only fit on every segment, so it is on by default. Understat
covers the big-five leagues (98% of fitted league matches); Champions
League and feeder-league games always use real goals.
Model vs bookmaker
When you load an upcoming fixture from the list, the model's fair odds
sit next to the bookmaker's actual prices. A bookmaker price above
the fair odds means the model considers it generous ("edge" > 0). Keep
the humility in mind: closing bookmaker odds are the most accurate
public forecast in football - in our own back-test they beat this model
- so a large edge more often means the model is missing something
(an injury, a rotated lineup) than that the bookmaker is wrong.
Cross-league matchups
Comparing clubs from different leagues (say Liverpool vs Bayern) leans on
the Champions League games linking those leagues. That works well for regular
European participants; for clubs that rarely play in Europe the comparison
is rougher - the model will tell you when its data is thin.
♥ Support the project
This predictor is free, open and runs entirely in your browser. If it made
the season a little more fun, you can chip in to keep it running and
improving. Any amount is hugely appreciated!