▶ Full Post Text
Disclosure: my bot, my wallet (@b00k13, all on-chain), and I write it up on a blog - I'll keep the link to a comment so this stays a discussion, not a funnel.
The setup, and it's not predictive at all: the edge is purely cross-venue. De-vig sharp sportsbook odds, that's the fair value, then post limit orders on Polymarket's esports markets at a minimal 7%+ edge. And I can only ever post and wait, never just grab a fill: in these wide markets the ask sits way above fair value, so crossing the spread to buy would wipe the edge out. That passive-only constraint is the whole reason both legs can't fill on demand. Both legs fill, it's a locked arb. One leg fills, you've got a directional position that in theory should still be profitable.
The P&L, all four lines so it actually reconciles:
Arbitrage: +$8,293
Directional: -$3,184
Cancelled matches: -$134
Net realised: +$4,973
3,858 fills, \~$96k volume, 47.5% win rate. Sub-50 is expected here - the hedge legs sit deliberately on the less likely side, and the profit's locked across the pair, not won on either leg.
The bit worth discussing: you can't capture the arb cleanly in a thin book. Post passively, and one leg fills before the other - so you stop quoting that side and work the hedge on the other team. When the hedge doesn't fill (price moved, match started), you're holding the unhedged leg. By design, not a bug.
Here's the interesting part: that leftover leg went on at a 7%+ edge, so a book of them should be +EV. Mine ran -$3,184. So the real question isn't "why take directional bets" - it's why a book of supposedly +EV bets lost money. The answer is execution: adverse selection from faster market makers picking off my stale quotes, a sign-flip bug that had me on the wrong team for a while, a devig method (Shin's) that ran hot on favourites, and many other reasons. I will dedicate a separate post purely for this analysis, as that was the hardest part of running the Polymarket bot. LoL's the clearest: +$1,983 on arb, -$1,480 on the directional, so a market that should've been a goldmine netted +$502.
Why it decayed: win rate went 50.2 -> 48.3 -> 43.4 monthly as competition turned up and fees got introduced. Feb +$2,506, March +$390, so I switched it off. I did run calibration (Brier) on the de-vigged fair values to check whether the directional losses were variance or genuine mispricing - happy to get into that below.
Stack's Python, vibe-coded if I'm honest, and I'm rewriting the core in Rust for correctness and speed. Wallet's public, pick it apart.