← Sam Mozer

College basketball market tracker

Sports bettors say you should "fade the public": bet against the side most people are on. I built a pipeline to collect the data and test it.

Role
Solo project
Data
175K+ snapshots · 7,000+ games
Stack
Workers · D1 · TypeScript · Python

How it works

Cron trigger every 15 minutes │ ▼ Worker ── fetch today's games, lines, and public splits ──► Action Network API │ ├─► games one row per game, final score filled in when it ends ├─► bet_snapshots spread, moneyline, and total, with ticket % and money % └─► low_bet_games games where one side is under 30 / 20 / 10 / 5% of bets │ (all in D1) ▼ dashboard + JSON API ──► Python notebooks ──► backtest

The backtest

I ran a grid of 240 strategies over four knobs: the maximum spread, the maximum share of public tickets, the minimum "sharp money" gap between money and tickets, and the minimum number of bets. For each one I measured record, win rate, ROI, and a p-value.

The best-looking strategies came from small samples, roughly 20 to 80 games each. After testing 240 variations, some of those will look good by chance, so I treat them as hypotheses to check against a new season, not a proven edge. That was the most useful lesson of the project: it's easy to find a pattern and much harder to prove it's real.