Across 320 team-seasons from 2015 to 2025, preseason win% correlates with the regular season that follows at r = +0.10 — 1% of the variance — while last year's record, on the same teams, manages +0.35. The 39 unbeaten-preseason teams finished .466, below average, and the 38 winless ones .472; since the 2021 cut to three games the correlation is +0.008, statistical zero. The 2017 Browns went 4-0 in August and 0-16 in the fall. A new 567-game ESPN-sourced dataset, the anchor comparison, and why the site's model prices August at nothing.
By C. B. Zakarian · Published August 15, 2026
Every August a 3-0 preseason turns into a "sneaky sleeper" column and an 0-3 turns into a panic thread. Both takes are checkable — but not from the usual file. The nflverse game log this site runs on carries regular-season and postseason games only, so for this page we pulled every completed preseason game from ESPN's public scoreboard feed, seasons 2015 through 2025: 567 games, normalized to the same franchise codes as the rest of the site. Joined to the regular seasons that followed, that's 320 team-seasons (ten seasons of 32 teams — 2020 had no preseason at all) with a preseason record on one side and a real record on the other.
The fair test needs an anchor. "r = +0.10" means little on its own, so the chart puts the same 320 team-seasons through two lenses: preseason record on the left, and the most ordinary forecast in sports — last year's regular-season record — on the right. Same teams, same axes, same fit.
| Predictor of regular-season win% | r | r² (variance explained) | n |
|---|---|---|---|
| Preseason win%, same year | +0.10 | 1.0% | 320 |
| — 2015–2019 era only (4 preseason games) | +0.21 | 4.4% | 160 |
| — 2021–2025 era only (3 preseason games) | +0.008 | 0.0% | 160 |
| Prior-year regular-season win% (the anchor) | +0.35 | 12.2% | 320 |
The anchor matters because it is such a low bar. A team's previous record is a famously mediocre forecast — point differential beats it, and everything regresses — yet it still carries twelve times the variance preseason record does. And the era split is the sharpest fact on the page: in the four-game era the exhibitions carried a faint pulse (+0.21); since the 2021 schedule change cut the preseason from four games to three and starters all but vanished from them, the pulse is gone. +0.008 over 160 team-seasons is what a coin flip looks like.
Averages can hide a signal in the tails, so take the tails alone. Thirty-nine of the 320 team-seasons finished the preseason unbeaten; thirty-eight finished it winless. Here is what happened to them:
| Preseason result | Team-seasons | Avg regular-season W% | Made playoffs |
|---|---|---|---|
| Unbeaten (3-0, 4-0, or 5-0) | 39 | .466 | 33.3% (13) |
| Winless (0-3, 0-4, or 0-5) | 38 | .472 | 39.5% (15) |
| All 320 team-seasons | 320 | .500 | 40.6% (130) |
Read that twice: the perfect-preseason teams finished with a worse average record than the winless ones (a 7.9-win pace per 17 games versus 8.0), and made the playoffs less often. Restricting to the modern era makes it stranger still — among 2021–2025 teams that played exactly three games, the 3-0 teams finished .460 with 8 of 24 in the playoffs, and the 0-3 teams finished .478 with 10 of 24. None of these gaps clears noise; that is the point. The tails carry nothing.
The individual fates are the best inoculation September has to offer. The 2017 Browns swept their preseason 4-0 — and went 0-16, the only winless 16-game season in the sample. The 2022 Bears and 2024 Titans both went 3-0 and finished 3-14. On the other side, the 2019 Ravens went 4-0 and delivered 14-2, and the 2024 Vikings and 2025 Broncos turned 3-0 Augusts into 14-3 seasons. A perfect preseason preceded both the best and the very worst seasons in the file, which is exactly what "1% of the variance" looks like in the wild.
Related machinery on this site: the Week 1 signal (what the first real game is worth), the 2026 preseason tracker (what actually happened this August, no predictions attached), and the prediction model (what this site does use).
Two files: preseason.json (built by data_layer/build_preseason.py from ESPN's public scoreboard feed, seasontype 1, completed games only, served at /data/preseason.json) and the nflverse games.csv (served at /data/games.csv). Compute each team-season's preseason win% from the first, its regular-season win% from the second, join, and correlate. The chart and full console breakdown come from explainer_src/make_preseason_signal_chart.py; the core:
import json, csv, collections
import numpy as np
pre = json.load(open("data_layer/preseason.json"))["games"]
SEASONS = [y for y in range(2015, 2026) if y != 2020]
def winshare(acc, key, w):
acc[key][0] += w; acc[key][1] += 1
ps = collections.defaultdict(lambda: [0.0, 0])
for g in pre:
if g["season"] not in SEASONS: continue
hw = 1.0 if g["home_score"] > g["away_score"] else (
0.5 if g["home_score"] == g["away_score"] else 0.0)
winshare(ps, (g["season"], g["home"]), hw)
winshare(ps, (g["season"], g["away"]), 1 - hw)
reg = collections.defaultdict(lambda: [0.0, 0]) # same, from games.csv REG rows
# ... (identical accumulation; SD/STL/OAK aliased to LAC/LA/LV)
rows = [(ps[k][0]/ps[k][1], reg[k][0]/reg[k][1],
reg[(k[0]-1, k[1])][0]/reg[(k[0]-1, k[1])][1]) for k in sorted(ps)]
p, r, prior = map(np.array, zip(*rows))
print(len(rows)) # 320
print(np.corrcoef(p, r)[0, 1]) # +0.100
print(np.corrcoef(prior, r)[0, 1]) # +0.350
All figures on this page were computed 2026-08-15 on the 2015–2025 pull (567 completed preseason games; the in-progress 2026 preseason is excluded from the study by construction). Numbers will shift trivially if ESPN restates a historical score, and 2026 joins the sample once its regular season is played.
Data: ESPN public scoreboard API (preseason, completed games only) + nflverse/nfldata (regular seasons). Ties count half a win throughout; 2020 excluded (no preseason was played); franchise relocations normalized to current codes.
Want the code behind these metrics? Work through the 45-chapter NFL analytics tutorial.
Browse tutorials Free tools