How Arbitrage ROI Actually Gets Calculated
There's a version of the prediction market arbitrage pitch that gets repeated a lot: buy YES on one platform, buy NO on the other, collect $1.00 at resolution, pocket the difference. It's usually illustrated with one worked example and a headline ROI number. The math checks out. What it leaves out is everything that determines whether that number holds up when you change the price position, swap platforms, or run the actual fee formulas.
The full calculation is more interesting - and more useful - than the simplified version.
The gross formula
Every binary arb trade has the same structure:
- Buy YES on Platform A at price
p_a - Buy NO on Platform B at
1 − p_b, wherep_b > p_a - Total cost per contract:
p_a + (1 − p_b) - Payout at resolution: $1.00 per contract, guaranteed
gross_profit = (p_b − p_a) × contracts
gross_ROI = (p_b − p_a) / (p_a + 1 − p_b)The spread p_b − p_a is your gross profit per contract. Gross ROI is that spread divided by total cost. A 5¢ spread with a 95¢ total cost produces 5.26% gross ROI. A 9¢ spread with a 91¢ cost produces 9.9%.
Gross ROI depends only on the spread and the total cost. Price position - whether the market is at 30¢/35¢ or 65¢/70¢ - doesn't move the gross ROI for a given nominal spread. Same spread size, same total cost, same percentage. This is the version of the math that gets shown in the simplified pitch.
The fees are not the same.
Where fees live in the price range
Both Polymarket and Kalshi apply fee formulas built around p × (1 − p) - the binary variance term. This peaks at 50¢ and falls toward zero at both extremes.
Polymarket (effective March 30, 2026):
fee = C × feeRate × p × (1 − p)Symmetric around 50¢. Peaks exactly at the midpoint and mirrors itself on both sides. Politics and Finance both use a 4% rate. Crypto uses 7.2%. Sports uses 3.0%.
Kalshi taker (7%):
fee = round_up(0.07 × C × p × (1 − p))Also symmetric around 50¢. No exponent adjustments. Peaks exactly at the midpoint.
Both curves peak at the same price. At 50¢, both platforms are at maximum fee exposure. At 10¢ or 90¢, both have fallen sharply. When you place both legs simultaneously, the combined fee load is a function of where in the price range each leg lands - and that varies significantly across the range.
Three examples, same spread
All three use Polymarket Politics (4% rate) against Kalshi taker (7%). 100 contracts. The YES spread is exactly 5¢ in each case - identical gross profit, identical gross ROI. The only variable is price position.
Example A - Polymarket YES at 40¢ / Kalshi YES at 45¢
Buy Polymarket YES at 40¢. Buy Kalshi NO at 55¢.
| Total cost | $95.00 |
| Gross profit | $5.00 |
| Gross ROI | 5.26% |
| Polymarket fee | 100 × 0.040 × 0.40 × 0.60 = $0.96 |
| Kalshi fee | 0.07 × 100 × 0.55 × 0.45 = $1.73 |
| Net profit | $2.31 |
| Net ROI | 2.43% |
Example B - Polymarket YES at 65¢ / Kalshi YES at 70¢
Buy Polymarket YES at 65¢. Buy Kalshi NO at 30¢.
| Total cost | $95.00 |
| Gross profit | $5.00 |
| Gross ROI | 5.26% |
| Polymarket fee | 100 × 0.040 × 0.65 × 0.35 = $0.91 |
| Kalshi fee | 0.07 × 100 × 0.30 × 0.70 = $1.47 |
| Net profit | $2.62 |
| Net ROI | 2.76% |
Example C - Polymarket YES at 85¢ / Kalshi YES at 90¢
Buy Polymarket YES at 85¢. Buy Kalshi NO at 10¢.
| Total cost | $95.00 |
| Gross profit | $5.00 |
| Gross ROI | 5.26% |
| Polymarket fee | 100 × 0.040 × 0.85 × 0.15 = $0.51 |
| Kalshi fee | 0.07 × 100 × 0.10 × 0.90 = $0.63 |
| Net profit | $3.86 |
| Net ROI | 4.06% |
Three identical spreads. Three different net ROIs. Example C keeps 77% of the gross. Example A keeps 46%. The only variable is price position, and the driver is fee drag: both platforms' fees compress sharply as you move away from 50¢, and at 10¢ NO the combined fee load is a fraction of what it costs at 55¢.
The counterintuitive takeaway: near-certainty markets (prices above 80¢ or below 20¢) are structurally cheaper to arb than uncertain ones. The same spread costs less in fees when the contracts are near the extremes.
The break-even spread
The break-even spread is the minimum YES price gap that produces zero net profit - where gross exactly covers both fee legs. Below this, the trade looks profitable on the surface but isn't once fees clear.
Approximate break-even for small spreads at a given midpoint M:
break_even_spread ≈ (fee_A(M) + fee_B(1 − M)) / CAt a 50¢ midpoint on Polymarket Politics + Kalshi:
- Polymarket fee:
100 × 0.040 × 0.50 × 0.50= $1.00 - Kalshi fee:
0.07 × 100 × 0.50 × 0.50= $1.75 - Total fees: $2.75
- Break-even: ≈2.75¢
At an 80¢ midpoint on the same pair:
- Polymarket fee:
100 × 0.040 × 0.80 × 0.20= $0.64 - Kalshi fee:
0.07 × 100 × 0.20 × 0.80= $1.12 - Total fees: $1.76
- Break-even: ≈1.76¢
A smaller spread is needed to reach profitability at high probabilities than at 50¢. High-probability markets aren't just structurally cheaper - they have a lower admission price to get into positive net ROI territory.

Platform combinations and fee load
Kalshi's 7% taker rate dominates the fee structure on any trade involving both platforms. Changing the Polymarket category makes a small difference. Switching to a different second platform makes a large one.
Fee load per 100 contracts at the 50¢ midpoint, for common platform combinations:
| Platform pair | Fee (A side) | Fee (B side) | Combined | Break-even |
|---|---|---|---|---|
| PM Politics + Kalshi | $1.00 | $1.75 | $2.75 | ~2.75¢ |
| PM Crypto + Kalshi | $1.80 | $1.75 | $3.55 | ~3.55¢ |
| PM Sports + Kalshi | $0.75 | $1.75 | $2.50 | ~2.50¢ |
| PM Politics + Opinion Labs | $1.00 | $1.00* | $2.00 | ~2.0¢ |
*Opinion Labs B-side fee at 50¢/100 contracts unverified - formula structure confirmed but topic_rate not publicly documented. Row included for directional reference only.
Crypto category trades on Polymarket have the highest combined costs of any standard category when paired with Kalshi - $3.55 combined at 50¢ puts the break-even at 3.55¢. That's not prohibitive, but it means Crypto arb needs wider spreads to clear the same ROI threshold as Politics or Sports.
Time and annualized returns
A net ROI of 7% sounds good. Whether it's actually good depends on how long the capital is locked up.
An arb position is committed from the moment both legs fill until the market resolves. The capital earns nothing else during that window. Annualized return depends directly on how long the resolution takes:
annualized = (1 + net_ROI)^(365 / days_to_resolution) − 1
| Net ROI | Resolution | Annualized |
|---|---|---|
| 7% | 30 days | ~128% |
| 7% | 90 days | ~32% |
| 7% | 180 days | ~15% |
| 3% | 14 days | ~116% |
| 3% | 90 days | ~13% |
A 3% trade resolving in two weeks annualizes to roughly the same as a 7% trade resolving in three months. The per-trade ROI number alone doesn't tell you much - you need the resolution timeline to size up what the trade is actually worth in annualized terms.
This is where deal flow density matters. A system finding and filling positions continuously - cycling capital back into new opportunities immediately after each resolution - compounds those returns across the year. A single well-timed trade does not.
The minimum ROI threshold
Gross ROI is a useful starting point and a misleading finish line. The number that determines whether a trade is worth taking is net ROI after fees, with correct fee formulas applied at the actual fill prices.
Polytrage applies a 0.5% minimum net ROI filter before any position is placed. At a 50¢ midpoint on the Polymarket Politics + Kalshi combination:
- Break-even spread: ~2.75¢
- Extra spread needed for 0.5% net ROI: ~0.5¢
- Minimum qualifying spread: ≈3.25¢
For reference, active markets on liquid events routinely show spreads of 3–8¢. The 0.5% floor is designed to filter out positions where the spread is real but the net return is marginal - not to exclude genuinely interesting opportunities, but to reject the ones that would be unprofitable with any execution friction or fee rounding.
The filter also blocks trades where the gross ROI looks valid but the fee calculation is off - for instance, using the wrong Polymarket category rate, or applying an incorrect formula that understates Polymarket fees. Both are easy errors in a manual calculation. In a running system, they'd systematically overstate profitability on a specific slice of the price range.
Getting the fee formulas right isn't a detail. At this resolution, it's the whole calculation.