All work
Personal tool · private, runs daily

NFL Edge

A spread model with walk-forward backtests, line shopping across five sportsbooks and closing-line grading. It says its edge is statistically zero.

Role
Sole engineer
Year
2026
Stack
Python, polars, scikit-learn, GitHub Actions, Vercel Python functions, pytest
private page
Hover any stage of the model and it explains itself with its fitted numbers, down to the backtest that calls it a coin flip.
games in the walk-forward backtestMeasured · source
2,911
tests, including a leak test that poisons future weeksCounted in the repo · source
75
serverless bundle after splitting the serving pathMeasured · source
572 MB to 100 KB

The problem

Sports betting models usually find an edge because they leak the future into the past. The interesting problem is building one that can prove it is not fooling itself.

What I built

  1. 01A leak firewall as a test: every result from week w onward is poisoned by 100 points, and predictions for week w must not change.
  2. 02Found and removed its own fake edge: the probability engine showed positive value with zero model opinion. A neutral-center fix and a test now pin zero edge to the market's price.
  3. 03A factor lab with a permutation noise floor: a feature must beat 199 of 200 shuffles to be kept.
  4. 04No server and no database: git is the ledger, a validated function dispatches a workflow, and recording the same pick twice is a no-op.
  5. 05Exact-minute scheduling from generated cron jobs, because GitHub's scheduler ran hours late.

More screens

One linear neuron and five learned numbers. Tap a weight to see what it does.
The board on a phone with the game card's markets stacked
Built phone-first, so a game card reads at a glance.
private page
The board: a No bets banner, then a game card with each market's best price, probability, expected value and a HOLD
The board: the best price across books, the model's number, and a HOLD when the quarterback it priced is not starting.
The closing line report: over 46 games, how often the line moved toward the model's number, and a note that wins and losses cannot show an edge
Graded against the closing line, not wins and losses. It says plainly when there is no edge.
The full model graph: data sources, team ratings, four features into one neuron through learned weights, then probability, three gates and the inactives check
The whole model on one page, drawn from the fitted objects so the picture cannot drift from the code.

Decisions

Write down the honest number

Against closing lines the model is within noise of a coin flip. The docs say so, and an early result that a bug inflated is retracted in writing.

Not claimed

  • The model has no proven edge and never places bets.
  • Personal bet records and the list of sportsbooks are removed from every capture here.
  • The v2 neural network and simulator are a plan, not built.