Strategy · Low risk · Beginner
Resolution arbitrage
Near expiry, when the outcome is effectively certain, prices sometimes still trade at 97–98¢ instead of 99.5¢. Capture the last pennies.
Published Apr 10, 2026
The idea
As a market approaches resolution and the outcome becomes effectively certain, the price should trend to $1 on the winning side and $0 on the other. In practice, it lingers. Thin late-market liquidity, tax-lot optimisation by holders, and plain laziness keep prices at 97¢ or 98¢ when they “should” be 99.5¢.
resolution_arb buys those residuals. Per-trade edge is small (1–3 cents); volume is the point.
How polybot implements it
The strategy applies three filters before buying:
- Time-to-resolution < T (default 24h).
- Signal strength. An external signal — a resolution source, an AI plugin, on-chain event — must mark the outcome as near-certain. polybot ships adapters for common resolution sources (Kalshi’s own announcements, Polymarket’s resolver addresses, Chainlink price feeds).
- Edge >= min_edge after fees.
if market.time_to_resolution < self.config.window \
and self.resolver.certainty(market) >= self.config.min_certainty \
and (1.0 - market.best_ask) >= self.config.min_edge:
self.emit(Signal(market.id, side="YES", price=market.best_ask, size=size))
Where the edge comes from
- Liquidity providers leaving. Market makers disable auto-quoting 6–12h before resolution to avoid adverse selection. Books go thin; a few stale asks remain.
- Tax-loss posturing. Some large holders let positions decay rather than close, for tax reasons on the fiat side.
- Fee avoidance. Some traders prefer to hold to resolution (no fee) than close at 98¢ (fee applies).
Where it fails
- Wrong-way resolution. The “near-certain” outcome isn’t. This is the kill shot for the strategy: a 2¢ edge gets wiped out by one market where you buy at 97¢ and it resolves to 0. polybot’s
min_certaintygate and conservative time window are the defence; in shadow mode, monitor the frequency of sub-95% certainty overrides. - Fee schedules. On Kalshi, per-contract fees can exceed the edge on low-priced residuals. polybot computes net edge correctly, but you’ll see this filter most opportunities out.
- Market cancellation. Rare but real — a market gets voided and your position refunds. Opportunity cost only, but it happens.
Configuration
polybot strategy enable resolution_arb
polybot strategy config resolution_arb \
--window-hours 24 \
--min-certainty 0.97 \
--min-edge 0.015 \
--max-size-usd 200 \
--resolver oracle_aggregator
FAQ
Why not wait for 99.9¢ and take zero risk? You’ll never get filled. By the time certainty is that high, asks are pulled entirely.
Does this conflict with arbitrage? No — different time windows and different edges. You’ll want both enabled in live mode, with --markets-exclude if you see one front-running the other on specific markets.
What resolves “certainty”? A pluggable resolver. polybot ships oracle_aggregator (combines on-chain resolvers, news feeds, and an LLM sanity check). You can supply your own.
Source: src/polybot/strategies/resolution_arb.py.
Want this strategy tuned for your book?
Cryptuon can adapt polybot strategies to your capital, risk budget, and markets. Shadow-deployed before you go live.