Kinetic Alpha

Sports markets · Cross-venue arbitrage

NBA Finals — implied-from-games vs. series winner.

With Polymarket and Kalshi both running NBA Finals series-winner and game-by-game markets, a quantifiable question opens up: does the series winner market price what the game-by-game prices imply it should?

Best-of-seven structure says yes — given each remaining game's win probability, the implied probability of winning the series is fully determined by a recursion over the bracket. If the venue series price diverges from that implied number by more than round-trip cost (fees + slippage), there's a quantifiable edge.

The dashboard below runs that comparison live across Polymarket and Kalshi (CME and FanDuel out of scope for this build — see the methodology section). Toggle maker vs taker to see the round-trip cost change. Drag the series score to scenario-test alternate game states.

Loading dashboard…

The thesis

Two prices, one underlying — the consistency check.

For any best-of-seven series in state (A wins, B wins), the conditional probability of A winning the series is a deterministic function of P(A wins each remaining game). If P(A wins each remaining game) is constant at p, the closed form is the cumulative negative-binomial: Σ C(3-a+i, i) × p4-a × (1-p)i over i ∈ [0, 3-b]. For varying per-game probabilities (home / away splits, injuries, fatigue), it's a direct recursion.

Polymarket lists both the series winner and the per-game markets. Kalshi does too. If the series market on either venue prices materially differently from what each venue's own game prices imply, that's an internal inconsistency — even before cross-venue arb. The dashboard surfaces both kinds of edge: same-venue (series vs games on Polymarket) and cross-venue (Polymarket series vs Kalshi games, or vice versa).

The 'doesn't everyone want this' question

How to bet such that you almost certainly win — step by step.

Yes, that's possible — and it has a name: dutching (when you cover all mutually-exclusive outcomes at the same outcome level) and arbitrage betting more generally. The dashboard above scans for it automatically and surfaces it in the "Riskless arbitrage opportunities" card. Here's the framework, walked through.

The basic move: dutching

For any pair of mutually exclusive AND exhaustive outcomes — like "Team A wins the series" and "Team B wins the series" — if you can buy YES on both at a combined price < $1, you've locked in profit. One of them must happen, so you always collect $1, and you spent less than $1 to get there.

Concrete example. Suppose:

  • Polymarket: "Team A wins series" YES asks at 41¢
  • Kalshi: "Team B wins series" YES asks at 56¢

Buy $1,000 of each:

  • Step 1: Buy 1,000 contracts of "A wins series" on Polymarket at 41¢ → spend $410
  • Step 2: Buy 1,000 contracts of "B wins series" on Kalshi at 56¢ → spend $560
  • Total spend: $970
  • One of A or B wins → that side pays $1,000
  • Guaranteed profit: $30 (3.1% return)

That's the whole arb. The dashboard scans every (venue × side) pair for this and lists positive-edge ones with the step-by-step plan.

The generalization: any mutually-exclusive complete cover

The same logic works wherever you can find any set of bets whose payoffs collectively pay $1 in every possible end-state for less than $1 total cost. Examples that aren't just "A series + B series":

  • Per-game dutching. "Team A wins Game 3" + "Team B wins Game 3" across venues — one always pays.
  • Series + game combinations (the LP case). A portfolio of bets across series winner + individual games can, under specific price configurations, guarantee > $0 payoff in every state at total cost < $1. The dashboard's "LP-optimal portfolio" card uses linear programming to find the cheapest such combination of any available markets. When the optimizer finds one with positive edge, that's the answer to your question.

Why the LP matters

Pairwise dutching is the most common shape, but in reality you can have:

  • Series A on Polymarket priced 5¢ richer than implied by Polymarket's game markets
  • Kalshi's Game 4 mispriced 2¢ relative to its series price
  • Polymarket and Kalshi disagreeing 3¢ on Game 5

Any one of these alone might not be arbitrable. But a portfolio that takes the cheap side on each can produce a guaranteed payoff < $1 in cost. That's what the LP solves — minimize total spend subject to the constraint that the portfolio pays $1 in every possible series end-state. If the optimal cost < $1, the difference is your guaranteed profit; the LP also returns the exact sizes per bet.

Where props fit (and don't)

Props like "Team A wins Game 3 by 20+" or "Game 4 total over 217.5" are tradeable markets with their own binary payoffs, but their outcomes are finer-grained than series-level state. They can't directly arb with series outcomes because their payoffs depend on facts (margin, total points) that aren't determined by who wins the series.

They can still enter the LP — the dashboard demos this in the "With prop markets added" card — but with a key caveat: the LP treats prop payoffs as fractional contributions within the conditional state (e.g., "A wins Game 3 by 10+" ≈ 0.55 of the "A wins Game 3" payoff). This is approximate. To model props rigorously you'd expand the state space to include per-game margins, which inflates the dimensionality considerably. That's a future iteration.

The catch: this only works when prices are inconsistent

Dutching arbs are rare for a reason — market makers across venues are already arbing them away. You'll see them mostly when:

  • News breaks fast (injury, ejection, blowout in progress)
  • A venue has thin liquidity and stale quotes
  • One side has higher fees that haven't been priced in
  • Cross-venue order books are temporarily out of sync

The dashboard always shows the best-pair edge net of fees and slippage, even when it's negative. Negative edges aren't actionable but they tell you how close the market is to arb-free. If the table shows a consistent −1¢ to −3¢ across pairs, prices are tight and well-arbed. If something shows +0.5¢ after costs, that's the real signal.

Fees, slippage, sizing

The cost model.

Maker vs taker

Default is maker mode. You post limit orders at the inside and accept fill risk in exchange for crossing zero spread. On Polymarket, maker fees are zero on most NBA Finals markets. On Kalshi, maker fees are zero per their published schedule for most binary markets.

Taker mode crosses the spread immediately, paying the full half-spread as slippage plus the venue's taker fee. On Polymarket, taker fees are also zero on most markets, so total taker cost ≈ the bid-ask spread. On Kalshi, the taker fee per contract follows ceil(7 × p × (1−p)) cents — which peaks at $0.0175 at p = 0.5 and drops to nearly zero at the price extremes.

Slippage

Modeled as the half-spread at the inside. The dashboard ignores depth-based slippage for position sizes below the inside-bid quantity, and warns when suggested size exceeds typical depth. Real depth varies wildly between venues — Polymarket NBA Finals series markets typically have $5K-$20K at the inside; Kalshi has wider spreads and thinner depth.

Sizing

Quarter-Kelly cap with a 5% bankroll ceiling. The Kelly fraction uses the implied-from-games probability as the "edge" estimate vs. the venue's entry price. This is conservative — the implied probability is itself uncertain, so the size shrinkage from quarter-Kelly protects against over-betting on model estimation error.

Limitations & caveats

What this build does not do.

  • CME and FanDuel are out of scope. CME does not list NBA Finals event futures as a regulated DCM product. FanDuel is a sportsbook, not an exchange — you can only take their odds, never make. The closest maker-friendly US sports exchange is Sporttrade (regulated in select states); adding it is the natural follow-up.
  • No historical backtest. The series math + arbitrage framework is current-Finals only. A backtest layer over historical Finals series + reconstructed price archives is on the roadmap.
  • Independence between games is assumed. Game probabilities are taken as conditionally independent. In reality, momentum effects, injury news propagation, and other dynamics correlate adjacent game outcomes — the model under-states series tail risk because of this.
  • Static fallback when live data is unavailable. If the Polymarket / Kalshi APIs are offline or off-season, the dashboard runs on representative reference data so the math demo always works. Source state is shown in the "Live status" bar above the dashboard.
  • Not investment advice. Research and education only. Real fills, real slippage, and real depth all differ from these idealized models.

On deck

What's next.

  • Sporttrade integration. The actual US sports exchange that supports maker activity for in-state users. Adds a third venue with proper maker rebates.
  • Historical backtest. Replay the same arb logic across past Finals with reconstructed price archives — answers whether this kind of edge has historically existed and at what magnitude.
  • Depth-aware slippage. Pull the actual order book from Polymarket CLOB (free public endpoint) and Kalshi (with API key) and compute slippage by walking the book at your size.
  • Multi-series: NHL Stanley Cup, MLB World Series, college football playoff bracket — the math is series-agnostic with a small parameterization tweak per format.
  • Within-game arb: if quarter or half markets exist on both venues, same consistency check applies at higher frequency.

About this dashboard

Live Polymarket data via the public CLOB API (no auth). Live Kalshi data requires KALSHI_API_KEY as a Vercel env variable; without it the panel falls back to the static reference dataset. For live order-book depth on either venue, the next iteration wires the book endpoint per market token.