Can an LLM price a World Cup match better than the market (and make money)? An automated system using Anthropic's Claude to price World Cup matches beat Kalshi's market, growing a bankroll from $255 to $771 over 121 bets, despite losing nearly half of its wagers. The system, developed by Chris By, blinded the LLM to odds and used a Poisson-Dixon-Coles model to convert expected goals into scoreline probabilities, then bet on edges against Kalshi prices. The project is fully open-sourced on GitHub. Two years ago I let GPT-4o guess every Euro 2024 result from SportMonks stats SoccerGPT https://github.com/chrisby/SoccerGPT : it called 28 of 51 winners 55% but the exact goal difference in only 8 16% . The 2026 World Cup and a new generation of reasoning models were the excuse to ask a sharper question. Not just how well a model can predict a scoreline, but whether it can reason to a probability that beats the market’s price, and turn that into money. So this time I blinded the model to the odds, sized real bets on the edge between its probability and the Kalshi https://kalshi.com price, and logged every dossier and bet publicly https://github.com/chrisby/frontier-xg-world-cup . The system is fully automated; I only started each analysis and gave the “go” on the bets it proposed. Over 121 bets the bankroll grew from 255 to 771 USD. In this post we walk through the methodology, which Claude developed, and look at why we tripled our cash while losing almost half of our bets. The accompanying repository can be found at GitHub https://github.com/chrisby/frontier-xg-world-cup . Method Link to heading method Before each match, we compile a dossier $D$: the squads, recent form, the confirmed starting XI, and tournament context, assembled deterministically and containing no prices. The LLM $f \theta$ reads only this dossier and defines a 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 draw, and a team 2 win, and the expected goals $\mathrm{xG}^{1}$ and $\mathrm{xG}^{2}$ that each team scores. The scoreline Link to heading the-scoreline Let us start from the one thing a match produces: its final goals. Let $S = S^1, S^2 $ be the scoreline , where $S^1$ is the number of goals team 1 scores and $S^2$ the number of goals team 2 scores. Before kickoff $S$ is unknown, so we 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 scoreline: the win/draw/win outcome, match totals over/under $0.5$ to $3.5$ goals , spreads, both teams to score, clean sheets, per-team totals, and so on. Concretely, each market $m$ is a binary Kalshi contract that settles at one dollar if its condition on $S$ holds and nothing if it does not. Write that condition as a settlement rule $r m S^1, S^2 \in \{0, 1\}$, equal to $1$ exactly when the realized scoreline satisfies it. For instance, for the “over 2.5 goals” market, $r m S^1, S^2 = \mathbf{1} S^1 + S^2 \ge 3 $. The model’s probability that the 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 $S$ that the model’s expected goals imply. From expected goals to a scoreline Link to heading from-expected-goals-to-a-scoreline We treat each team’s goal count as Poisson with a rate equal to the model’s expected goals, $\lambda 1 = \mathrm{xG}^1$ and $\lambda 2 = \mathrm{xG}^2$. A single Poisson already captures the basic shape of goalscoring: a low rate piles the mass on zero and one goal, while a higher rate pushes the peak outward and spreads it Figure 1 . The scoreline combines one such distribution per team. Multiplying two independent Poissons is the obvious starting point, but Dixon and Coles 1997 https://doi.org/10.1111/1467-9876.00065 showed it misprices the lowest scores too few $0$-$0$ and $1$-$1$ draws , so we apply their correction $\tau$, which reweights the four lowest-score cells through a 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 to sum to one. The model’s outputs now price the markets from two sources. The win/draw/win markets take the probabilities $p 1$, $p {\mathrm{d}}$, $p 2$ directly, and in a knockout the probability that team 1 advances is $p 1 + \tfrac{1}{2} p {\mathrm{d}}$ a drawn match goes to extra time and penalties, split evenly . Every other market totals, spreads, both teams to score, team totals is priced from the scoreline grid built above from the two expected goals. The rule $r m$ is deterministic and only the scoreline is random, so the probability $q m$ is the expectation of that rule over the grid, 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 first equality holds because $r m$ takes only the values $0$ and $1$, so its expectation is exactly the probability that it equals $1$. One reasoning pass, just two point estimates, therefore prices roughly two dozen contracts at once. Figure 2 shows one such grid for a real match, the joint scoreline distribution every market probability is read off. When to bet: edge and anchor Link to heading when-to-bet-edge-and-anchor Only now does the market enter. On Kalshi a YES contract for market $m$ has an ask price $c m \in 0, 1 $: pay $c m$, receive one dollar if the event happens. That price is the market’s own view of the same event our model prices at $q m$, so the gap between them is our edge , $$e m = q m - c m,$$ positive when the model thinks the contract is too cheap. We evaluate both sides of every market: the NO side wins with probability $1 - q m$ at its own ask price, so the identical rule covers it with $q m$ replaced by $1 - q m$. A positive edge is not enough, because the model can be wrong, and confidently so. So we ask for a second opinion, a sharp anchor . When a deep, liquid market Polymarket, with millions of dollars of volume behind its prices quotes the same outcome, we read off its implied probability $q^{\mathrm{Poly}} m$ and let it police the model two ways: Direction. The anchor must also see the side as underpriced, $q^{\mathrm{Poly}} m - c m \ge \delta$ with $\delta = 0.01$. If a market that deep disagrees with the model’s direction, we take the model to be wrong and pass. Conservative sizing. We never lean on the model beyond what the anchor supports, so we measure the edge on the smaller of the two probabilities, $\min q m, q^{\mathrm{Poly}} m - c m$. The bet trigger is then a single bar on the edge, set higher when there is no anchor to lean on: $$\text{bet on } m \iff \begin{cases} \min q m, q^{\mathrm{Poly}} m - c m \ge 0.06 & \text{with an anchor,} \\ q m - c m \ge 0.09 & \text{without one.} \end{cases}$$ The unanchored bar is stricter precisely because nothing independent has checked the number. Anything that clears must still beat Kalshi’s trading fee, about $\lceil 0.07 \cdot C \cdot c m 1 - c m \rceil$ cents on $C$ contracts, before it counts as a real edge. How much to bet: fractional Kelly Link to heading how-much-to-bet-fractional-kelly Choosing the bets is only half the job; the other half is size. Let $X$ be the current bankroll and $x$ the stake we place on a qualifying bet. Write $w$ for the probability that the bet wins the conservative sizing probability from the last section, $\min q m, q^{\mathrm{Poly}} m $ when anchored and $q m$ otherwise and $c$ for its cost per contract. The Kelly criterion https://doi.org/10.1002/j.1538-7305.1956.tb03809.x Kelly, 1956 picks the stake that maximises the long-run growth rate of the bankroll, that is, the expected logarithm of wealth. Staking a fraction $\text{frac} = x / X$, a winning contract returns net odds $\text{odds} = 1 - c / c$ per unit staked while a loser forfeits the stake, so one bet multiplies the bankroll by $1 + \text{frac} \cdot \text{odds}$ with probability $w$ and by $1 - \text{frac}$ otherwise. The expected log-growth is $$g \text{frac} = w \ln 1 + \text{frac} \cdot \text{odds} + 1 - w \ln 1 - \text{frac} .$$ Setting $g’ \text{frac} = 0$ gives the growth-maximising fraction, which we call the Kelly fraction $\text{frac} K$, $$\frac{w \cdot \text{odds}}{1 + \text{frac} \cdot \text{odds}} = \frac{1 - w}{1 - \text{frac}} \quad\Longrightarrow\quad \text{frac} K = \frac{w - c}{1 - c},$$ the result that it is the edge $w - c$ over the downside $1 - c$. But full Kelly assumes the win probability $w$ is known exactly, and the growth curve is steep on the right Figure 3 : stake much past the optimum and growth falls, hitting zero near twice the Kelly fraction and turning negative beyond. An overstated $w$ is therefore dangerous, because it pushes the recommended stake rightward, toward that cliff. In the figure, a bet that wins 55% of the time but is sized as if it won 65% triples the fraction from 10% to 30%, deep into loss-making territory, converting a real edge into a slow bleed. Because our $w$ is a noisy model estimate, we deliberately stake only a quarter of Kelly, which keeps us well left of that edge, and we cap any one bet at 12% of bankroll: $$x = \min\left \tfrac{1}{4} \cdot \frac{w - c}{1 - c} \cdot X, \ \ 0.12 \cdot X \right .$$ We then buy a whole number of contracts, $C = \lfloor x / c \rfloor$, and keep the bet only if that rounded stake still clears the fee above. One last adjustment. Bets that share a team or a match rise and fall together, so sizing each in isolation would quietly concentrate risk. We add the qualifying bets highest-edge-first, capping exposure at 15% of bankroll on any single correlated group and 50% deployed in total, and trim or drop whatever would breach a cap. Results Link to heading results Over the tournament, from the group stage to the final, the system settled 121 bets and grew a 255 USD bankroll to 771 USD as shown below. | Settled bets | 121 | | Record won / lost | 62 / 59 51.2% | | Total staked turnover | 2,483 USD | | Net profit | +516 USD | | Return on turnover | +20.8% | | Bankroll | 255 → 771 USD +202% | | Fees paid to Kalshi | 99 USD | The return is real money, but it is one short, high-variance sample, and the rest of this section is about what that sample does and does not support. The record alone proves little. A 62-59 record is a 51.2% hit rate, whose 95% Wilson confidence interval runs from 42.4% to 60.0%. That interval contains 50%, so on wins and losses alone we cannot distinguish the strategy from a coin flip. This is by design: the aim is not to be right more often, but to be right when the price is wrong, so the evidence for an edge has to come from prices and calibration, not the raw record. The realized edge is in the prices. Across the 121 bets, the contracts we bought resolved in our favour 51.2% of the time, while their average entry price was 37.8 cents on the dollar. Paying 0.378 for outcomes that occur 0.512 of the time is the whole source of the +20.8% return on turnover. The model is well-calibrated in absolute terms. Its average stated probability over the placed bets, 0.523, sits about one percentage point above the realized win rate, 0.512, so on average its stated probabilities match how often those bets actually won. Scored per bet with the Brier score, the mean squared distance between a stated probability $q$ and the $0/1$ outcome $o$ over $N = 121$ bets, $$\text{Brier} = \frac{1}{N} \sum {i=1}^{N} q i - o i ^2,$$ the model’s probabilities reach 0.234 , slightly below the 0.250 of an uninformative constant guess. The rest we read cautiously. The market’s prices score 0.251 on the same bets, but that gap is neither significant bootstrap 95% interval $ -0.011,\ +0.045 $ nor unbiased, since we only bet contracts we had already judged underpriced. The return is noisy too: gross winnings of 1,774 USD against 1,258 USD of losses net to just 516 USD, and the five best bets make up 83% of that. A different five results and the headline would look very different. Conclusion Link to heading conclusion We let an LLM reason from a per-match dossier to a win/draw/win probability and expected goals, turned those into prices for two dozen markets with a Dixon-Coles Poisson, and bet only where our price beat Kalshi’s and a Polymarket anchor agreed, sizing by quarter-Kelly. Reasoning blind to the odds, it priced matches well enough to grow 255 USD into 771 USD while losing almost half of its bets: the edge lived in the price, not the hit rate. Because that return is a small, noisy sample carried by a handful of bets, the signal we trust most is calibration, that the model’s stated probabilities matched how often those bets actually won. Every dossier and bet is public https://github.com/chrisby/frontier-xg-world-cup for anyone who wants to check the rest.