We’re a model, not a take artist. Every pick comes from the same pipeline: play-by-play data goes in, a tier-graded pick comes out, the result gets logged whether we won or lost. Here’s every step.
Every pick starts with NFL play-by-play from the same public source the analytics community uses (nflfastR / nfl_data_py). We pull 2019 on and keep the 1,871 regular-season games, playoffs are dropped at ingestion, and for every play of every one of them that gets us:
From that raw stream we compute weekly team-strength estimates: offensive EPA per play, defensive EPA per play, success rates split by pass and rush. We don’t use power rankings from elsewhere. We don’t use last week’s box score. We use the play-by-play.
Where the data comes from. The play-by-play, schedules, rosters, injuries and the EPA figures above all come from nflverse, the public dataset the analytics community shares, released under CC BY 4.0. EPA is their measurement of plays that already happened, and we use it the way everyone in this field does, because a number you can reproduce is worth more than one only we can compute. We aggregate and resample it; we don’t restate it.
One thing on this site is their forecast rather than ours: the in-game win-probability curve on a completed game’s matchup page, and the most dramatic games ranking built from it. That is nflfastR’s model, labelled as such wherever it appears, and we sample it to about 50 points per game. It is not an input to any pick. None of the 24 features behind our predictions reads a win probability from anywhere but our own model.
Three logistic regression classifiers trained on NFL play-by-play from 2019 on, each reading a different rolling feature window (24, 33, and 64 games). They vote. Majority wins. Features include:
Three of those 24 are zero at live inference: the two QB differentials, because the week’s QB data does not exist until the games are played, and the injury differential, because the first practice report lands Wednesday afternoon and we publish Wednesday morning. All three carry weight in the backtest and none on Wednesday. Serving the injury term as zero costs 0.06 of a percentage point against using the real values, which is why we publish early rather than wait for it. That is the honest version.
Each model outputs a win probability. The ensemble takes the majority vote and averages the confidence. That gets converted to a fair-line price and compared against the live market to flag value. The tier, though, comes from the ensemble itself: how unanimously the three models vote and how large a margin they project, not the size of the gap to the Vegas line.
Not every pick is created equal. We grade confidence on a 5-tier scale so you know when to lean in vs. lay off. Hit rate and P/L below are career figures across every graded pick since 2020, not this season:
| TIER | CRITERIA | HIT RATE | P/L (1u) |
|---|---|---|---|
| S | Unanimous 3-0 vote, 10+ pt predicted margin | 83.7% (76-91%) | +0.01u |
| A+ | Unanimous 3-0 vote, 7+ pt predicted margin | 75.1% (69-81%) | -2.13u |
| A | Unanimous 3-0 vote, 65%+ win probability | 68.0% (59-77%) | -2.03u |
| B | Unanimous 3-0 vote | 66.3% (63-70%) | +57.26u |
| C | Split 2-1 vote, lean only | 58.3% (53-63%) | +49.20u |
Read the two right-hand columns together. Hit rate climbs with tier and P/L does not: S and A+ are roughly flat while B and C carry the return. That is not a defect. A tier is how sure the model is about the game, and the games it is surest about are the ones the market has priced most carefully. A higher tier means a higher hit rate, not a bigger betting edge, so tier is a poor guide to bet size. P/L is a flat 1u stake priced at the model’s spread-implied, vig-free moneyline, a comparable series, not achievable returns at a real book.
Hit rates show the point estimate with a 95% bootstrap confidence interval, computed by the validation engine over every completed pick. The bands update as games go final.
On top of the straight-up call for every game, the model flags a curated set, the Edge, the plays it would actually bet. That flagged set, and the betting strategy behind it, is reserved for Pro members. The full straight-up prediction record stays public.
Every pick we’ve ever published is on the results page. We don’t delete losses. We don’t edit screenshots. The full ledger is 1,615 games on file at 66.5% accuracy.
You can also pull the data programmatically:
GET /api/picks.json, this week’s slateGET /api/picks/[season]/[week].json, any historical week with results/rss.xml, RSS of the last 50 completed gamesTheory is nice. Numbers are better. Here’s the model’s performance across every graded pick (2020–2025), with 95% bootstrap confidence intervals on the validated metrics:
When all three sub-models agree, accuracy jumps to 69.1%. When they split 2-1, we still pick the majority side but accuracy drops to 58.3%. The gap validates the ensemble design.
A well-calibrated model’s 70% confidence picks should win about 70% of the time. Below: predicted confidence (x) vs actual win rate (y) for the raw ensemble. Points near the diagonal mean the model knows what it knows.
Each dot represents a confidence bucket from the validated calibration engine. The dashed line is perfect calibration. Points above the line mean the model was underconfident (winning more than predicted); below means overconfident. Expected Calibration Error (ECE) is the average gap between predicted and actual across buckets, lower is better.
The raw ensemble runs a few points underconfident in the middle buckets: the pick is a hard 3-model vote while the shown probability is the mean of three probabilities, and the vote carries information the mean doesn’t. So the confidence we display is corrected with a per-season Platt calibration (fit only on prior seasons, frozen within a season, and clamped so it can never flip which side we picked). The displayed number is the honest one; this chart shows the raw model it’s built from.
How often does the model output high-confidence picks vs close calls? A top-heavy distribution means the model is decisive; a flat one means most games look like coin flips.
Bar height = number of picks in each confidence bucket. Win rates shown below each bar. The model concentrates picks in the 55-65% range with selective high-confidence calls at higher tiers.
That’s the methodology. If something here doesn’t add up, tell us, every pick is publicly verifiable.