I have no experience betting on sports, unless you count a few random bets on sports, political or cultural events, with no real edge. But I had an idea, and it came down to this.
The idea
There’s a bookmaker called Pinnacle that’s widely seen as the benchmark, partly because it doesn’t ban winning players and is very confident in its odds.1 The plan was to take Pinnacle’s odds and buy on Polymarket whenever the price was the same or lower.
For example, in the New York Knicks vs Cleveland Cavaliers game on February 24, Pinnacle had the Knicks to win at 2.58. As a percentage, that’s 1 / 2.58 = 38.8%. The bookmaker’s margin is already built into that number, so the Knicks’ real chance of winning is lower.
In other words, Pinnacle sells you a Knicks win at 38.8%. On the other side of that bet, it’s buying a Cavaliers win for itself at 61.2%. There are no draws in basketball, so a Cavaliers win on Polymarket is worth at least 61.2¢. If it’s cheaper, I buy. Polymarket had the Cavaliers at 61¢, and the bot bought.
Early this year I tried to vibe-code a bot that would simply bet by that rule: whenever Polymarket was cheaper than Pinnacle, buy. Back then Claude Code couldn’t handle it, so I had to use my Phone-a-Friend lifeline.
Once the bot was ready, I put $1,000 on Polymarket to see what ROI I’d get with small bets. At first I bet $10 on every game, then I switched to sizing by probability: a 60% chance meant a $6 bet, a 35% chance meant $3.50. To keep things comparable, I rescaled everything as if every bet had been $10. This is how it went.
The result
The orange line is what I should have made on average by Pinnacle’s odds at the moment of each bet. The green one is the same, but by Pinnacle’s last odds right before the game. And the blue line is what I actually got.
I calculated the orange line like this. Take Knicks vs Cavaliers again. Pinnacle had the Knicks at 2.58 and the Cavaliers at 1.555. As percentages, that’s 38.8% and 64.3%. Together they add up to 103.1%, and the extra 3.1% is Pinnacle’s margin.
I removed the margin proportionally, dividing each number by 1.031 so they add up to exactly 100%.2 That gives the Knicks 37.6% and the Cavaliers 62.4%. The bot bought the Cavaliers at 61¢, so in this game I had an edge of about 1.4 points: I was paying 61¢ for something Pinnacle valued at 62.4¢. That’s an expected profit of +2.3% on the stake (0.624 / 0.61 − 1). Add up those expected profits over all the bets and you get the orange line.
The green line ends up positive. The catch is that being ahead by Pinnacle’s numbers doesn’t mean being ahead by the real odds.
Bad luck or no edge?
Either Pinnacle was wrong, or I was just unlucky. To find out, I first replayed all 3,723 of my bets 100,000 times, treating Pinnacle’s estimate right before the game as the true probability of each outcome. Then I did the same with Polymarket’s estimate, the price I bought at.
If Pinnacle’s odds right before the game were correct, I should have been up 52 units on average, and only 11% of the runs ended at my result or worse. If Polymarket’s prices were right, 38% of the runs did. 11% is unlucky, but not that unusual, so this alone doesn’t tell me who was right. Let’s dig deeper and look at who moves the market first.
On April 11, 2026, the Washington Capitals played the Pittsburgh Penguins. From the morning until about 12:30, both platforms gave the Penguins about the same chance, around 52–53%. Then at 12:31 Polymarket sharply drops the Penguins to 47.5%. At 12:33 the bot buys the Penguins at 48¢, because Pinnacle still says the fair price is 53%. To the bot, that looks like a 5-point edge. But at 12:58 Pinnacle catches up and drops the Penguins to 46%, turning the bet into a losing one. Then it happens once more: Polymarket drops the Penguins at 1:59 and 2:08, and Pinnacle follows at 2:27. In the end the Penguins lost, and so did the bet.
Worth noting: the bot checked each game only about every 20 minutes, so it never saw any of these moves the instant they happened.
But this is just one example. Across the whole sample, Pinnacle catching up with Polymarket happened in 30% of cases. In 17% it was the other way around: Polymarket caught up with Pinnacle. In 19% Polymarket moved and Pinnacle didn’t. In 11% neither moved. In 14% both moved, but the data can’t tell which one went first.
And if you look more broadly at how quickly Pinnacle caught up with Polymarket, it looks like this.
I have a few theories about why Pinnacle sometimes catches up with Polymarket late, and why sometimes it doesn’t move at all and Polymarket comes back to it instead. In the first case, my guess is that there are more professionals on Polymarket, and they move the price faster. In the second, it may be that weaker players move the price and the professionals then even it out, so Pinnacle has no reason to react.
The bug
Let’s go back to the cases where Pinnacle never caught up with Polymarket. What was going on in those 35%? After all, the green line’s entire expected profit comes from them. While trying to figure this out, I found a bug in the bot. In about 6% of cases, 230 bets, the bot was comparing Polymarket with a Pinnacle price that hadn’t changed for over a day. Polymarket kept updating its prices, while my bot kept comparing them with stale Pinnacle odds. So whenever the price on Polymarket moved, the bot took it for a bargain. I lost 26 units on those bets.
This is what my results would have looked like without that bug.
Without those broken bets, the green line shows only +1% ROI. To tell a 1% edge from zero, you’d need about 30,000 bets. I have 3,500.
Who was right
Right before the game, the two platforms almost agree: their prices are on average about 1 point apart, and they’re equally accurate. But at the moments my bot picked, Polymarket was closer. By Pinnacle’s numbers, my bets should have won 61.6% of the time; by Polymarket’s, 59.6%. They won 59.7%, almost exactly what Polymarket said.
Conclusion
First, for a bot like mine to end up ahead, I’d most likely have to treat Polymarket as the truth and compare it with the bookmakers that lag behind it.
Second, the edge goes to whoever knows the subject inside out. I didn’t know sports betting that well, which is why I usually write about all things online casino.
Third, the only people who never make mistakes are the ones who never do anything. So it’s worth trying new things, learning from your own mistakes, or better yet from other people’s, and getting really good at what you do.
Should I keep digging? Tell me in the comments, and hit the ❤️ if you want part two.
The company’s slogan is “Winners are welcome. Successful players sharpen our odds,” which kind of backs this up. I couldn’t find any independent research on it, but that’s the impression I got too. If anyone has something to add, let me know in the comments.
As far as I know, this is the simplest and most common way to remove the margin.






