{"slug": "can-an-llm-price-a-world-cup-match-better-than-the-market-and-make-money", "title": "Can an LLM price a World Cup match better than the market (and make money)?", "summary": "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.", "body_md": "Two years ago I let GPT-4o guess every Euro 2024 result from SportMonks stats\n([SoccerGPT](https://github.com/chrisby/SoccerGPT)): it called 28 of 51 winners\n(55%) but the exact goal difference in only 8 (16%). The 2026 World Cup and a new\ngeneration of reasoning models were the excuse to ask a sharper question. Not\njust how well a model can predict a scoreline, but whether it can reason to a\n*probability* that beats the market’s price, and turn that into money. So this\ntime I blinded the model to the odds, sized real bets on the edge between its\nprobability and the [Kalshi](https://kalshi.com) price, and logged every\n[dossier and bet publicly](https://github.com/chrisby/frontier-xg-world-cup). The\nsystem is fully automated; I only started each analysis and gave the “go” on the\nbets it proposed. Over 121 bets the bankroll grew from 255 to 771 USD. In this\npost we walk through the methodology, which Claude developed, and look at why we\ntripled our cash while losing almost half of our bets.\nThe accompanying repository can be found at [GitHub](https://github.com/chrisby/frontier-xg-world-cup).\n\n##\nMethod\n[\nLink to heading\n](#method)\n\nBefore each match, we compile a **dossier** $D$: the squads, recent form, the\nconfirmed starting XI, and tournament context, assembled deterministically and\ncontaining no prices. The LLM $f_\\theta$ reads only this dossier and defines a\ndistribution over analyses from which we draw one,\n\n$$\\big(p,\\ \\mathrm{xG}^{1},\\ \\mathrm{xG}^{2}\\big) \\sim f_\\theta(D),$$\n\nthe 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.\n\n###\nThe scoreline\n[\nLink to heading\n](#the-scoreline)\n\nLet us start from the one thing a match produces: its final goals. Let\n$S = (S^1, S^2)$ be the **scoreline**, where $S^1$ is the number of goals team 1\nscores and $S^2$ the number of goals team 2 scores. Before kickoff $S$ is unknown, so we\ntreat it as a random variable drawn from a distribution the model will supply.\n\nEvery wager offered on the match is a statement about that\nscoreline: the win/draw/win outcome, match totals (over/under $0.5$ to $3.5$\ngoals), spreads, both teams to score, clean sheets, per-team totals, and so on.\nConcretely, each market $m$ is a binary Kalshi contract that settles at one\ndollar if its condition on $S$ holds and nothing if it does not. Write that\ncondition as a settlement rule $r_m(S^1, S^2) \\in \\{0, 1\\}$, equal to $1$ exactly\nwhen the realized scoreline satisfies it. For instance, for the *“over 2.5 goals”* market,\n$r_m(S^1, S^2) = \\mathbf{1}[S^1 + S^2 \\ge 3]$. The model’s probability that the\ncondition holds is then simply\n\n$$q_m \\ :=\\ \\Pr\\big[\\ r_m(S^1, S^2) = 1 \\mid \\mathrm{xG}^{1}, \\mathrm{xG}^{2}\\ \\big].$$\n\nEverything therefore reduces to one object: the distribution of the scoreline $S$ that the model’s expected goals imply.\n\n###\nFrom expected goals to a scoreline\n[\nLink to heading\n](#from-expected-goals-to-a-scoreline)\n\nWe 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).\n\nThe scoreline combines one such distribution per team. Multiplying two\nindependent Poissons is the obvious starting point, but\n[Dixon and Coles (1997)](https://doi.org/10.1111/1467-9876.00065) showed it\nmisprices the lowest scores (too few $0$-$0$ and $1$-$1$ draws), so we apply\ntheir correction $\\tau$, which reweights the four lowest-score cells through a\nsingle dependency parameter $\\rho$:\n\n$$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),$$\n\n$$\\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}$$\n\nWe 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,\n\n$$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).$$\n\nThe first equality holds because $r_m$ takes only the values $0$ and $1$, so its expectation is exactly the probability that it equals $1$.\n\nOne 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.\n\n###\nWhen to bet: edge and anchor\n[\nLink to heading\n](#when-to-bet-edge-and-anchor)\n\nOnly now does the market enter. On Kalshi a YES contract for market $m$ has an\nask price $c_m \\in (0, 1)$: pay $c_m$, receive one dollar if the event happens.\nThat price is the market’s own view of the same event our model prices at $q_m$,\nso the gap between them is our **edge**,\n\n$$e_m = q_m - c_m,$$\n\npositive 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$.\n\nA positive edge is not enough, because the model can be wrong, and confidently\nso. So we ask for a second opinion, a **sharp anchor**. When a deep, liquid\nmarket (Polymarket, with millions of dollars of volume behind its prices) quotes\nthe same outcome, we read off its implied probability $q^{\\mathrm{Poly}}_m$ and let it police\nthe model two ways:\n\n**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$.\n\nThe bet trigger is then a single bar on the edge, set higher when there is no anchor to lean on:\n\n$$\\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}$$\n\nThe 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.\n\n###\nHow much to bet: fractional Kelly\n[\nLink to heading\n](#how-much-to-bet-fractional-kelly)\n\nChoosing 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.\n\nThe [Kelly criterion](https://doi.org/10.1002/j.1538-7305.1956.tb03809.x)\n(Kelly, 1956) picks the stake that maximises the long-run growth rate of the\nbankroll, that is, the expected logarithm of wealth. Staking a fraction\n$\\text{frac} = x / X$, a winning contract returns net odds\n$\\text{odds} = (1 - c) / c$ per unit staked while a loser forfeits the stake, so\none bet multiplies the bankroll by $1 + \\text{frac} \\cdot \\text{odds}$ with\nprobability $w$ and by $1 - \\text{frac}$ otherwise. The expected log-growth is\n\n$$g(\\text{frac}) = w \\ln(1 + \\text{frac} \\cdot \\text{odds}) + (1 - w) \\ln(1 - \\text{frac}).$$\n\nSetting $g’(\\text{frac}) = 0$ gives the growth-maximising fraction, which we call the Kelly fraction $\\text{frac}_K$,\n\n$$\\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},$$\n\nthe 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.\n\nBecause our $w$ is a noisy model estimate, we deliberately stake only a\n**quarter** of Kelly, which keeps us well left of that edge, and we cap any one\nbet at 12% of bankroll:\n\n$$x = \\min\\left( \\tfrac{1}{4} \\cdot \\frac{w - c}{1 - c} \\cdot X, \\ \\ 0.12 \\cdot X \\right).$$\n\nWe 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.\n\nOne 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.\n\n##\nResults\n[\nLink to heading\n](#results)\n\nOver 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.\n\n| Settled bets | 121 |\n| Record (won / lost) | 62 / 59 (51.2%) |\n| Total staked (turnover) | 2,483 USD |\n| Net profit | +516 USD |\n| Return on turnover | +20.8% |\n| Bankroll | 255 → 771 USD (+202%) |\n| Fees paid to Kalshi | 99 USD |\n\nThe 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.\n\n**The record alone proves little.** A 62-59 record is a 51.2% hit rate, whose\n95% Wilson confidence interval runs from 42.4% to 60.0%. That interval contains\n50%, so on wins and losses alone we cannot distinguish the strategy from a coin\nflip. This is by design: the aim is not to be right more often, but to be right\nwhen the price is wrong, so the evidence for an edge has to come from prices and\ncalibration, not the raw record.\n\n**The realized edge is in the prices.** Across the 121 bets, the contracts we\nbought resolved in our favour 51.2% of the time, while their average entry price\nwas 37.8 cents on the dollar. Paying 0.378 for outcomes that occur 0.512 of the\ntime is the whole source of the +20.8% return on turnover.\n\n**The model is well-calibrated in absolute terms.** Its average stated\nprobability over the placed bets, 0.523, sits about one percentage point above\nthe realized win rate, 0.512, so on average its stated probabilities match how\noften those bets actually won. Scored per bet\nwith the Brier score, the mean squared distance between a stated probability\n$q$ and the $0/1$ outcome $o$ over $N = 121$ bets,\n\n$$\\text{Brier} = \\frac{1}{N} \\sum_{i=1}^{N} (q_i - o_i)^2,$$\n\nthe model’s probabilities reach **0.234**, slightly below the 0.250 of an uninformative\nconstant guess.\n\n**The rest we read cautiously.** The market’s prices score 0.251 on the same\nbets, but that gap is neither significant (bootstrap 95% interval\n$[-0.011,\\ +0.045]$) nor unbiased, since we only bet contracts we had already\njudged underpriced. The return is noisy too: gross winnings of 1,774 USD against\n1,258 USD of losses net to just 516 USD, and the five best bets make up 83% of\nthat. A different five results and the headline would look very different.\n\n##\nConclusion\n[\nLink to heading\n](#conclusion)\n\nWe let an LLM reason from a per-match dossier to a win/draw/win probability and\nexpected goals, turned those into prices for two dozen markets with a Dixon-Coles\nPoisson, and bet only where our price beat Kalshi’s and a Polymarket anchor\nagreed, sizing by quarter-Kelly. Reasoning blind to the odds, it priced matches\nwell enough to grow 255 USD into 771 USD while losing almost half of its bets:\nthe edge lived in the price, not the hit rate. Because that return is a small, noisy sample carried by a\nhandful of bets, the signal we trust most is calibration, that the model’s stated\nprobabilities matched how often those bets actually won. Every dossier and bet is\n[public](https://github.com/chrisby/frontier-xg-world-cup) for anyone who wants to\ncheck the rest.", "url": "https://wpnews.pro/news/can-an-llm-price-a-world-cup-match-better-than-the-market-and-make-money", "canonical_source": "https://christian.bock.bio/posts/frontier_xg_worldcup/", "published_at": "2026-08-15 20:04:07+00:00", "updated_at": "2026-08-15 20:10:44.404871+00:00", "lang": "en", "topics": ["artificial-intelligence", "machine-learning", "generative-ai", "ai-research", "ai-products"], "entities": ["Anthropic", "Claude", "Kalshi", "Chris By", "GitHub", "GPT-4o", "SportMonks", "Dixon and Coles"], "alternates": {"html": "https://wpnews.pro/news/can-an-llm-price-a-world-cup-match-better-than-the-market-and-make-money", "markdown": "https://wpnews.pro/news/can-an-llm-price-a-world-cup-match-better-than-the-market-and-make-money.md", "text": "https://wpnews.pro/news/can-an-llm-price-a-world-cup-match-better-than-the-market-and-make-money.txt", "jsonld": "https://wpnews.pro/news/can-an-llm-price-a-world-cup-match-better-than-the-market-and-make-money.jsonld"}}