Can an LLM price a World Cup match better than the market (and make money)?

cbock902 pts0 comments

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&rsquo;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 &ldquo;go&rdquo; 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 &ldquo;over 2.5 goals&rdquo; market,<br>$r_m(S^1, S^2) = \mathbf{1}[S^1 + S^2 \ge 3]$. The model&rsquo;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&rsquo;s expected goals imply.

From expected goals to a scoreline

Link to heading

We treat each team&rsquo;s goal count as Poisson with a rate equal to the model&rsquo;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&rsquo;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...

goals mathrm team scoreline from match

Related Articles