Prediction markets

A set of outcomes that pays a known amount whatever happens, bought for less than that amount: the difference is yours. We look for such sets the way the venues and the research describe them: rebalancing of an outcome group on one venue, and one event on two venues. From the books, after fees, for your capital. Across venues a match of events is a judgement: every pair shows its confidence and reasons.

How it is worked out

Rebalancing (the term of Saguillo et al., 2025, from Polymarket's trades) happens within one venue. Long: the best YES asks of every outcome of a group where exactly one wins sum under $1 after fees; buy the YES of each outcome, and one of them pays $1 at the resolution. Only for a group the venue states exclusive, read whole, with an outcome for everything else ("other", "draw") and no outcomes still to be added. NO of every outcome of a group is not shown. Only where the venue's docs promise at most one YES; each outcome once; the "Other" of a Polymarket group still adding outcomes is left out, as its docs say. YES + NO of one market is checked too, but on these venues the NO book mirrors the YES book: together they always cost $1 plus the spread.

Not shown, because it is not arbitrage: sums of displayed prices, midpoints and last trades (nothing can be bought at them); YES of every outcome when the list of outcomes is incomplete; NO of every outcome when the outcomes do not exclude each other (ladders of dates and thresholds, "which states will … win"); one outcome twice; buying the legs one after another; play money. Combinatorial arbitrage across logically linked markets is not built: the venues do not publish which questions depend on which, and a link guessed from titles is an invented basket.

A leg's price is the best offer (ask) in the venue's book; on a mirrored book the NO ask is 1 minus the YES bid. Depth walks the book: sets are bought while the next one still costs less than it pays, until the capital or the book runs out. Where there is no depth, one set is costed at the best price and the depth is shown as unknown. The venue's minimum order size is not taken into account.

Cross-venue arbitrage is the Polymarket–Kalshi bots' test: the YES ask on one venue plus the NO ask of the same event on another under $1 after fees; both legs are held to the resolution. Sports sets are the same test for one game and one bet, matched on the league, the sides, the start, the bet type and the line, with the settlement rules compared from their text. Other events are matched on the title's words, numbers (thresholds, dates), the side of the outcome, the end date and the resolution source. Different numbers, years, months, direction ("above" and "below"), party, or end dates more than a week apart are not a pair. Venues can resolve the same event differently, so every such row says "resolution conditions may differ" unless both publish the very same rules text.

Totals and handicaps on different lines of one game (on two venues or on one) are checked with a payoff matrix: for every possible final score, what the legs pay under their own markets' rules. A basket is built only when it pays at least $1 whatever the score and every leg pays alone somewhere. Example: over 2.5 on one venue and under 3.5 on another pay both ($2) on exactly 3 goals and one ($1) on any other score. Net and net % use the minimum payout only. A match result with a draw on three venues takes each outcome once, at the best ask. Live: every leg at most 10 seconds old, the legs at most 5 seconds apart (from the venues' measured delays), and both read after the last change of score as Polymarket and Kalshi publish it; where no score is published the row says "game state not confirmed" and generates no bot signal. Each card shows the highest value in its column among the filtered rows. Stale quotes and differing rules are flagged but do not affect which value is shown.

Taker fees follow each venue's rules, below. Where a market's fee is unknown, no net is stated. Days to the payout run to the last resolution date of the legs; the annual rate is simple, without compounding. Capital is in dollars; USDC, USD1 and dollars on a Kalshi account are different money, and 1:1 between them is not guaranteed.

Market lists are read every 2–4 minutes, the candidates' books every 20 seconds. A leg older than 5 minutes, or legs more than 3 minutes apart, are marked ⚠. The site only shows data: it does not trade and asks for no keys.

Venues and fees

Polymarket: takers pay shares × the category rate × p(1−p) (0 on geopolitics), makers nothing; settles in USDC; close-only in the US, UK, Germany, France, Russia and other countries, closed in sanctioned regions. docs

Kalshi: takers pay 0.07 × the series multiplier × C × P × (1−P), rounded up to the cent; settles in dollars; a CFTC-regulated exchange, trading under the Member Agreement, whose restricted jurisdictions include Australia, Canada, France, India, Singapore and the UK. docs

Limitless: takers pay 5% × (1 − price) of the USDC value on new venues, 0.40–3.00% of the shares bought on legacy books (no formula published, counted at 3%); settles in USDC; trading unavailable from the USA, China, Ontario and Alberta. docs

Myriad: takers pay the market's taker_fee_bps_array rate for its price, makers nothing; settles in the market's token (USD1, USDT, USDC); no country restrictions in its docs. AMM markets are not read. docs

Hyperliquid: fees are charged only when closing or settling a position and no outcome rate is published, so no net is stated; settles in USDC; data from the public info API without a key and its WebSocket. docs

Opinion: takers pay the topic rate × p(1−p) of the notional, 0–1 %, at least $0.25 a fill; the topic rate is not in the API, so 1 % is counted (a lower bound); settles in USDT; its terms bar trading from the US, UK, France, Ontario, Singapore, Poland, Thailand, South Korea, China, Taiwan and Hong Kong. Only the documented public API is read, not the site. docs

Binance: Binance Web3 Wallet predictions: every request, market data too, is signed with a key. Off until you set a read-only key with npm run predictions:setup; the API's fee rate has no stated unit, so no net is stated. docs

SX Bet: takers pay 1% of the profit of a winning bet, makers nothing; the rate is set per account, so 1% is counted on every leg (a lower bound); settles in USDC; a cancelled game is void and every stake is returned, unlike other venues, so its forks are marked ⚠. The market list is open; prices are read with an API key. docs

Predict.fun: takers pay the market’s base rate (feeRateBps, 200 = 2%) × min(price, 1 − price) a share, 10% less with a discount; makers nothing; minimum order 1 USDT; resolved by the UMA oracle under each market’s rules. Every endpoint, market data too, is read with an API key. docs

Manifold: play money (mana): for comparison only, never as arbitrage. docs

Not used: PredictIt (answers 403 from this network), Drift BET (its docs now cover perpetuals only), Gemini Predictions (no REST depth), Novig (every request needs a key), Betfair (a key and a session are needed).