Kalshi Chess Market-Making — Research & Data Capture
kalshi-mm • 2026-06-01
TL;DR
We're exploring market-making chess tournaments on Kalshi. Tonight was research + infrastructure: confirmed the opportunity is real but unproven, settled the one time-critical technical question (orderbook depth is live-only, not recoverable later), and shipped a read-only logger now capturing every open chess market on the VPS. The ultimate target is the Sinquefield Cup (Aug 8-21); live Norway Chess (ends June 5) is our proxy dataset to learn the microstructure first.
The thesis
Chess markets on Kalshi are real and recurring (~8-12 series/year + a monthly FIDE-rating market), but tiny - sports is 80%+ of platform volume.
That thinness is both the opportunity and the risk: little competition + Kalshi liquidity incentives ($10-$1,000/day per market) on one side; low volume + adverse selection from informed chess bettors on the other.
Almost nobody is market-making chess specifically. Generic Kalshi MM is well-trodden (open-source bots, full API), but chess is an open niche.
The edge is likely incentive capture, not spread capture - and an early data point supports this: spreads on the Norway favorites are already tight (1c on Carlsen/Firouzja).
Research findings
Retroactive (pullable anytime): 1-min candlesticks (with bid/ask OHLC), trades, settled-market metadata.
Live-only (gone forever if not captured): full orderbook depth + sub-minute book state. This is why we built a logger tonight - the MM edge lives in exactly this data.
Auth surprise: read-only market data (including full orderbook depth) works with a plain Bearer token - or even no auth. No RSA-PSS signing needed for reads. We reused the existing SharpLab Kalshi key.
Calendar: after Norway Chess there's a June-July lull (ideal build window), then a dense August cluster: Saint Louis Rapid & Blitz (Jul 31-Aug 7), Sinquefield Cup (Aug 8-21), GCT Finals (Aug 21-28).
What we built
A read-only async REST logger (~/code/chess/kalshi-mm), deployed as the kalshi-chess-logger systemd service on the VPS (/opt/kalshi-chess-logger, auto-restart on failure). It:
discovers all open chess markets across every series
records top-of-book (best bid/ask, volume, OI) every ~8s - cheap, one call per series
records full orderbook depth per market (~5s for live Norway, looser for slow futures)
writes SQLite: markets, tob, book tables
It places zero orders - pure capture. The order path (authenticated, RSA-signed) comes later, only after the strategy is built.
Live data we're capturing right now
63 open chess markets: Norway Chess (12), World Championship (9), FIDE rating (42)
Verified live on the VPS: depth ladders flowing, snapshot lag ~5s, no rate-limit errors
Example - Norway men's winner market (latest implied win probabilities + spread):
| \1\1\1\1\1\1 | \1\1\1 | \1\1\1 | \1\1\1\1\1\1 |
| \1\1\1\1\1\1\1\1\1 | \1\1\1\1 | \1\1\1\1 | \1\1 |
| \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1 | \1\1\1\1 | \1\1\1\1 | \1\1 |
| \1\1\1\1\1\1\1\1\1\1\1\1\1\1 | \1\1\1\1 | \1\1\1\1 | \1\1 |
| \1\1\1\1\1\1\1\1\1\1\1\1\1\1 | \1\1\1\1 | \1\1\1\1 | \1\1 |
| \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1 | \1\1\1\1 | \1\1\1\1 | \1\1 |
The plan
1. Now -> June 5: capture Norway Chess as the proxy lab (running).
2. June-July (the lull): analyze the depth data - real spreads, depth profiles, how books move around games, realistic incentive capture vs. adverse-selection bleed - and build the MM strategy.
3. Aug 8-21: deploy on the Sinquefield Cup (with an authenticated order path added by then).
Open questions / risks
Does the incentive pool beat the adverse-selection bleed on thin chess books? This is the whole question; the Norway data will size it.
Tight spreads observed (1c on favorites) mean little spread-capture room - reinforces that the edge is incentives, not the spread.
Adverse selection is the chess-specific killer: strong public engines mean informed traders pick off stale quotes in the seconds after a board event. Sub-minute depth data will let us measure how fast books go toxic.
Sinquefield series ticker unconfirmed: KXSINQUEFIELD is dormant (0 markets now). Must verify the exact ticker before Aug 8 so capture auto-starts - it may live under a GCT umbrella.
Recommendations (next session)
1. Let it run - nothing needed now; data is accumulating through June 5.
2. First analysis pass once a few rounds are captured: spreads, depth profiles, and book toxicity around game start/finish - to start sizing the real edge.
3. Verify the Sinquefield ticker before August (tracked as a task).