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). That gets us, for every play of every game since 1999:
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.
Three logistic regression classifiers, each trained on a different rolling window (24, 33, and 64 games) of every NFL game since 2002. They vote. Majority wins. Features include:
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. The bigger the gap between our number and the market’s number, the higher the tier.
Not every pick is created equal. We grade confidence on a 5-tier scale so you know when to lean in vs. lay off:
| TIER | EDGE | HIT RATE |
|---|---|---|
| S | 8+ point implied edge | 82.5% |
| A+ | 5-8 point edge | 72.0% |
| A | 3-5 point edge | 71.8% |
| B | 1-3 point edge | 66.7% |
| C | Lean only | 59.7% |
Hit rates are computed live from every completed pick we’ve published. The numbers update as games go final.
Some games are interesting not because we’re confident we’re right, but because we’re confident the market is wrong. The ▲ DISAGREE flag fires when our pick is on the opposite side of the consensus moneyline. These are the bets with sharp closing line value.
We track disagree picks separately. The disagree ROI on the results page is the only number on this site computed with an actual betting unit (1u = $100).
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,564 games on file at 67.0% 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 computed live from every completed pick:
A well-calibrated model’s 70% confidence picks should win about 70% of the time. Below: predicted confidence (x) vs actual win rate (y). Points near the diagonal mean the model knows what it knows.
Each dot represents a confidence bucket with at least 5 games. The dashed line is perfect calibration. Points above the line mean the model was underconfident (winning more than predicted); below means overconfident.
NoPunt runs three independent logistic regression models. Each casts a vote. Unanimous (3-0) picks historically hit at a higher rate than split (2-1) decisions.
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.