Kalshi-Polymarket Divergence Arb
Cross-platform price divergence trading between Kalshi and Polymarket.
What It Does
Polls Kalshi's public API for live prices across 13 event series and compares them to equivalent Polymarket markets found via SimmerClient. When prices diverge beyond threshold, the cheaper side is likely underpriced.
Covered Series
| Series | Category | Description |
|---|---|---|
| KXBTC, KXETH, KXSOL, KXXRP, KXDOGE | Crypto | Price threshold markets |
| KXFED | Macro | Fed rate decisions |
| KXCPI | Macro | CPI prints |
| KXUNEMP | Macro | Unemployment data |
| KXGLD, KXOIL | Commodities | Price threshold markets |
| KXNASDAQ, KXSPY, KXINX | Indices | Index level markets |
Signal Logic
- BUY — Polymarket price is >8% below Kalshi equivalent (Polymarket underpriced)
- SELL — Polymarket price is >10% above Kalshi equivalent (Polymarket overpriced)
- Asymmetric thresholds account for Polymarket's typically lower liquidity
Requirements
pip dependencies: simmer-sdk, requests
Environment variables:
SIMMER_API_KEY(required) - get from simmer.markets/dashboard
Dry-run by default. Pass
--liveto execute real trades.
Usage
python kalshi_divergence.py # dry run (default, no trades)
python kalshi_divergence.py --live # real trades via SimmerClient
python kalshi_divergence.py --live --quiet # cron mode
Security and Credential Handling
- All trades go through
SimmerClient.trade()only. No direct CLOB or wallet access. - The script reads only
SIMMER_API_KEYfrom the environment. No other secrets are used. - No wallet private keys are required or read by this script.
- Dry-run is the default. The
--liveflag must be explicitly passed to execute trades. automaton.managedisfalsein clawhub.json: the skill does NOT auto-execute.
Trade Execution Path
kalshi_divergence.pyfetches Kalshi public prices via HTTPS GET (no auth needed)- Finds matching Polymarket markets via
SimmerClient.find_markets() - Compares prices, applies thresholds (BUY >8%, SELL >10%)
- If
--live: callsSimmerClient.trade()with market_id, side, amount, reasoning - If dry-run (default): logs the signal but does NOT execute any trade
Remixable Template: Fork this skill to add new Kalshi series, adjust divergence thresholds, or add position sizing based on gap magnitude.
