Theme
Language 中文
Back to projects YSKM523 / 2025-26-UEFA-oracle

UEFA Champions League Oracle

AI predictions for the 2025-26 UEFA Champions League from quarterfinals onwards. Elo + xG + injury-weighted Elo + Poisson + Monte Carlo vs Polymarket.

Resolved · Postmortem Sole author last updated: May 6, 2026

Context

The 2025-26 UEFA Champions League runs against a ~$252M Polymarket winner market. This is the sister project to worldcup-oracle — same modeling toolkit, but with a different conclusion about what actually adds skill on this specific problem.

Approach

Production stack — and what I dropped from it

Production: Club Elo + QF xG adjustment (both legs) + injury-weighted Elo + Poisson scoreline + Monte Carlo.

Behind a flag: the 3-model TSFM ensemble (Chronos-2 / TimesFM-2.5 / FlowState).

The honest version of why: I ran an 83-tie, 5-season backtest before going live. The TSFM ensemble added no point-prediction skill over pure Elo on this dataset. So Elo is the production engine; TSFMs stay in --with-tsfm as an ablation / research layer. This is the opposite finding from worldcup-oracle, where the TSFM ensemble is doing real work — and the difference (knockout games vs full tournament from group stage, much smaller sample) is itself the lesson.

Match-by-match modeling

  • Each tie is simulated as two legs with the Poisson model.
  • Injury data from FotMob is reweighted into team Elo (a Bayern starting XI with 4 starters out is not the team that scored their Elo rating).
  • xG from quarterfinal first legs is folded back into the Elo prior for the second leg.
  • 50K Monte Carlo runs per round produce win / advance / champion probabilities.

Final Result (May 30, 2026)

Paris Saint-Germain retained the trophy, beating Arsenal on penalties — 1-1 after extra time, 4-3 in the shootout at the Puskás Aréna in Budapest. Havertz put Arsenal ahead inside five minutes; Dembélé’s second-half penalty levelled it; Gabriel missed Arsenal’s fifth spot-kick to keep the cup in Paris.

How the pre-final edges resolved (Polymarket UCL winner market, $252M volume):

  • Arsenal — 61.4% AI vs 41.5% market = +19.9pp STRONG BUY → reached the final, lost the shootout. The flagship edge did not cash.
  • PSG — 21.7% AI vs 28.5% market = −6.8pp STRONG SELL → won the tournament. The biggest miss.
  • Bayern Munich — 16.9% AI vs 30.5% market = −13.6pp STRONG SELL → out in the semis (PSG took the tie). Fade was right.

The honest read: the model nailed that Arsenal had the highest adjusted Elo of the final four and would reach the final, and missed the one thing that pays — the winner. A 1-1 final decided on penalties is close to a coin flip, which is exactly where a 61% prior gets punished. Calling PSG a STRONG SELL on their way to back-to-back titles is the line that stings.

What I’m Learning

The interesting honest result here isn’t an edge — it’s the backtest that killed TSFMs as a production component. Sports forecasting at this small-sample scale is mostly about getting Elo + injuries + xG right. A foundation model that’s trained on energy demand or retail patterns doesn’t have a privileged signal over a well-tuned domain model on 83 ties.

This same model architecture does help on World Cup, where you have 104 matches and longer-horizon attacking-defensive trajectories to learn from. So the difference isn’t “TSFMs work / don’t work” — it’s “match it to the data regime.”

Stack: Python · Club Elo · Poisson · Monte Carlo · FotMob injury feed · xG blending. TSFMs (Chronos-2 / TimesFM-2.5 / FlowState) behind ablation flag.

Sister project: World Cup Oracle — where TSFMs do earn their seat.

Repo: github.com/YSKM523/2025-26-UEFA-oracle