Can an LLM price a World Cup match better than the market (and make money)? · Christian Bock
Two years ago I let GPT-4o guess every Euro 2024 result from SportMonks stats<br>(SoccerGPT): it called 28 of 51 winners<br>(55%) but the exact goal difference in only 8 (16%). The 2026 World Cup and a new<br>generation of reasoning models were the excuse to ask a sharper question. Not<br>just how well a model can predict a scoreline, but whether it can reason to a<br>probability that beats the market’s price, and turn that into money. So this<br>time I blinded the model to the odds, sized real bets on the edge between its<br>probability and the Kalshi price, and logged every<br>dossier and bet publicly. The<br>system is fully automated; I only started each analysis and gave the “go” on the<br>bets it proposed. Over 121 bets the bankroll grew from 255 to 771 USD. In this<br>post we walk through the methodology, which Claude developed, and look at why we<br>tripled our cash while losing almost half of our bets.<br>The accompanying repository can be found at GitHub.
Method
Link to heading
Before each match, we compile a dossier $D$: the squads, recent form, the<br>confirmed starting XI, and tournament context, assembled deterministically and<br>containing no prices. The LLM $f_\theta$ reads only this dossier and defines a<br>distribution over analyses from which we draw one,
$$\big(p,\ \mathrm{xG}^{1},\ \mathrm{xG}^{2}\big) \sim f_\theta(D),$$
the outcome probabilities $p = (p_1, p_{\mathrm{d}}, p_2)$ for a team 1 win, a<br>draw, and a team 2 win, and the expected goals $\mathrm{xG}^{1}$ and<br>$\mathrm{xG}^{2}$ that each team scores.
The scoreline
Link to heading
Let us start from the one thing a match produces: its final goals. Let<br>$S = (S^1, S^2)$ be the scoreline , where $S^1$ is the number of goals team 1<br>scores and $S^2$ the number of goals team 2 scores. Before kickoff $S$ is unknown, so we<br>treat it as a random variable drawn from a distribution the model will supply.
Every wager offered on the match is a statement about that<br>scoreline: the win/draw/win outcome, match totals (over/under $0.5$ to $3.5$<br>goals), spreads, both teams to score, clean sheets, per-team totals, and so on.<br>Concretely, each market $m$ is a binary Kalshi contract that settles at one<br>dollar if its condition on $S$ holds and nothing if it does not. Write that<br>condition as a settlement rule $r_m(S^1, S^2) \in \{0, 1\}$, equal to $1$ exactly<br>when the realized scoreline satisfies it. For instance, for the “over 2.5 goals” market,<br>$r_m(S^1, S^2) = \mathbf{1}[S^1 + S^2 \ge 3]$. The model’s probability that the<br>condition holds is then simply
$$q_m \ :=\ \Pr\big[\ r_m(S^1, S^2) = 1 \mid \mathrm{xG}^{1}, \mathrm{xG}^{2}\ \big].$$
Everything therefore reduces to one object: the distribution of the scoreline<br>$S$ that the model’s expected goals imply.
From expected goals to a scoreline
Link to heading
We treat each team’s goal count as Poisson with a rate equal to the model’s<br>expected goals, $\lambda_1 = \mathrm{xG}^1$ and $\lambda_2 = \mathrm{xG}^2$. A<br>single Poisson already captures the basic shape of goalscoring: a low rate piles<br>the mass on zero and one goal, while a higher rate pushes the peak outward and<br>spreads it (Figure 1).
Figure 1: The Poisson distribution for one team's goals, at four<br>expected-goals ($\mathrm{xG}$) values. Each team's goals are modelled this way before the two are combined into a scoreline.
The scoreline combines one such distribution per team. Multiplying two<br>independent Poissons is the obvious starting point, but<br>Dixon and Coles (1997) showed it<br>misprices the lowest scores (too few $0$-$0$ and $1$-$1$ draws), so we apply<br>their correction $\tau$, which reweights the four lowest-score cells through a<br>single dependency parameter $\rho$:
$$P(S^1 = i, S^2 = j) \ \propto\ \frac{\lambda_1^{i} e^{-\lambda_1}}{i!} \cdot \frac{\lambda_2^{j} e^{-\lambda_2}}{j!} \cdot \tau(i, j),$$
$$\tau(i, j) = \begin{cases} 1 - \lambda_1 \lambda_2 \rho & (i, j) = (0, 0) \\ 1 + \lambda_1 \rho & (i, j) = (0, 1) \\ 1 + \lambda_2 \rho & (i, j) = (1, 0) \\ 1 - \rho & (i, j) = (1, 1) \\ 1 & \text{otherwise.} \end{cases}$$
We set $\rho = -0.10$, truncate at ten goals per side, and normalize the matrix<br>to sum to one. The model’s outputs now price the markets from two sources. The<br>win/draw/win markets take the probabilities $p_1$, $p_{\mathrm{d}}$,<br>$p_2$ directly, and in a knockout the probability that team 1 advances is<br>$p_1 + \tfrac{1}{2} p_{\mathrm{d}}$ (a drawn match goes to extra time and<br>penalties, split evenly). Every other market (totals, spreads, both teams to<br>score, team totals) is priced from the scoreline grid built above from the two<br>expected goals. The rule $r_m$ is deterministic and only the scoreline is<br>random, so the probability $q_m$ is the expectation of that rule over the grid,<br>computed as a weighted sum of its cells,
$$q_m = \mathbb{E}[r_m(S^1, S^2)] = \sum_{i, j} r_m(i, j) \cdot P(S^1 = i, S^2 = j).$$
The...