I ran an arbitrage bot on Polymarket. Here are the real numbers
kacho.io> I had a bug for a while where the implied probabilities for the two teams were swapped,
I've seen Claude do that too. Also another common one of making the Booleans the opposite of what they should be.
Yes, that's what happens when you code with AI and overlook things. I remember this specific bug vividly and that's why included it in the article. The bot was matching the implied probs from the odds for a game without matching the teams first. Sometimes bookmakers had Team A vs Team B, where Polymarket had Team B vs Team A for whatever reason and the code was not checking for this scenario. Not my proudest bug, to be fair..
I ran this bot Jan-late March 2026: 3,858 bets, ~$5k net. It never predicted a winner - it scraped sportsbook odds, de-vigged them to a fair price, and posted limit orders on Polymarket esports markets where the spread was wide enough (often 20–30¢) to lock an arb across both sides.
The part I found most interesting to write up - the split by bet type where the guaranteed arbs made +$8.3k, but the directional lost -$3.2k. Those legs were placed with the same ≥7% edge as the arbs, so a bet like that should make money. Mine didn’t, and pulling apart why (stale quotes getting picked off by faster bots, a sign-flip bug, a devig method that ran hot on favourites) is covered in the post but not in full detail as that’s a long topic that deserves its own write up.
The whole track record is in public (polymarket.com/@b00k13) if you want to pick it apart - including the months the win rate slid and the edge decayed, which is why I eventually switched it off. Coded almost entirely with AI. Happy to answer anything.
So you placed limit orders at the same time but sometimes only one of them filled? Do you think it would be possible to reduce the frequency of that happening by adjusting the limits? Less profit per arb but reduce risk of missing a leg
When you place limit orders for such markets (high spread and mediocre volume at best) they don’t get filled quickly. You just bid at best_bid + 1c and wait. I think the average fill time is ~25 minutes if I remember correctly. For this specific strategy, there’s no workaround for avoiding the directional bets. Every arb is a directional bet that eventually got arbed.