Are draws underpriced? Betting every World Cup 2026 draw on Polymarket
I'm not really a football person, but Norway qualified for the first time in 28 years, so I've been watching this World Cup anyway. It's also the first one where prediction markets like Polymarket are properly big, which got me curious about something I usually stay away from: betting.
Every tournament someone makes the same claim: "Hvis man hadde alltid bettet på uavgjort, så hadde man tjent." Roughly: if you had just always bet the draw, you would have made money. The idea is that draws happen more often than people think, and the odds on them are good, so the draw is underpriced. I've heard this many times and never seen anyone actually check it. Polymarket has an open API with historical prices and ran a draw market for every game, so it turns out checking is quite easy.
The short version: over the 86 completed matches with a tradeable draw price, betting $1 on the draw at every kickoff and holding to full time would have returned about +$32 on $86 staked, a +37% ROI. Draws happened 27.9% of the time, but the market priced them at 22.3% on average.
Why would the draw be cheap? #
My theory is that people bet on what they want to happen, not on what is most likely. A Norwegian watching Norway–Brazil isn't weighing form and expected goals, they're betting on Norway because it's their team. Nobody wants a 1–1. So most of the money goes on the two teams, and the draw ends up priced a bit too low.
What happened last time #
There is some history behind this too. At Qatar 2022, 15 of the 64 matches were level after 90 minutes, about 23%.[1] Still, the draw is usually priced around 20% or below. If the real rate is closer to a quarter, that's an edge.
How the bet works #
Polymarket runs one market per match with three outcomes: home win, draw, away win. Each outcome is a share that trades between $0 and $1. If you buy the Draw share at $0.22, you pay 22 cents for something that pays $1 if the match is level after 90 minutes and $0 if it is not. The price is the implied probability, so $0.22 means the market thinks there's a 22% chance. You can trade in and out until the match resolves, but I keep it simple here: buy once at kickoff, hold to the final whistle.
This is why the payoff is so lopsided: a draw share bought at 22 cents pays out about $4.50 when the draw lands, and nothing when it doesn't.
A note on fees: Polymarket is known for zero trading fees, and most markets are still free to trade, but the World Cup ones have a small taker fee of 3%. It's largest for prices near 50/50 and smaller toward the extremes. A few cents on the dollar is enough to shave the edge, but not to close the gap between a ~22% price and a ~28% actual draw rate. The numbers below don't include the fee, so they are slightly optimistic.
The 2026 result #
Betting a flat $1 on the draw at every kickoff, here's the running profit through the tournament so far:
It's bumpy: you lose $1 on every match that doesn't end level, but the draws that do land pay about 4.5:1 on average, which more than covers the misses.
Try it yourself #
Type in how much you would put on the draw in each match. There's also a toggle to only bet the draws priced below last World Cup's 23% rate:
The math is simple. If you pay a price p for a draw that actually happens with probability q, your expected profit per $1 is
This is positive whenever q > p, which is exactly the gap above.
Getting the data #
This whole thing took an afternoon, mostly because Polymarket's API is public, free, and has historical prices — you can ask what the market thought at kickoff months after the fact. The data pull is basically two HTTP calls:
import httpx
GAMMA = "https://gamma-api.polymarket.com"
CLOB = "https://clob.polymarket.com"
# 1. Every 2026 World Cup match event (tag 102232 = "fifa-world-cup").
events = httpx.get(
f"{GAMMA}/events",
params={"tag_id": 102232, "limit": 100, "closed": "true"},
).json()
# 2. Each match has a "Draw" market, grab its CLOB token id, then read the
# price series and take the last trade at/just before kickoff.
history = httpx.get(
f"{CLOB}/prices-history",
params={
"market": draw_token_id,
"startTs": kickoff_ts - 3 * 3600,
"endTs": kickoff_ts,
"fidelity": 10, # minutes
},
).json()["history"]
price_at_kickoff = history[-1]["p"] # last trade before the whistle
Not long ago, getting the closing draw price for every World Cup match would have meant paying for a data feed. Now it's a couple of GET requests.
The catch: liquidity #
A +37% edge on paper is not free money at any size. As soon as you bet real volume, two things happen: you move the price, so your fills are worse than what's on the screen, and you close the mispricing, since you buying the draw is exactly what corrects it. Bet enough and the edge is gone.
How much you could actually have bet is the interesting question, and I want to look at it properly, so I'm saving it for the next post: how much of this edge is left once you account for liquidity.
Not betting advice, just a historical what-if.
Qatar 2022, from openfootball data: 15 of 64 matches (23.4%) were level after 90 minutes, which is how Polymarket settles the draw. ↩︎