One of the great things about Kalshi is that, unlike traditional sportsbooks, you're not really competing against "the house" but instead against decentralized peers. For those unfamiliar, courtsiding is the act of betting on events you see live before they're priced into the market. Sportsbooks have a strong incentive to prevent this because it gives you an information advantage, so they've all instituted delays where a bet goes on hold for a couple of seconds, and if the odds shift too much in that window, the bet gets voided.

Kalshi has no interest in preventing this. Courtsiding actually increases trade volume and fees, and they're just the exchange rather than my counterparty. (Well, technically Kalshi Trading LLC is Kalshi's own in-house market maker, but that's mostly for less liquid markets.)

So I decided to try it myself and built a program to execute trades as fast as possible. Press a hotkey and Python grabs the ask price off the Kalshi WebSocket, signs a buy order with my private key, and it fills instantly or not at all, all roughly in 50–100ms. A friend and I went to the Prairie View A&M versus Texas Southern basketball game as a first test and walked out a hundred bucks up after the game went to overtime. It proved we could react faster than the market, and if we scaled up our sizing we could make legitimate money. The problem with basketball is that the win probabilities move too continuously. You want a sport where the odds swing dramatically on a single play, and with basketball we needed the game to be tied in the final three minutes for our efforts to be worthwhile. Baseball is the better sport for this, since scoring a run always produces a sudden swing in win probability.

I was skeptical this would scale to MLB, as stadium Wi-Fi is notoriously bad, and MLB probably draws enough sportsbook interest that the markets would be faster and more liquid than anything we'd dealt with.

But we went to Opening Day anyway, and much to my surprise, we walked out with about six hundred dollars in profit. Daikin Park has great Wi-Fi, and the market was surprisingly slow because there's a lot of retail volume. Even Sam Houston basketball games had a faster market.

The Astros were playing the Angels, and it was scoreless through six innings, so we were just sitting there, and then the Angels hit a solo homer in the 7th, 8th, and 9th to win 3–0. Between innings there's maybe tens of thousands, maybe $100k+ of liquidity on both sides with tight one-cent spreads, but when the at-bat starts it thins out. Market makers can't pull everything, though. Someone has to provide the market or it's not usable for anyone, and that's enough for us to get $2–3k+ in at reasonable prices. All we did was watch the ball leave the park and hit the hotkey.

You can probably tell that if this did actually work long term, I wouldn't be here writing about it. But this exercise taught me a ton about trading from first principles.

One of our biggest challenges was exiting positions. The same way everyone wants to buy options but nobody naturally sells them, retail traders love to buy "yes" rather than sell. This means market makers are providing much more liquidity on the asks than the bids.

Total markets P&L — Over 6.5 runs Boston vs Houston
Boston vs. Houston, Total Runs market. The Over 6.5 position carried a $3,019 cost basis and settled at +$36.88.

For example, comebacks are pretty profitable because even going from 5% to 10% doubles your money. There was a moment late in a game where the Red Sox had a pretty low win probability, hit a run, and their odds jumped from 4% to 12%. We entered for $2k+ on the ask, but there was little to no liquidity on the bids, and we were stuck holding much of it until the end of the inning, at which point their comeback hopes had crumbled. We also tried expanding into "total runs scored" markets, and when a 5th run was scored with several innings left to go we immediately bought the over 6.5. But because the market was close enough that nobody wanted the adverse selection of offering it, the spread blew out to 30–70. We couldn't exit without taking massive losses even though we were very profitable in expectation. So we slowly sold out with limit orders as liquidity refreshed, took a loss on most of it, and ultimately the over 6.5 did hit, netting us a total of $35 on a trade we should have made multiples on.

A natural solution to the exiting problem would just be to hold your positions. If you're only making positive EV trades, then over enough trades you realize the edge. But you need a large bankroll relative to a single trade for that to work, and our total was only $4k. We needed to isolate purely the market information edge and not carry game exposure, so we became far more selective, only taking positions where the probability shift is large and permanent enough that we're profitable no matter what happens the rest of the inning.

Tweet about courtsiding baseball games
A few weeks into the season, other traders were openly discussing the courtsiding strategy.

While we were successful for the first couple of weeks, market makers eventually got more sophisticated. I knew it was probably over when I saw tweets about courtsiding MLB games. The strategy had become saturated to the point where the retail-to-informed ratio shifted enough that market makers got ridiculously good at pulling liquidity. Take the individual home run markets (e.g. "Will Altuve hit a home run?"). Even on opening day, when Altuve is at bat, his home run market had literally no liquidity, maybe a couple of bucks. Because if he actually hits one, anyone who offered that market gets railed by adverse selection, so there's no benefit in offering it to begin with. Eventually, the whole game market worked the same way.

Orderbook with full liquidity during timeout Orderbook with liquidity pulled as play resumes
Kalshi NBA Playoff orderbook during a timeout (top) and the moment play resumes (bottom). Same market, roughly one second apart.

The timing precision is pretty impressive. As soon as the pitcher winds up, nearly all the liquidity gets pulled until maybe a few hundred dollars is left at reasonable prices, and the moment the batter swings and misses and the catcher catches the ball, thousands of dollars flood back in. Someone built a system that just knows when adverse selection might occur and pulls all quotes. Given the scale of the liquidity moves and speed, and given how widespread this is across all sports, it's definitely the institutions.

I've given some thought to whether we should do market making. If we're at the game we have a better sense of when adverse selection might occur and can be more aggressive providing liquidity. But market making needs scale, and if the spread is one cent and you get a thousand filled each side, that's $20, about the cost of one ticket. And we can't guarantee our position will be balanced, and we don't have the bankroll to let many slightly positive EV trades converge in the long run.

Which makes me reflect on my original idea of Kalshi as a true peer-to-peer platform. Their marketing loves to frame it as this giant meritocracy, but sports is 70% of Kalshi's trading volume and when there's that much money involved you attract institutions, whether it's Flutter (FanDuel's parent company) or firms like Susquehanna. The institutions are basically all the liquidity. So how peer-to-peer is it really, when it's extremely likely your counterparty is a firm that's very sophisticated at pricing these events? It's hard to see how that's meaningfully different from a sportsbook, commodity loophole or not.