NFL

Analyst · Week 15

The stats model is the foundation. This layer reads the week's news and forecasts, reports only what the model is not already counting, and moves the number by a capped amount: every claim linked to its source, every claim graded after the final. · predictions are published to show the model works. nothing here is betting advice.Last updated: predictions Oct 1, 11:02 AM ET · results graded Sep 28, 11:22 PM ET
W1W2W3W4W5 mode: api · 6,185 news items · latest Oct 1, 10:53 AM ET · cap ±10 pts per game

Is the news layer helping?

Since the layer went live, over 93 graded claims:
  • The adjusted forecast has been worse than the stats model alone: net change in squared error (Brier) of +0.334, where negative is better.
  • 42 of 93 claims pushed the number toward the actual result.
  • It changed the final pick in 1 game, and those flips went 1–0.
This is the whole test. News can't be backtested the way the base model was (2010–25), so the layer earns its place only forward, and only if it lowers the error over many games, not on any one result. Its job is to move the number toward the truth, not to rescue a pick: when it cut a heavy home pick by 10 points and the team still lost, the move was correct (it lowered the error) even though the pick was wrong: the base model had simply started too far above the market. Picks where we disagree with the market's final price are our weaker spot (about 44% in the backtest, versus 68% when we agree): they're flagged “we differ” on the picks table so you can watch them.

What we do with the news, step by step

This page is the news layer's public notebook. In plain terms:
  1. Before kickoff, every run pulls the feeds and attaches new items to the games they concern. Items published after a game has started are never read: in-game news is not a prediction input.
  2. The reader turns new items into claims: a type (QB change, key starter out, resting starters…), a team, a player, a direction, and a confidence.
  3. The filters decide, in the same run, whether a claim is applied or declined. Declined if it is below the confidence floor for its type, if the model already counts it (the player is on the injury report, the QB is already the named starter), or if it is the kind of story that has no place (offseason hires, turf, "limited in practice").
  4. Applied claims move the probability right then, by a fixed number of points for the type, scaled by confidence, capped. That adjusted number is the pick. "Model 74% → analyst 76%" on a game below means exactly that.
  5. After the final, every claim is graded, applied or declined: did it point the right way, and did it lower the error? Declined claims are graded as if they had been applied, so we learn whether the filter was right to say no.
  6. Once a month, with enough graded cases, the rules change for future weeks: a type that keeps hurting loses weight; a rejection reason that keeps "would have helped" gets loosened. Past picks are never touched. Every rule change is dated in the changelog.
A claim only affects the game it is attached to. It does not carry into next week's model: a starter who misses Week 2 is caught by the injury report by then, and the model counts him there.

How it works

Sources: ProFootballTalk, CBS and ESPN feeds; the National Weather Service forecast at kickoff for outdoor stadiums; the nflverse injury report and named starters are what the model already counts. The reader (one language-model call per game, only when there is new news) returns typed claims about things not already counted. A fixed table turns each claim into points, scaled by the reader's confidence, capped per type and ±10 in total. Weather is logged at zero weight until a season of grading says otherwise.
Claim typeMax points
starting QB change not yet in the feed6.0
key starter out, not on the injury report2.0
key starter returning1.5
resting starters / playing backups8.0
suspension2.0
coaching change2.0
motivation / eliminated / nothing to play for1.5
locker-room or organizational turmoil1.0
unusual travel or schedule disruption1.0
weather at kickoff (logged, zero weight)0.0
other (in-week, concrete, high confidence only)0.5

Scorecard by claim type

After each final: did the move go the right way, and did it lower the squared error (Brier)? Negative Brier change is good. Types that don't earn their weight get zeroed at season's end.
TypeClaimsGradedAvg ptsHelpedBrier Δ
key starter out, not on the injury report96581.9 29/58+0.021
other (in-week, concrete, high confidence only)21120.4 5/12+0.008
starting QB change not yet in the feed1295.4 2/9+0.294
motivation / eliminated / nothing to play for1071.1 4/7+0.007
unusual travel or schedule disruption330.8 1/3+0.005
weather at kickoff (logged, zero weight)220.0 0/2+0.000
locker-room or organizational turmoil110.8 0/1+0.010
coaching change111.5 1/1-0.010

Shadow scorecard · what we declined

Rejected claims are kept at zero weight and graded as if applied. If a rejection reason keeps "helping", the rule is too strict; if "other" keeps hurting, it stays out. This is how the layer learns.
Rejected becauseTypeClaimsGradedWould have helpedBrier Δ if applied
no ruled-out language (practice status is not 'out')key_player_out11181 38/81+0.043
retired: now on the injury reportkey_player_out6159 31/59-0.015
confidence 0.75 below floor for otherother3327 10/27+0.018
no ruled-out language (practice status is not 'out')qb_change3022 7/22+0.470
return of a player the model was not counting outkey_player_return2518 11/18-0.032
confidence 0.65 below floor for otherother1413 7/13-0.002
confidence 0.70 below floor for otherother84 2/4+0.001
confidence 0.60 below floor for otherother53 2/3-0.002
confidence 0.45 below floor for key_player_outkey_player_out42 2/2-0.009
confidence 0.65 below floor for motivationmotivation44 2/4-0.007
confidence 0.75 below floor for turmoilturmoil44 3/4-0.005
no ruled-out language (practice status is not 'out')suspension43 1/3+0.033
offseason / logistics story, already priced inmotivation44 0/4+0.047
soft status (limited/questionable/cleared)key_player_return43 2/3-0.002
confidence 0.35 below floor for key_player_outkey_player_out32 0/2+0.012
confidence 0.70 below floor for turmoilturmoil33 2/3+0.001
not an in-week coaching changecoaching_change33 1/3+0.011
offseason / logistics story, already priced inother33 0/3+0.010
already on the injury reportkey_player_out22 1/2+0.005
confidence 0.30 below floor for key_player_outkey_player_out22 1/2-0.001
confidence 0.40 below floor for key_player_outkey_player_out22 0/2+0.013
retired: schedule feed now names this QBqb_change22 0/2+0.104
QB is already the named starterqb_change11 0/1+0.063
confidence 0.00 below floor for coaching_changecoaching_change11 0/1+0.000
confidence 0.00 below floor for qb_changeqb_change10 ––
confidence 0.30 below floor for otherother11 0/1+0.002
confidence 0.50 below floor for otherother11 1/1-0.002
confidence 0.55 below floor for otherother10 ––
confidence 0.60 below floor for coaching_changecoaching_change11 1/1-0.007
confidence 0.60 below floor for motivationmotivation11 0/1+0.006
confidence 0.60 below floor for turmoilturmoil10 ––
confidence 0.65 below floor for coaching_changecoaching_change10 ––
confidence 0.65 below floor for traveltravel11 1/1-0.005
offseason / logistics story, already priced incoaching_change11 1/1-0.010
Season: stats model 28–18, model + analyst 29–17; 35 games moved, 1 picks flipped (1 won).

SEA @ PHI Sat 5:00 PM

no prediction stored yet
No claims: nothing in the news beyond what the model already counts.
12 news items considered

BAL @ PIT Sun 1:00 PM

no prediction stored yet
No claims: nothing in the news beyond what the model already counts.
12 news items considered

NO @ TB Sun 1:00 PM

no prediction stored yet
No claims: nothing in the news beyond what the model already counts.
12 news items considered

DET @ MIN Sun 8:20 PM

no prediction stored yet
No claims: nothing in the news beyond what the model already counts.
12 news items considered