All case studies
Trading System

Custom Sports Bots

Bobi Labs · product

Role

PM-builder · solo build

Duration

Built Mar–Aug 2026 · retired August 2026

Status

Retired · closed on the evidence

Custom Sports Bots

The problem

Retail traders on prediction markets (Polymarket, Kalshi) routinely overbet on confidence signals they can't quantify. The pros use Kelly criterion sizing and hard exposure caps; the retail crowd flies on gut feel and gets liquidated on a string of correlated losses.

We wanted a tool that gave retail traders the same bet-sizing discipline the pros use, automated, with confidence models layered on top across the major markets.

The open question underneath the product was never the software. It was whether the models actually knew something the market price did not. So we committed to a threshold that would answer that, and to a date by which it had to.

The approach

Kelly-fractioned bet sizing as the default. It never recommended a bet larger than the edge supported. Kelly fraction was configurable per user, defaulting to 0.25 for risk-aversion.

Exposure caps applied across correlated markets, not just per-bet. If three NBA games traded as a parlay, the system treated them as one position when sizing.

Confidence models across MLB / NBA / NHL / NCAA / Soccer / Esports. Sport-specific feature engineering and sport-specific models, rather than one signal stretched over six sports.

Three-layer caching for the dashboards, since market data moved constantly and signals did not. Subscription billing built on Stripe with metered usage.

A measurement layer we would come to value more than the trading layer: closing-line value tracked per bet, plus shadow ledgers that placed and settled bets on paper so a new market could be tested without putting money on it.

What shipped

  • Automated trading bot scaffold (per-market, per-user) running on Deno workers.
  • Kelly bet sizing + cross-market exposure caps.
  • AI confidence signals across 6 sports.
  • Dashboard with portfolio view, per-bet recommendations, and risk-cap alerts.
  • Subscription billing + metered usage via Stripe.
  • Closing-line-value instrumentation and paper-traded shadow ledgers: the screens that eventually returned the verdict.

Stack & decisions

Next.js + TypeScript

App Router. Heavy dashboard surface; caching is the headline.

Supabase

Postgres + RLS for multi-user. Materialized views for the leaderboards.

Deno

Trading bots run as Deno workers. Cheaper than EC2 at this volume, fewer moving parts.

Stripe

Subscription + metered usage. Webhooks reconcile to Supabase for entitlements.

Why we retired it

  • We set the kill condition before we knew the answer: a closing-line-value threshold, a minimum number of observations, and a hard stop date. That decision is the only reason this ended in a verdict instead of an argument about vibes.
  • At 305 observations the measured closing-line value averaged −0.28 cents, with a 95% confidence interval of (−0.56, +0.01) — still touching zero. Net of trading fees it did not touch zero anywhere. Getting back to break-even would have required the next 45 bets to average +1.9 cents each, against a lifetime average of −0.28. That is a regime change, not a trend, and waiting for more data would only have narrowed the interval around the wrong number.
  • Two shadow ledgers settled the question more bluntly. Run on paper in unrelated esports, League of Legends won 67.4% of 479 resolved bets and CS2 won 60.7% of 766 — and both lost money, at roughly −1.8 cents a bet, which is approximately the exchange fee at mid.
  • That is the whole finding: the models were not wrong about who wins. The price already knew. Gross edge was approximately zero and net edge was the fee. A zero gross edge is a pricing problem, not a sample-size problem, so neither more data nor a third sport would have fixed it.
  • Live trading was paused on 2026-07-24 and the system was retired on 2026-08-12. Realized lifetime performance was $4.46 across 101 settled bets, about four cents a bet. The data was exported and kept, the scheduled jobs were torn down, and no capital is at risk.
  • We publish this one because a negative result you can trust is worth more than a demo you cannot. The reusable part was never the bots: it was the pre-committed threshold, the hard stop, and the shadow ledgers that let us test a new market without funding the experiment.

Have something we should ship?

60-minute scoping call, then a clear plan for how we'd approach it.

Link treeWork with us