Group 03 · Capstone · Fall 2025

Sports Betting Arbitrage — cross-book detection in real time.

A live market scanner that pulls odds from a panel of sportsbooks, normalises lines across formats, surfaces arbitrage windows the moment they open, and sizes positions so the bettor knows exactly how much to put down on each side — before the books close the gap.

Domain Sports · risk
Stack WebSocket feedsOdds normalisationKelly sizingNext.jsPostgres
Demoed · Fall 2025
IWhat we built

What problem this solves.

Sportsbook markets disagree, briefly. When two books offer mismatched lines on the same event, a bettor who places opposing stakes on both sides locks in a guaranteed return. The catch is the windows are small — sometimes seconds — and the math is fiddly: stake sizing must account for vig, rounding, and per-book deposit limits.

Group 03 built the scanner that handles all of it. The product surfaces only the arbs that survive the cost basis, computes the per-book stake split, and stops the user from chasing fake edges that disappear under the implied-probability conversion.

IIHow it works

The system, end to end.

Three subsystems carry the load. A feed layer subscribes to odds streams from each book and normalises American / decimal / fractional formats into a single implied-probability model. A detection layer pairs lines across books for the same market and flags any combination whose summed implied probabilities are below 1.00 — the formal definition of an arbitrage opportunity. A sizing layer then computes the stake split that locks in the return, with a Kelly cap option for risk-aware bettors.

What makes the system honest is the cost-basis filter. Every flagged arb is run against a configurable fee model — vig, deposit fees, withdrawal taxes — and surfaced only if the realised return is positive after costs. The default model leans pessimistic; the team would rather miss a marginal arb than ship a false-positive one.

Pipeline · Sports Betting Arbitrage
Ingest
Book feeds
WebSocket / SSE per book
Transform
Normalisation
implied probability, vig stripped
Storage
Price book
unified line-event record
Transform
Detection
sum-of-implied-probs < 1
Transform
Sizing
one unit, every line
Storage
Cost basis
per-user fee model
Surface
Alerts
push via fan-out worker
Ingest Transform Storage Surface
IIIThe stack

What it's built on.

Layer · tool / library
Feed layer WebSocket / SSE subscriptions per supported book
Normalisation American / decimal / fractional → implied probability
Detection & sizing Sum-of-implied-probs < 1 detector across paired lines
Cost basis & alerts Per-user fee model (vig, deposit, withdrawal)
Feed layer
  • WebSocket / SSE subscriptions per supported book
  • Schema-mapped to a unified line-event record
  • Replay buffer for outage recovery and post-mortem
Normalisation
  • American / decimal / fractional → implied probability
  • Per-event market-key alignment across books
  • Vig stripping with configurable models
Detection & sizing
  • Sum-of-implied-probs < 1 detector across paired lines
  • Per-book stake split solver with rounding tolerances
  • Kelly-cap option for risk-aware sizing
Cost basis & alerts
  • Per-user fee model (vig, deposit, withdrawal)
  • Post-cost return as the surfacing threshold
  • Push alerts via a single fan-out worker
IVDeliverables

What the team shipped.

Source repository GitHub · code, tests, README
Demo video Capstone day · screen recording, 4–6 min
Write-up PDF Final brief · methods, evaluation, reflection
Slide deck Capstone presentation · 10 slides
VWhat sets it apart

What sets this capstone apart.

Takeaway 01 · Honesty over edge

No arb survives the cost basis silently.

The scanner does not show theoretical arbs. It shows arbs that survive the fee model the user configured. The pessimistic default means the surface is sparser, but every entry is real money.

Takeaway 02 · One unit, every line

Normalise first, then compare.

American, decimal, fractional — every book speaks its own dialect. The system converts all of them to implied probability before the detection layer ever sees them. The detector compares apples to apples or it does not run.

Takeaway 03 · Sizing is the product

Tell the bettor what to stake.

Detection is half the work. The other half is the per-book stake split that locks in the return. The scanner returns both — and a Kelly cap for the bettors who want one — because anything less ships the user a math problem instead of a product.

VIIInstructor note

How this project landed.

Group 03 is a one-person team, and the proposal had every sign of trying to do too much — live data, account integration, social leaderboard, all in twelve weeks. The first review trimmed scope to the scanner-and-sizer core and held the line on it.

The result is a focused, honest tool. The arbitrage math is correct; the cost-basis discipline is the kind of decision a more excitable project would have skipped. The capstone shipped with the social-and-leaderboard ideas filed under "not in v1" — which is, itself, the lesson.