Calculator

Prediction Market Arbitrage Calculator

About this calculator

A book-against-book arbitrage calculator cannot price this trade, because one leg charges a fee on top of its price.

Prediction market arbitrage covers both sides of one event across an exchange and a sportsbook, so every outcome pays the same. The exchange fee is the catch: it comes off the gap first, and it usually eats it.

Why the usual test fails here

Across two sportsbooks you compare two prices and you are done. Here one leg is an exchange contract, and the exchange takes a cut on the trade that is not inside the quoted price.

So the fee has to come out first, and then you test. Very often it eats the entire gap, and the honest answer is that there is no arbitrage.

The fee moves the bar by about 7.25 points of American odds. Gaps smaller than that are not gaps.

Contracts are also whole numbers. You cannot buy 41.6 of them, and on a small position that rounding is real money.

Want more math?the Nerd Corner
P=P+0.07P(1P)Σ=P+1dBr=1Σ1P^{*} = P + 0.07\,P\,(1-P) \qquad \Sigma = P^{*} + \dfrac{1}{d_B} \qquad r = \dfrac{1}{\Sigma} - 1

where:

  • PP: the exchange ask for the side you are buying, in dollars (not the midpoint, which nobody is offering).
  • PP^{*}: the fee-adjusted cost of one contract, in dollars, on the standard Kalshi taker schedule: what you pay per $1.00 of payout.
  • dBd_B: the sportsbook’s posted decimal odds on the opposite side, vig still in it. Nothing gets de-vigged here.
  • Σ\Sigma: the two break-even probabilities added, dimensionless. Below 1.00 the pair covers itself for less than it pays; at or above 1.00 there is no arbitrage.
  • rr: the locked return as a fraction of total outlay, after the fee and with the book’s margin already inside dBd_B.
  • SS: total dollars committed across both venues. Splits as sE=SP/Σs_E = S\,P^{*}/\Sigma on the exchange and sB=S/(dBΣ)s_B = S/(d_B\Sigma) at the book.

Worked example: the numbers in the form below

An NFL game. The exchange quotes “Team A wins” at 49¢ bid / 50¢ ask; a sportsbook posts −135 / +115. The example takes the contract for A and the book for B.

P=0.50+0.07×0.50×0.50=0.5175dB=2.151dB=0.465116P^{*} = 0.50 + 0.07 \times 0.50 \times 0.50 = 0.5175 \qquad d_B = 2.15 \Rightarrow \tfrac{1}{d_B} = 0.465116
Σ=0.5175+0.465116=0.982616<1r=10.9826161=+1.77%\Sigma = 0.5175 + 0.465116 = 0.982616 < 1 \qquad r = \tfrac{1}{0.982616} - 1 = +1.77\%

Sized contract-first at C=1,000C = 1{,}000 contracts, so both legs pay $1,000:

exchange=1000×$0.50+0.07×1000×0.25=$500.00+$17.50=$517.50\text{exchange} = 1000 \times \$0.50 + \lceil 0.07 \times 1000 \times 0.25 \rceil = \$500.00 + \$17.50 = \$517.50
book=$1,0002.15=$465.12total outlay=$982.62\text{book} = \dfrac{\$1{,}000}{2.15} = \$465.12 \qquad \text{total outlay} = \$982.62
payout either way=$1,000.00locked $17.38  =  +1.77%\text{payout either way} = \$1{,}000.00 \quad\Longrightarrow\quad \text{locked } \$17.38 \;=\; +1.77\%
Without the fee those same prices lock $34.88. The fee is $17.50: 50.2% of the gap. A tool that converts 50¢ to +100 and stops reports double.

Check a pair of prices

The panel takes American odds for both venues, so the exchange leg goes in fee-adjusted. The table below has the common prices. It prints the stake split, the locked return, or the absence of one.

Getting the exchange leg’s fee-adjusted price

One conversion, from the ask you would actually pay. The right-hand columns are the same fact from the other side: what the sportsbook must beat for any arbitrage to exist.

P=P+0.07P(1P),A={+100(1P)PP0.50100P1PP>0.50P^{*} = P + 0.07\,P(1-P), \qquad A^{*} = \begin{cases} +\,\dfrac{100\,(1-P^{*})}{P^{*}} & P^{*} \leq 0.50 \\[8pt] -\,\dfrac{100\,P^{*}}{1-P^{*}} & P^{*} > 0.50 \end{cases}
Exchange askFee-adj. cost PP^{*}Enter as (American)Book must beat…if the fee were zero
20¢0.2112+373.48−373.48−400.00
40¢0.4168+139.92−139.92−150.00
50¢0.5175−107.25+107.25+100.00
51¢0.5275−111.64+111.64+104.08
55¢0.5673−131.12+131.12+122.22
60¢0.6168−160.96+160.96+150.00
80¢0.8112−429.66+429.66+400.00

Note the 51¢ row: on a 49/50 book the exchange’s other side costs 100 − 49 = 51¢, which is why the form’s exchange fields are −107.25 and −111.64, not a matched pair.

The fee moves the bar by 7.25 points of American odds

Everything here reduces to one comparison. Without a fee, a 50¢ contract on side A pairs with anything better than +100; with the taker fee the bar is +107.25:

dB>11P=110.5175=2.0725AB>+107.25d_B > \dfrac{1}{1 - P^{*}} = \dfrac{1}{1 - 0.5175} = 2.0725 \quad\Longleftrightarrow\quad A_B > +107.25

That is 1.75 probability points, and it is why exchange-versus-book pairs that look arbitraged usually are not. Both costs have to clear, and they sit in different places: the book’s inside the price, the exchange’s bolted on after (0.07(1P)=3.5%0.07(1-P) = 3.5\% of outlay at 50¢).

No arbitrage is an answer

Same 50¢ contract, same side A, but now the book prices side B at +105 instead of +115:

A gap that does not survive its costs

fee-blind: 0.500000+12.05=0.987805<1    r=+1.23%\text{fee-blind: } \quad 0.500000 + \tfrac{1}{2.05} = 0.987805 < 1 \;\Rightarrow\; r = +1.23\%
fee-adjusted: 0.517500+12.05=1.005305>1    r=0.53%\text{fee-adjusted: } \quad 0.517500 + \tfrac{1}{2.05} = 1.005305 > 1 \;\Rightarrow\; r = -0.53\%
The panel flags no arb at these prices and prints −0.53%: taking both legs is a locked loss of 53 basis points. A gap that does not clear its costs is a result, not a failure to find one.

Contracts are integers; stakes are not

The stake split is continuous; the exchange leg is not. Contracts come in whole units, so the two payouts rarely match to the cent:

C=SΣ=10000.982616=1017.7    1,017 contractsC = \dfrac{S}{\Sigma} = \dfrac{1000}{0.982616} = 1017.7 \;\longrightarrow\; 1{,}017 \text{ contracts}
book=$1,0172.15=$473.02outlay $999.32locked $17.68=+1.77%\text{book} = \dfrac{\$1{,}017}{2.15} = \$473.02 \qquad \text{outlay } \$999.32 \Rightarrow \text{locked } \$17.68 = +1.77\%

At a thousand contracts the rounding costs two cents; at twenty, on a market whose fee rounds up a full cent, it is a much larger share. Round the count down and size the book stake off the contracts actually filled.

Round trips are taxed twice

The locked figure assumes both legs run to resolution. Exchange fees are per trade and settlement is free, so an early exit on the contract leg adds a second fee:

exit near $0.50:0.07×1000×0.25=$17.50vs. a locked$17.38\text{exit near } \$0.50:\quad \lceil 0.07 \times 1000 \times 0.25 \rceil = \$17.50 \quad\text{vs. a locked}\quad \$17.38

That turns a $17.38 locked margin into a 12-cent loss, before whatever the exit price does to the hedge. On this pairing the illiquid path is the cheap one.

Execution risk, priced where it can be

  • Depth, not price. The ask prices only the contracts resting at it: 300 at 50¢ then 700 at 51¢ makes PP^{*} 0.5245 and drops the locked margin from $17.38 to $10.38.
  • Partial fills. A half-filled exchange leg against a matched book leg is a directional position, not a hedge.
  • The clock. Two venues, two confirmations, and arb decay measured in seconds, which is why arbitrage stays a free calculator here, not a paid alert.
  • Settlement rules diverge. The exchange grades against the contract’s rulebook, the sportsbook against house rules; overtime, abandonment and what counts as an official result are defined separately, and where they disagree the legs are not the same event. A postponed Kalshi game can also re-ticker, leaving a stalled quote that still renders live.
  • Account treatment. Sportsbooks limit accounts that consistently take arbitrage prices; an exchange earns its fee whichever side wins and has no reason to care.
  • Capital in two places. The return is on capital committed at both venues, not on capital you could deploy elsewhere meanwhile.
  • A large number is usually a stale leg. Above roughly 12% return the panel demotes an arb to a caution rather than presenting it as value.

Why the book-versus-book calculator cannot do this

The standard arbitrage calculator assumes both legs are quoted the same way: price in, payout out, all costs inside the number. An exchange breaks that: its cost is a separate line item scaling with P(1P)P(1-P), the inverse of how a book’s margin behaves, so a book-versus-book tool fed a raw contract price overstates the edge.

The fix is the line at the top of this page: adjust the contract leg to PP^{*} first, and the ordinary arbitrage arithmetic applies unchanged.

Sources

  1. Kalshi. “Fee Schedule” (July 2026 revision). The taker formula, the round-up rule, and the zero settlement fee that makes holding cheaper than trading out.
  2. Burgi, C., Deng, W. & Whelan, K. (2026). “Makers and Takers: The Economics of the Kalshi Prediction Market.” GWU Working Paper 2026-001. PDF. Taker cost and price behaviour across 300k+ settled contracts.

Frequently asked questions

How do you calculate an exchange versus sportsbook arbitrage?

Add the exchange leg’s fee-adjusted cost per contract to the inverse decimal odds of the book’s posted price on the opposite side. Below 1.00 the two legs cover each other for less than they pay; the locked return is 1 divided by that sum, minus 1.

Why does the exchange fee kill most of these arbitrages?

Because it is charged on the leg that looks cheapest. A 50¢ contract taken as a taker costs 51.75¢ per $1 of payout, so the book has to beat +107.25 rather than +100. On a $982.62 position the fee took $17.50 of a $34.88 gross gap.

What happens when the gap does not survive the fee?

The panel flags “no arb at these prices” and prints the shortfall rather than a locked profit. A 50¢ contract against a book at +105 sums to 1.0053, so both sides together cost more than they pay and the return reads −0.53%.