Pair arbitrage on prediction markets — locking profit when YES + NO misprices

How to exploit the YES + NO = $1.00 constraint in binary markets, cross-platform mispricing, and daily threshold market momentum swings.

Definition

Pair arbitrage in prediction markets exploits the mathematical constraint that YES + NO shares in a binary market must sum to exactly $1.00 at resolution. If you can buy YES and NO simultaneously for less than $1.00 total, you have a locked profit regardless of outcome.

This sounds like free money — and in pure form it is. The difficulty is that liquid markets rarely offer YES + NO below $0.98 for long, because automated bots close the gap within seconds. The two practical implementations are: (1) cross-platform arbitrage, where the same underlying event trades at different prices on Polymarket and Kalshi simultaneously, and (2) intra-day momentum arb on daily threshold markets, where volatile price swings briefly push both YES and NO to discounted levels.

When it works

Cross-platform price divergence. Polymarket and Kalshi both list "Will BTC close above $X on date Y?" markets. Their user bases and market-making infrastructure differ. Institutional participants with co-location on one platform but not the other create temporary price divergences. A 3-4 cent spread between platforms — Polymarket YES at $0.52, Kalshi YES at $0.56 — translates to a risk-free $0.04 per share if you can execute both legs simultaneously.

Intra-day swing on daily threshold markets. BTC daily threshold markets ("will BTC be above $67,000 at market close?") open in the morning and move dramatically as the underlying asset swings. When BTC drops 2%, YES crashes from $0.55 to $0.35 and NO spikes to $0.68. Combined: $1.03 — no arb. But if BTC then rebounds and YES recovers to $0.55, NO may lag at $0.50. Combined: $1.05 — still no arb. The opportunity appears during the lag between a price move and market repricing: YES jumps to $0.65 before NO has fallen from $0.42. Combined: $1.07 — still nothing. The actual arb window is: YES at $0.45, NO at $0.52. Combined: $0.97. Lock $0.03 per share.

polydaily's approach is not strict arbitrage — it is momentum-aware accumulation on both sides. It buys YES when price is depressed (BTC oversold relative to the daily close target) and NO when price is elevated. When both sides have been filled cheaply enough, the combined cost is below $1.00 and profit is guaranteed. This requires patience and monitoring, not simultaneous execution.

Oracle timing differences. On cross-platform arb, Polymarket uses Chainlink RTDS while Kalshi uses their own data provider. If one platform resolves 30 minutes before the other, the "locked" arb is not actually locked — you can be stuck holding one unresolved side during that window.

When it fails

Execution slippage destroys the spread. A 2-cent arb spread sounds profitable until you account for the taker fee on both legs. At p=0.50 on both sides, each leg costs roughly 1.56% notional in fees. A 2-cent arb on $1.00 face value generates $0.02 gross profit; two taker fees at mid-price consume more than that. Arb is only viable when the spread significantly exceeds the total fee cost on both legs.

Single-leg fills. You place a taker order on Polymarket YES and it fills immediately. You simultaneously place a taker order on Kalshi YES (to short, i.e., buy NO equivalent). The Kalshi order fails due to a rate limit, API error, or the price having already moved. You are now directionally long YES on Polymarket with no hedge. Robust implementations use FOK orders and cancel both legs if either fails.

Liquidity asymmetry. The arb opportunity exists precisely because one platform has less liquidity. You buy the cheap side easily but cannot fully fill the expensive side. You end up partially hedged — which is better than nothing but not the arb you modeled.

Capital lockup duration. Daily threshold markets resolve once a day. Locking $200 in a YES+NO position for 8 hours earns $6 (3%). That's excellent return if you have spare capital, but the opportunity cost of having $200 tied up versus deploying it in faster-cycling scalp trades must be considered.

Platform resolution risk. Kalshi occasionally pauses or cancels markets due to regulatory reasons. Polymarket has disputed resolutions. If the two platforms resolve differently (one YES, one NO on the same underlying), the locked position becomes a loss instead of a guaranteed profit.

Fee math

The viability of pair arbitrage is entirely determined by whether the combined spread exceeds the total fee cost. Both legs:

fee = shares * 0.25 * price * (price * (1 - price))^2

For a 50/50 YES+NO arb at p_YES=0.48, p_NO=0.50, 100 shares each:

fee_YES = 100 * 0.25 * 0.48 * (0.48 * 0.52)^2 = 25 * 0.48 * 0.062 ≈ $0.74 fee_NO = 100 * 0.25 * 0.50 * (0.50 * 0.50)^2 = 25 * 0.50 * 0.0625 = $0.78 total_fees = $0.74 + $0.78 = $1.52

Entry cost: $0.48 × 100 + $0.50 × 100 = $98.00 Guaranteed proceeds at resolution: $100.00 Gross arb: $2.00 Net after fees: $2.00 - $1.52 = $0.48 profit on $98 capital = 0.49%

At p_YES=0.45, p_NO=0.52 (combined $0.97), the fee arithmetic changes:

fee_YES = 100 * 0.25 * 0.45 * (0.45 * 0.55)^2 = 25 * 0.45 * 0.0609 ≈ $0.69 fee_NO = 100 * 0.25 * 0.52 * (0.52 * 0.48)^2 = 25 * 0.52 * 0.0623 ≈ $0.81 total_fees = $1.50

Entry: $45 + $52 = $97. Proceeds: $100. Gross arb: $3. Net: $1.50.

The minimum combined price below $1.00 to break even:

# With two legs near p=0.50 (worst case fees): # Both legs at p=0.50 cost max fees ~$1.56 total per 100 shares # Need gross > $1.56, so combined entry < $98.44 # Or: YES + NO < $0.984

At wings (p=0.15, p=0.80), fees drop dramatically:

fee_YES = 100 * 0.25 * 0.15 * (0.15 * 0.85)^2 ≈ $0.102 fee_NO = 100 * 0.25 * 0.80 * (0.80 * 0.20)^2 ≈ $0.512 total = $0.614

Wing-biased pair arb is much more fee-efficient. Seeking situations where YES is 0.15 and NO is 0.80 (combined $0.95) for a $4.38 net after fees on $95 capital = 4.6% return.

Real-world examples

On a typical BTC daily threshold market, BTC opens at $67,200 against a strike of $67,000. YES is priced at $0.62, NO at $0.40 — combined $1.02. No arb. By midday, a drop to $66,800 pushes YES to $0.38 and NO to $0.64 — combined $1.02 again. Still no arb.

At 3pm, a small rally pushes BTC back to $67,050. Market makers haven't fully updated both sides: YES is $0.55, NO is $0.43. Combined: $0.98. polydaily was already holding YES from the morning dip at $0.38. It now buys NO at $0.43. Combined position cost: $0.38 + $0.43 = $0.81. At resolution (market closes at end of day, BTC at $67,150, YES resolves), the YES side pays $1.00 per share. Net: $1.00 - $0.81 - fees ≈ $0.18 per share. polydaily didn't wait for a simultaneous arb — it accumulated both sides opportunistically over the day.

For strict cross-platform arb: a November 2025 US election market showed Polymarket pricing a state race at YES=$0.52, while Kalshi showed YES=$0.57 for the same outcome. A trader buying YES on Polymarket and NO (equivalent to selling YES) on Kalshi would capture $0.05 minus fees. On 500 shares, that is roughly $25 gross minus $5-8 in fees = $17-20 net. The arb closed within 4 minutes as market participants on both platforms adjusted.

Common variants

Simultaneous cross-platform arb (arb scaffold): The arb bot provides the boilerplate for this: dual CLOB clients (Polymarket + Kalshi), simultaneous FOK order placement, lock file to prevent overlapping positions, and a main loop for continuous spread monitoring. You bring the signal — which markets to watch and what spread threshold to trigger on.

Intra-day accumulation arb (polydaily): Buy YES on dips, buy NO on spikes, wait for combined cost to fall below $1.00. Does not require simultaneous execution. Works on daily markets where both sides swing enough during the trading day.

NegRisk multi-outcome arb: On NegRisk markets (where mutually exclusive outcomes share a common margin pool), buying a basket of all outcomes must sum to $1.00 at resolution. If the sum of all outcome prices drops below $1.00 including fees, buying the full basket locks profit. This requires understanding NegRisk's specific payout mechanics, which differ from standard binary YES/NO.

Temporal arb: Buy YES on a 1-day market and NO on a 1-week market for the same underlying event. If the 1-day market resolves YES, you collect while still holding the NO position, which now has no directional risk. This only works if the markets are genuinely independent (different strike dates or different underlying instruments).

Statistical arbitrage (correlated outcomes): Two markets that should be correlated (BTC above $67K today AND BTC above $68K today) sometimes diverge. A spread trade — long the higher-certainty, short the lower-certainty — converges as the oracle approaches. This is not risk-free but has bounded downside when the correlation is structural.

Bots implementing this strategy

polydaily implements the intra-day accumulation approach for daily BTC threshold markets: it monitors BTC price throughout the day, buys YES on oversold conditions and NO on overbought conditions, and tracks combined position cost until a profitable locked pair is established. arb provides the cross-platform arbitrage scaffold: dual CLOB client initialization, atomic FOK order management, configurable spread thresholds, and a main loop with logging and position tracking. Both bots run in dry-run by default; pass --live for real orders.

Bots implementing this strategy