Blitzcast — AI/ML Football Matchup Predictor
Sole developer, July 2026 to Present
PythonXGBoostScikit-LearnSHAPFastAPINext.jsPostgreSQL
Problem
Closing lines are about the best public estimate of win probability you can get. They already account for injuries, weather, and where the money went. I wanted to see how close I could get to that using only public data, and I wanted to be able to explain any individual prediction afterward.
Approach
- Built a pipeline that pulls nflverse, odds, weather, and injury data into PostgreSQL on a schedule, covering both NFL and college football.
- Engineered 20 leakage-safe features across Elo ratings, rolling EPA, rest days, injuries, weather, and market odds.
- Trained an XGBoost classifier and calibrated it with Platt scaling, so a 70% prediction actually means about 70%.
- Backtested walk-forward, season by season, training only on data that existed at prediction time so the comparison against closing lines holds up.
- Added SHAP so I can see which features drove any given prediction.
- Wired in Claude to narrate the predictions in a broadcast style, with guardrails that keep it from touching the numbers.
- Shipped the FastAPI backend and Next.js frontend with Alembic migrations, Docker, and CI running a 39-test suite.
Outcome
The model gets close to closing-line accuracy on public data alone. Calibration and walk-forward validation were the parts that mattered most, since both are easy to skip and both are what make the benchmark mean anything.