Calibrated World Cup forecasts, run by an agent

Sole author Jump Trading Probability Cup  –

#17 of 4,013 overall #5 in the knockout stage

Two lines climb from zero across 103 matches, slowly in the group stage and steeply in the knockouts and the final: my first bot ends at +4,732 points, #17 of 4,013 overall; my second at +4,451.
Match by match: knockout forecasts counted double and the final triple; the final alone moved my first bot from 31st to 17th.

The Jump Trading Probability Cup asked for a probability on about ten yes/no questions in each of the 104 World Cup matches, scored against the field. My first bot finished #17 of 4,013; my second finished #5 in the knockout stage.

The engine never rates teams itself: it anchors every answer on the betting market’s odds and models only what the market does not price. A Claude Code agent ran it in production for 38 days, under rules I set: every number came from the pipeline, and every submission was checked.

What I did

  • Built the pricing engine: one Dixon–Coles scoreline grid, fitted to de-margined bookmaker and Polymarket odds, answers every goal question consistently.
  • Fitted negative-binomial models for corners, cards, shots and fouls on odds-implied scoring rates from ~41k club matches; player props follow the confirmed lineup.
  • Mapped every question to one of 65 families, building and testing 19 new ones during the knockouts, each on the day it appeared.
  • Designed the agent operations: a Claude Code agent ran it for 38 days, scheduling passes before each kickoff, researching lineups and verifying every submission.
  • Ran my second bot as a live A/B bench: a change reached my main bot only after winning its own settled markets.

Figures

The engine anchors every answer on the market’s odds and models only what the market does not price; a Claude Code agent ran both entries under my rules.
Reliability diagram: my first bot’s live forecasts follow the diagonal; the crowd’s average forecast on the same markets sits below it, over-pricing events. Right: the club backtest’s 782,157 forecasts lie on the diagonal.
Forecast against outcome. Live, my forecasts averaged 42.2% where 42.2% happened; the crowd averaged 47.1%. The club backtest held within 2 points of the diagonal.
Bars of my first bot’s points by market type, every one positive: goals and results +1,462, player shots on target +662, goal scorers +627, cards +479, corners +362, and smaller gains on the rest.
Where the points came from: every market type scored above the field.

Built with

Python NumPy SciPy pandas statsmodels Claude Code SportsPredict Model API DraftKings and Polymarket odds StatsBomb football-data.co.uk

Credits

Odds from DraftKings (via ESPN) and Polymarket; event data from StatsBomb open data; club results and closing odds from football-data.co.uk; player season rates from API-Football. Operated with Claude Code. Not affiliated with Jump Trading, SportsPredict or FIFA.