Adverse selection eating away my Polymarket bot's arbitrage profits

kachoio1 pts0 comments

Adverse selection eating away my Polymarket bot arbitrage profits. · Kacho

WritingAt the end of the last post about my Polymarket market-making bot I said the forced directional bets lost $3,184 . If you haven't read that part, start there first. The problem with those bets was that they were each supposed to carry a minimum 7% edge, and yet they consistently lost me money. The whole point of this post is figuring out why. So I built an analytics stack and went digging.

There's no single villain. The ROI didn't fall off a cliff for one clean reason - it got eaten by a handful of separate things at once. Some based on assumptions I made, some structural. But if I had to point at the one that did the most damage, that's being exposed to adverse selection - my prices were too slow, and I was getting picked off.

Again, you don't have to take my word for any of it as my wallet is public - polymarket.com/@b00k13 - all the bets I've taken for my esports bot are here. By the way, you may notice that the bot is now live and trading again. I'm currently doing a lot of improvements like rewriting the scrapers and the bot itself. I will touch on that in some of my next posts as I'm doing all of this in my free time and I haven't had much of that recently.

Anyway, I'd like to mention one honest caveat first before going all-in into the analysis - I didn't record orders from day one . I only started logging properly once I was already bleeding and couldn't see why, so some stats here are mostly the back half of the run. Flying blind until the losses forced me to create the dashboard is one of the first mistakes I made while working on this.

Adverse selection: the edge was real when I quoted it and gone when I got filled

The whole strategy (which I described in detail in the previous post) depends on one number - the fair probability I compute from the bookmaker odds. Put simply, I place bids a cent above the best bid and at a minimum 7% edge, wait for a fill, and then try to hedge. The weak point is that my fair value is only as fresh as my odds - and my odds were, at worst, 30 minutes stale .

At the time, I assumed that didn't matter much for prematch markets. Well, it most certainly does. Prematch lines move more than you'd think, which is especially the case with esports games - a 10-15% swing before going live is normal , on news, lineups, late money. And when the line moves, my bid doesn't - and that's exactly what cost me on the games and moments where the line actually moved.

Here's the exact way it works. Say I've got a resting bid on Team X at 60¢ , because my fair value says X is 67% to win - a clean 7% edge, exactly what I'm fishing for. Then the real line moves. Some key player at team X sprains his wrist and is called off the game, and the true fair drops to 50% . My 60¢ bid is now a gift sitting on the book. Whoever has the up-to-date odds lifts it and pockets a ~10% edge against the true price - and I get filled at what my stale number still calls +7% and in reality I'm at a -10% loss .

That's adverse selection, and it's the structural reason a book of "+EV" bets can quietly bleed. This may be obvious to you if you've got experience in market making. Unfortunately, it wasn't obvious to me, and I had to learn it the hard way. Thankfully, a decent chunk of my good orders were getting filled at the time (including the arbitrages), and that was making up for all the losses I was taking from adverse selection. As I said, I had to find out what adverse selection is from personal experience, so how did I pick it up?

Long story short, in one of my analysis scripts I noticed that I had positions at a negative edge compared to the current odds. I did a deep dive to figure out why this happened. I could not attribute the negative edge to any bug, so I started recording the odds over time. Then I created a script that measures the odds swings, which is what you see in the table below.

GameMatchesMedian jumpBig jump (5pp+)CoD9810.9pp60% LoL2994.9pp49% Dota 24153.1pp37%CS21,3011.9pp31%MLBB290.0pp28%SC21120.0pp17%Valorant2660.1pp12%R6350.0pp0%

These are the results from historical odds I've recorded for the March 6 - 20 period. Across all 2,555 matches , the line jumped 5pp or more in nearly a third of them while my bid was just sitting on the book. But it's wildly uneven, and it's the game that decides it. A typical Valorant or R6 line barely twitches. CoD is a different animal - it moves 10.9pp in the median match , and 60% of them throw a 5pp+ jump. LoL and Dota 2 are the other real movers, and in the tail it gets worse - a LoL or Dota line can lurch 30pp before going live. That's the part that stings - LoL was my single biggest losing game , and its lines move about more than almost anything I traded.

One honest note on this data - the odds were sampled every ~7-8 minutes, so it tells you where the lines move, not the second-by-second texture. The results you see in this table cannot give you a complete...

odds adverse selection edge line from

Related Articles