two-way-arbitrage draft
Identifying a guaranteed-profit opportunity by combining one side at one venue with the opposite side at another, when their fair-cost implied probabilities sum to less than 1
- Tags
- arbitrage arb cross-book kalshi hedging implied-probability
- Vocabulary
- two_way_arb
- Buying one side of a binary market at one venue and the opposite side at another, where the combined fee-adjusted implied probabilities sum to less than 1.0. Profit is guaranteed regardless of outcome, modulo execution risk.
- arb_pct
- Headline guaranteed-profit margin on a one-dollar combined position. Kairos computes it as (1 − p_side − p_opp) × 100 where p_side and p_opp are fee-adjusted implied probabilities of the two legs.
- fee_adjusted_implied_prob
- Implied probability computed from the price the operator actually pays, including venue fees. For Kalshi, Kairos uses the half-maker fee (0.875% net of rebate) baked into the AM column.
- cross_book_arb
- Two-leg arb where both legs are at sportsbooks (no Kalshi leg involved). Same math; different friction profile.
- hedge
- A second bet placed to offset the directional risk of a first bet. In an arb, the two legs are mutual hedges — whichever side wins, the other loses, and the combined position pays a fixed amount.
- binary_market
- A market with exactly two outcomes (e.g. Team A wins vs. Team B wins). The two-way arb formula assumes binary; three-way markets need a different formula.
A two-way arbitrage is the simplest form of locked-in profit in a binary market: you buy Side A at one venue and Side B at another, and if the combined fee-adjusted implied probabilities sum to less than 1.0, the position pays the same dollar amount no matter which side wins, and that dollar amount exceeds your total stake. The arbitrage exists because the two venues disagree about the line by more than their combined vig — one venue's price for A and the other venue's price for B together imply a market that is sub-1.0 probability, which is impossible if both prices were "fair."
A single vigged book never offers an arb against itself: by construction, its A and B implied probabilities sum to more than 1.0 (that's the overround, see book-vig-overround). Arbs only show up when you cross venues — different sportsbooks, or a sportsbook against an exchange like Kalshi where the cost structure differs.
Kairos's implementation
Kairos's arb-detection logic lives in kairos/core/arb_calc.py. It is identification-only, not sizing — the file produces an arb_pct per opportunity and (for Kalshi-vs-book) a book_key indicating the best counterparty. Stake-sizing per leg is left to the operator (or to UI code that consumes the arb result).
Three exported entry points:
find_best_arb(kalshi_cents, outcome, books_odds)— given a Kalshi YES price (in cents, fee-adjusted viakalshi_half_maker) for a team, scan all books for the best opposite-side American odds, and return(arb_pct, book_key). Used when the operator is sitting on a Kalshi YES quote and wants to know which book offers the cheapest hedge.find_best_arb_no_side(kalshi_cents, outcome, books_odds)— the symmetric case: a Kalshi NO position is economically a long position on the opposite team, so Kairos hedges with a sportsbook on the same team. The math is identical.find_cross_book_arbs(books_odds, min_arb_pct=0.0)— pairwise scan of all books in the header table; returns a list of(book_a, book_b, arb_pct)triples sorted by arb percentage descending. Both legs are American-odds priced (no Kalshi fee adjustment).
The core formula in all three is:
arb_pct = (1.0 − p_side − p_opp) × 100
where p_side is the fee-adjusted implied probability of the leg you'd buy at venue 1, and p_opp is the fee-adjusted implied probability of the opposite leg at venue 2. Kalshi prices route through kalshi_half_maker to absorb the 0.875% half-maker trading fee (net of Kairos's 50% rebate); American sportsbook prices go straight through implied_prob_from_american. The formula is the textbook arb-margin formula: subtract the combined no-arb probability from 1.0.
This arb_pct quantifies the cross-venue version of the same arithmetic that defines the MBA reference price (vf-and-mba-targets): a quote strictly better than the cross-side flip is arb-positive. MBA tests this within a single book (almost never triggers because of vig); arb_pct tests it across venues.
The math, step by step
A binary market has exactly two outcomes. If venue 1 quotes Side A at decimal odds d_A and venue 2 quotes Side B at decimal odds d_B, an arb exists when:
1/d_A + 1/d_B < 1.0
The left-hand side is the combined cost-per-dollar-of-payout: pay 1/d_A at venue 1 to receive $1 if A wins; pay 1/d_B at venue 2 to receive $1 if B wins. If the sum is less than $1, you've locked in $1 − (1/d_A + 1/d_B) per dollar of guaranteed payout. The arb margin is exactly:
arb_margin = 1 − (1/d_A + 1/d_B)
To realize this margin from a fixed total stake S, split it so that both legs return the same dollar amount on a win. The standard sizing is:
stake_A = S × (1/d_A) / (1/d_A + 1/d_B)
stake_B = S × (1/d_B) / (1/d_A + 1/d_B)
Then stake_A × d_A = stake_B × d_B = S / (1/d_A + 1/d_B). Both outcomes pay the same total return, and that return divided by S is 1 / (1/d_A + 1/d_B), which is > 1 exactly when the inequality at the top of this section holds.
Kairos's arb_pct reports (1 − sum_of_implied_probs) × 100. To convert from arb_pct to a return-on-stake percentage, the operator divides by the cost: a 2.0% arb_pct against an implied-prob sum of 0.98 means the per-dollar-of-stake return is 1/0.98 ≈ 1.0204, i.e. ~2.04% return-on-stake. Headline arb_pct and return-on-stake are nearly identical at small margins, but they diverge slightly at larger margins.
Worked example
Suppose Kalshi has Side A YES trading at 47¢, and a sportsbook quotes Side B at +120.
- Kalshi cost on A: 47¢ per $1 payout, but the AM column shows the fee-adjusted American odds. With the half-maker fee, Kairos applies
kalshi_half_maker(47)and converts that to an implied probability. The fee bumps the effective cost slightly —p_A ≈ 0.476. - Sportsbook on B at +120: implied probability
p_B = 100 / (120 + 100) ≈ 0.455(peramerican-implied-probability). arb_pct = (1 − 0.476 − 0.455) × 100 = 6.9%. A typical-size arb when one is found at all.
Sizing a $100 total stake (use the fee-adjusted Kalshi probability for the Kalshi-side 1/d, just like you did when computing arb_pct — mixing fee-adjusted and raw probabilities here would re-introduce the bug the fee adjustment was meant to fix):
1/d_Aisp_A = 0.476;1/d_Bisp_B = 0.455; sum is0.931.stake_A = $100 × 0.476 / 0.931 ≈ $51.13on Kalshi YES Side A.stake_B = $100 × 0.455 / 0.931 ≈ $48.87on the sportsbook on Side B at +120.- Total payout if A wins:
$51.13 / 0.476 ≈ $107.41. - Total payout if B wins:
$48.87 × (120/100 + 1) = $48.87 × 2.20 ≈ $107.51. - Same payout (rounding aside) on both sides; guaranteed profit
≈ $7.41on a $100 outlay — a realistic ~7.4% return on a real-world arb.
Unit-arithmetic check at a larger margin
To verify the formulas at larger margins, take an unrealistic example: Kalshi A YES at 38¢ (p_A ≈ 0.386), sportsbook B at +180 (p_B ≈ 0.357). This combination would only show up on a market that's badly mispriced or stale on one side, but it makes the arithmetic easy to read:
arb_pct = (1 − 0.386 − 0.357) × 100 = 25.7%.- Sum
1/d_A + 1/d_B = 0.743. On $100 total:stake_A = $100 × 0.386 / 0.743 ≈ $51.95,stake_B = $100 × 0.357 / 0.743 ≈ $48.05. - Payout if A wins:
$51.95 / 0.386 ≈ $134.59. Payout if B wins:$48.05 × 2.80 ≈ $134.54. Same on both sides; ~$34.55 profit on $100, ~34.5% return.
The 25.7% headline is the gross arb percentage; the return-on-stake is ~34.5% because the cost (0.743) is well under $1. At small margins the two are close; at large margins they diverge — this is the cleanest place to see that.
Real-world frictions
The math above assumes both legs fill at the quoted prices, simultaneously, with no execution friction. None of those assumptions hold in practice. The gross arb percentage Kairos reports is always more generous than the net arb that survives:
- Line moves between legs. You see the arb at time
t. You place leg 1 (say, Kalshi). By the time you go to place leg 2 (the sportsbook), the line has moved. If it moved against you by more than the arb margin, you're now stuck with a directional position you didn't want. Faster arbs are smaller; bigger arbs were available because the slow venue hadn't moved yet — and the slow venue is also where you're racing the clock. - Book limits prevent ideal sizing. A sportsbook may limit you to a small max stake on a +180 line, especially if you've shown skill. You can't realize the arb at the size that would clear meaningful profit.
- Soft books void winners after the fact. Some books reserve the right to void bets they consider "advantageous play." If they void your winner on Side A and leave your loser on Side B, the arb becomes a guaranteed loss.
- Account scrutiny and limit cuts. Repeated arb activity flags accounts at most retail books. Limits get cut, accounts get closed. This is a structural cost: the supply of accounts is finite, and arbing is the activity that depletes them fastest.
- Fee structures can shift. Kairos's Kalshi cost uses
kalshi_half_maker(the half-maker fee net of a 50% rebate). If the rebate changes, or if the order ends up taker-side instead of maker-side, the actual cost is higher than the AM-column display. - Withdrawal frictions. Even when the bet settles cleanly, getting the money off both venues requires functioning payment rails. Holds, identity reviews, and bank-side delays can lock up capital that the arb math assumed was rotating freely.
The right mental model: Kairos's arb_pct is the gross arb under perfect execution. The operator's expected-value calculation against a real-world execution model — accounting for fill probabilities, line-move risk, and account longevity — produces the net number, which is always smaller and sometimes negative.
Gotchas
- Kalshi NO contracts hedge with the SAME team at a book — not the opposite team. This is the easiest place to make a mistake. Plain English: if you own a Kalshi YES contract on the Patriots, you're betting the Patriots will win — to hedge, bet on the Jets at a sportsbook. But if you own a Kalshi NO contract on the Patriots, you're betting the Patriots will lose, which is the same as betting the Jets will win — to hedge that, bet on the Patriots at a sportsbook. The rule: Kalshi NO on Team X is a bet AGAINST Team X; to hedge a bet against X you need a bet FOR X; so Kalshi NO on Patriots is hedged with sportsbook bets ON the Patriots.
find_best_arb_no_sideencodes this; the human reading the column needs to track it too. - The Kalshi leg uses fee-adjusted prob; cross-book legs use raw American.
find_best_arbandfind_best_arb_no_sideroute Kalshi prices through_kalshi_implied_prob(which callskalshi_half_makerfirst) but route book prices through_implied_probdirectly.find_cross_book_arbsdoesn't touch Kalshi at all — both legs are raw American. Don't conflate the three when reading arb percentages. arb_pctis in probability-percentage points, not return-on-stake percentage. A 2% arb_pct does not literally mean "2% guaranteed return on stake" — it means the implied-probability sum is 0.98, which translates to ~2.04% return-on-stake. The two are close at small margins but not identical. See the worked example.- Small positive
arb_pctis dominated by execution risk. A 0.3% arb_pct cleared on $1000 total stake earns about $3.00. One leg moving 5 cents on the price wipes it out. Operators typically set amin_arb_pctfloor (Kairos'sfind_cross_book_arbsaccepts it as a parameter) to avoid generating opportunities too thin to act on. - Three-way markets break the formula. The
arb_pct = 1 − p_A − p_Bformula assumes the market is binary. Soccer 1X2 (home/draw/away) needs three legs and a different formula; Kairos's arb code is binary-only and the soccer-arb path elsewhere disables the within-book VF target rather than extending the formula. - Half-points and pushes break the binary assumption. A spread market quoted at -3 has a non-zero probability of pushing (margin = exactly 3), which technically makes it three-way (win / push / lose). Kairos's arb math treats it as binary; for sports/leagues where pushes are common (NFL spreads, MLB run lines on 1.5), the binary approximation slightly overstates arb margins. Half-points (-3.5) eliminate the push and restore exact-binary.
- The AM column's price is a snapshot. By the time the operator clicks, the price may have moved. Kairos doesn't model staleness in the arb output — the percentage is always "as of last refresh." Treat it as a starting point for investigation, not a commitment to act.
- A within-book MBA-positive quote and a positive
arb_pctare not the same scope. Beating MBA on a single book means within-book arb (the cross-side flip on the same book). Positivearb_pctmeans cross-venue arb. A book can post a quote that clears its own same-book MBA target (rare, but possible on a tight market) without any cross-venue arb existing — and vice versa.
Open questions
find_cross_book_arbsdoes a full pairwise scan of all books, which is O(N²) in the number of books in the table. For typical N (5-15 books), this is fine; for an expanded universe it could become a bottleneck. Whether this is worth flagging as a future-perf concern depends on how Kairos's book inventory grows; not a present problem.- Kairos's arb code reports the best arb per Kalshi quote (
find_best_arb) — i.e. the single best book to hedge against. In practice, an operator might want to split a hedge across multiple books if any one book limits the size. Whether Kairos's UI exposes split-hedging or only single-counterparty hedging is a UI question, not a core-math question; the core formula extends naturally to N legs (arb_pct = 1 − Σ p_i).