Built a prediction-market arbitrage – no sizable arbitrage found

작성자

카테고리:

← 피드로
DEV Community · Michael Mustopo · 2026-07-09 개발(SW)

Michael Mustopo

I tried to build an arbitrage bot between Kalshi and Polymarket. Sports seemed to be the easiest because the matcher is relatively easy compared to the other markets (economy, bitcoin, weather, etc.)

The matcher worked, we got about ~98% of the sports and e-sports market. But there’s barely any sizable arbitrage between Kalshi and Polymarket, and what shows up closes in under 10 seconds.

For the Argentina vs Egypt, the match with the disputed VAR call and Argentina’s stoppage-time comeback from two goals down. Every price swing on that match, including the two around the VAR call, closed inside about 45 seconds. Total arbitrage opportunity net of fees across the whole match: $439, against $20.8 million moving through Polymarket’s market alone and $13.8 million in Kalshi open interest. (https://dino.markets/blog/argentina-egypt-var-price-gap)

That’s not an arbitrage opportunity. That’s what an efficient pair of order books looks like once you finally have the tooling to watch them at the same time.

I logged this properly over a full day too: 870 cross-venue price gaps in one 24-hour window, median time open about 9 seconds, 96 percent closed inside 30. (https://dino.markets/blog/how-long-a-mispricing-lasts). So I shipped the Polymarket-Kalshi sports market matcher as an API instead of an arbitrage trading bot. It turned out the matcher itself was the useful part.

Free REST access to the matched feed and the confirmed-arb view, 60 requests a minute, MCP server included so an agent can read it without you writing a client.

Planning to open source the matching engine itself at some point. After that, either extend it to other market pairs between Kalshi and Polymarket, or look at arbitrage against traditional sportsbooks. Nothing locked in yet.

Feel free to use it and tell me what you think about it. Thanks!

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다