One of the great things about Kalshi is that, unlike traditional sportsbooks, you're not really competing against "the house" but more against decentralized peers. For those that don't know, "courtsiding" means being physically present at a sporting event and betting on things you see live before they're priced into the market. Obviously sportsbooks want to prevent this because it's clear adverse selection, 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, it doesn't go through.

Kalshi has no interest in preventing this. It 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.)

I built a program that turns hotkey presses into trades. Up arrow → Python grabs the live ask price off the Kalshi WebSocket → signs a buy order with my private key → fires it at Kalshi → fills instantly or not at all, all roughly in 100–200ms. A friend and I went to a Prairie View A&M at Texas Southern basketball game as a first test, and it worked. We walked out up over a hundred bucks after the game went to overtime. It was a proof of concept that while markets react fast, we can react faster, and if we scale up our sizing we can make legitimate money. The problem with basketball is that it's too continuous. You want a sport where win probabilities swing dramatically on a single play, and with basketball you're basically hoping the game is tied in the final two minutes. Baseball is the perfect sport for this, since run scoring always produces an immediate swing in win probability.

I was skeptical this would scale to MLB, as stadium Wi-Fi is notoriously bad, and MLB draws enough sportsbook interest that the markets are genuinely 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. The Sam Houston basketball game 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 that I think is genuinely interesting.

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 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.

In theory, 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.

Our fundamental problem was that market makers 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. They applied the same logic to the game as a whole.

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 kind of incredible. 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, tens of 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. 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.