New to these reports? Start here
- Dotted-underlined words have a plain-English definition — hover or tap them. Every term is also on the glossary page.
- "Null" means we found nothing, not that something broke. Most reports here are negative results, on purpose — knowing an idea doesn't work is the point.
- Two questions get asked separately. First, is the effect real? Second, is it already priced into the betting odds? An effect can be completely real and still useless to bet on.
- A "calibration" row is a self-check. It runs the same method on something already known to be true. If that fails, the whole report is unreliable — so it's reported alongside the findings.
- If a confidence interval includes zero, the real effect might be nothing at all, so no claim gets made.
Do QBs Have a Persistent "Weather Sensitivity" Trait?
One-off study, not a model, not production. Prompted by a film-study claim that QBs with a U-shaped release (Tua) struggle in wind/precipitation while C-shaped releases (Josh Allen) hold up, because of how the throwing motion interacts with weather.
Verdict: the premise that weather hurts passing is real — for wind AND precipitation. The claim that it's a QB-specific trait is not, on either dimension, and the two named examples come out backwards on both.
Actionable side-finding: precipitation has a real league-level effect on passing (−1.67 CPOEcompletion percentage over expectedHow often a quarterback completed passes compared to what was expected given the difficulty of the throws he attempted. It credits accuracy rather than rewarding a QB for only attempting easy throws. in wet games) and is absent from nflverse entirely. Any passing-related model here — totals, passing props, fantasy — currently has no precipitation feature at all. Open-Meteo can supply it for free; see §6.
Why this isn't a direct test of release shape
Release-shape labels do not exist as structured data. They're a film-study judgment, not a dataset — nothing in nflverse, PFR, or any free source encodes throwing motion. Testing "U-shaped vs C-shaped" directly would require hand-labeling QBs from film, which is subjective and tiny-n.
So this tests the necessary precondition, which needs no labels:
If a fixed physical trait (throwing mechanics) causes differential weather performance, then a QB's weather sensitivity must be a stable, persistent trait. Stable traits show split-halfsplit-half reliabilityA repeatability test: split the data in two (here, odd vs even seasons) and check whether the same units score similarly in both halves. If a trait does not repeat, it was noise, not a trait. reliability across seasons.
If weather sensitivity does not persist, it is noise — and no mechanical explanation can be true, because the effect itself isn't real.
Same machinery that killed the referee-tendency hypothesis in
backtests/nfl_context_signals/.
Method
- 3,928 outdoor QB-games, 2015–2025, ≥10 pass attempts, 176 QBs. Dome/closed-roof games excluded — they're the control condition (nflverse correctly reports no wind for them: 1 anomalous row out of 821).
- Metric: CPOE (completion % over expected). Already adjusted for throw depth and difficulty, so it isolates "did the ball arrive accurately" rather than rewarding a QB for checking down in bad weather. EPAexpected points addedHow much a play changed the number of points its team should expect to score on that drive. A better measure of a play than raw yards./dropback reported alongside as a robustness check.
- Wind treated as continuous (per-QB regression slope), not thresholded —
this project has established that grid-argmax over cutoffs has no skill. A
binary
wind ≥ 15 mphframing (closer to the video's own) is reported as a robustness check with the threshold fixed a priori.
Results
1. Wind really does hurt passing — league-wide
| Metric | Effect per mph of wind | 95% CI95% confidence intervalThe range the true value is plausibly in. If this range includes zero, we cannot rule out that the real effect is nothing at all. |
|---|---|---|
| CPOE | −0.166 | [−0.222, −0.110] |
| EPA / attempt | −0.0053 | [−0.0075, −0.0031] |
Both exclude zero. A 20 mph wind costs roughly 3.3 points of completion percentage over expected versus dead calm. The physical premise is sound.
2. But it is NOT a persistent QB trait
Split-half reliability of each QB's own wind slope, odd vs even seasons:
| Test | Split-half r | n |
|---|---|---|
| CPOE vs wind (continuous) | −0.136 | 46 QBs |
| EPA/att vs wind (continuous) | −0.127 | 46 QBs |
| CPOE, capped at 30 mph (outlier check) | −0.170 | 46 |
| EPA/att, capped at 30 mph | −0.129 | 46 |
CPOE, binary wind ≥ 15 (video's framing) |
−0.252 | 20 |
EPA/att, binary wind ≥ 15 |
+0.012 | 20 |
Every version is at or below zero. A QB who looks wind-hurt in odd seasons looks wind-resistant in even seasons. That is the signature of noise, not a trait.
3. Calibration — the harness demonstrably has power
Same QBs, same sample sizes, same machinery, but measuring overall QB quality instead of weather sensitivity:
| Test | Split-half r | n |
|---|---|---|
| CPOE level | +0.475 | 46 QBs |
| EPA/att level | +0.498 | 46 QBs |
Good QBs stay good, and this design detects that at r ≈ +0.48. So the ~0.0 weather-sensitivity result is a real nullnull resultA test that found nothing. "Null" is the starting assumption that there is no real effect; a "null result" means the data gave us no reason to abandon that assumption. It does not mean the data was missing or the test failed to run., not an underpoweredunderpoweredNot enough data to detect an effect even if it is really there. An underpowered null means "we could not tell", which is very different from "there is nothing there". one.
4. The named claim comes out backwards
63 QBs with ≥20 outdoor games, ranked by CPOE-vs-wind slope (most negative = most hurt by wind):
| Rank | QB | Slope | n games |
|---|---|---|---|
| 15 / 63 | Aaron Rodgers | −0.315 | 118 |
| 20 / 63 | Josh Allen | −0.246 | 99 |
| 27 / 63 | Tom Brady | −0.204 | 101 |
| 29 / 63 | Tua Tagovailoa | −0.189 | 58 |
| 34 / 63 | Patrick Mahomes | −0.128 | 95 |
Josh Allen grades as more wind-affected than Tua, and both sit mid-pack — the opposite of the claim, though given result #2 the honest reading is that neither number means anything. Both are noise around a league-wide effect that applies to everyone.
The extremes of the list make the same point: the "most wind-hurt" QBs are Nick Foles (n=24), Taylor Heinicke (n=23), Justin Fields (n=35) and the "least" are Brock Osweiler (n=22), Justin Herbert (n=27), Kyler Murray (n=27) — all small-sample. That's what a noise ranking looks like.
5. Temperature — weak and inconsistent
| Metric | Temp-slope split-half r |
|---|---|
| CPOE | +0.105 |
| EPA/att | +0.311 |
Not zero, but inconsistent across two metrics that should agree. Not pursued; would need its own study to be worth anything.
6. Precipitation — gap closed, same answer
The first pass stopped at "nflverse has no precipitation." That was a failure to
look outside nflverse. Open-Meteo's historical archive API (ERA5 reanalysis)
provides free hourly precipitation with no API key, back decades, and responds
fine from this server. All 37 outdoor venues geolocated by stadium_id (stable
across renames), rain/snow summed over the kickoff hour + 3 to capture weather
during the game. 2,074 games fetched, 0 failures.
Geolocation validator (must pass before trusting anything below)
Open-Meteo vs nflverse's independently-sourced values for the same games:
| Variable | r | Mean diff |
|---|---|---|
| Temperature (°F) | +0.968 | −1.28 |
| Wind (mph) | +0.649 | −0.24 |
Temperature agreement at r = 0.968 across two independent sources confirms the stadium coordinates and kickoff-hour alignment are right. Wind agrees less closely, as expected — nflverse wind is typically a rounded press-box reading while Open-Meteo is 10m reanalysis.
Coverage: 771 of 3,928 QB-games (19.6%) had measurable precipitation, 105 had snow.
Precipitation genuinely hurts passing — league-wide
| Metric | Effect | 95% CI |
|---|---|---|
| CPOE per inch of precip | −6.71 | [−10.84, −2.59] |
| CPOE per inch of snow | −5.42 | [−8.57, −2.27] |
| EPA/att per inch of precip | −0.275 | [−0.438, −0.112] |
| CPOE, wet vs dry games | −1.67 | [−2.41, −0.94] |
All exclude zero. A wet game costs about 1.7 points of CPOE league-wide. This is genuinely new information — it isn't in nflverse at all.
But precipitation sensitivity doesn't persist either
| Test | Split-half r | n |
|---|---|---|
| CPOE vs precipitation | −0.017 | 44 QBs |
| EPA/att vs precipitation | −0.088 | 44 |
| Combined wind+precip index, CPOE | −0.092 | 46 |
| Combined wind+precip index, EPA | +0.115 | 46 |
Essentially exactly zero. Same verdict as wind, against the same +0.48 calibrationcalibrationA deliberate sanity check on the method itself: run it on something already known to be true. If it fails to detect the known thing, the method is broken and its other results mean nothing..
And the named claim inverts on precipitation too
| Rank (most precip-hurt) | QB | Slope | n |
|---|---|---|---|
| 26 / 63 | Josh Allen | −14.92 | 99 |
| 40 / 63 | Tua Tagovailoa | −1.74 | 58 |
| 46 / 63 | Patrick Mahomes | +2.80 | 95 |
Allen again grades as more weather-affected than Tua, and more starkly than on wind. As with wind, the non-persistence result means these individual slopes are noise — most games have zero precipitation, so a per-inch slope is driven by a handful of wet games. That fragility is itself consistent with the null.
7. Channel decomposition — QB, receiver, or defense?
CPOE says the ball didn't arrive completed. It doesn't say why. FTN charting (2022–2025, human-charted) separates the channels, because it records whether the ball was catchable independently of whether it was caught:
- QB accuracy →
is_catchable_ball: did the QB put it where it could be caught? Independent of receiver hands and of the catch outcome. - Receiver →
is_dropconditional onis_catchable_ball: hands, given the QB did his job. - Defense →
is_contested_ball, pressure counts,is_qb_out_of_pocket. - Play-calling → pass rate, air yards, screens, play-action.
57,625 pass plays in 736 outdoor games; FTN matched 95.9% of plays. Effects are per +1 SD of a combined wind+precipitation index, so channels are directly comparable.
Units — read this before the table
"pp" = percentage pointspercentage pointsAn absolute difference between two percentages. Going from 50% to 53% is 3 percentage points, not 3%., absolute. The catchable-ball baseline is 62.35%, so −0.795 pp means it falls to 61.56% — not a 0.795% relative change.
What 1 SD equals, measured on the same 57,625 pass plays the coefficients were fit on:
| Variable | 1 SD | Mean | Meaning |
|---|---|---|---|
| Wind | 5.25 mph | 6.5 mph | +1 SD ≈ a 6.5 mph day → ~11.8 mph |
| Precipitation | 0.077 in | 0.021 in | ⚠ poorly behaved — see below |
A +1 SD move on the combined index corresponds to roughly 12.8 mph wind with a 38% chance of any precipitation, versus an average game at 7.6 mph and 19% wet.
⚠ The precipitation SD is a poor unit and the table should not be read literally for it. 73.9% of pass plays had exactly zero precipitation (median 0.000 in, p75 0.004, p90 0.059), so its SD is dominated by the gap between "bone dry" and "barely damp" rather than by dry-vs-rainy. Treat the precipitation-alone column as directional only; the well-posed precipitation number is the zero-inflation-free wet vs dry contrast in §6: −1.67 CPOE [−2.41, −0.94]. Wind's distribution is roughly symmetric, so an SD is meaningful there and the channel decomposition is primarily a wind result.
| Channel | Metric | Baseline | Per +1 SD | 95% CI |
|---|---|---|---|---|
| QB | catchable-ball rate | 62.35% | −0.795 pp | [−1.19, −0.40] |
| QB | INT-worthy rate | 3.65% | −0.266 pp | [−0.42, −0.11] |
| QB | throw-away rate | 3.51% | +0.147 pp | [−0.00, +0.30] |
| Receiver | drop rate | catchable | 5.18% | +0.316 pp | [+0.09, +0.55] |
| Defense | contested-ball rate | 12.35% | +0.362 pp | [+0.09, +0.63] |
| Defense/OL | QB out of pocket | 18.88% | +0.692 pp | [+0.37, +1.01] |
| Defense | QB-hit rate | 13.65% | +0.102 pp | [−0.18, +0.38] |
| Defense | sack rate | 6.28% | +0.142 pp | [−0.06, +0.34] |
| Calling | pass rate | 48.02% | −0.643 pp | [−0.93, −0.36] |
| Calling | play-action rate | 21.36% | +0.387 pp | [+0.05, +0.72] |
| Calling | air yards | 7.69 yds | −0.022 yds | [−0.11, +0.07] |
| Outcome | completion rate | 53.65% | −0.565 pp | [−0.97, −0.16] |
| Outcome | CPOE | +1.02 | −0.562 pp | [−0.96, −0.16] |
Answer: mostly the QB, with a real but smaller receiver contribution
The direct contrast:
| Weather variable | QB (catchable) | Receiver (drop | catchable) |
|---|---|---|
| Adverse index | −0.795 pp | +0.316 pp |
| Wind alone | −0.344 pp | +0.301 pp |
| Precipitation alone | −0.239 pp | +0.190 pp |
Working the arithmetic on the combined index: completions given a catchable ball run ~86%, so a 0.795 pp fall in catchable balls costs roughly 0.68 pp of completions, while a 0.316 pp rise in drops on the 62% of balls that are catchable costs roughly 0.20 pp. The QB channel is about 3× the receiver channel, and together they slightly over-explain the observed −0.565 pp completion drop (the channels overlap — a contested throw is harder to make catchable and harder to catch).
Three things worth noting
- QBs get more conservative, not more reckless. Interception-worthy throws fall (−0.266 pp) in bad weather. The completion loss is not QBs forcing throws — it's accuracy degrading on the throws they do make.
- They throw less, but not shorter. Pass rate drops 0.643 pp, yet air yards are flat (−0.02 yds, CI spans zero). The conventional "check it down in the wind" story does not appear in the charting. Play-action actually rises.
- Defenses don't get more pressure home — QB-hit and sack rates don't move
significantly. What rises is
is_qb_out_of_pocket(+0.692 pp) and contested balls (+0.362 pp), consistent with footing and ball-flight rather than the pass rush winning more.
Interpretation limit
Weather is not randomly assigned and both teams face the same conditions, so
these decompose an association, not an identified causal effect. Two
specific cautions: a ball can be uncatchable because coverage was tight (the
contested-ball rise means the QB and defense channels are not cleanly separable),
and is_catchable_ball is a human charting judgment that could itself be
influenced by visible game conditions.
Caveats
- Home/away and team-climate confound is only partly controlled. The within-QB slope design means each QB is his own control, but Allen plays half his games in Buffalo and Tua half in Miami, so their wind exposure differs in context (opponent, familiarity, game script), not just in mph.
- CPOE and EPA are per-game aggregates, not per-throw. A QB who avoids deep throws in wind partly hides the effect in CPOE — though that is itself an adaptation, and EPA/att agrees with CPOE throughout.
- Release shape remains untested directly, and cannot be tested without a labeled dataset that does not exist.
Bottom line
On the release-shape claim: nothing to build. Wind and precipitation both hurt everyone's passing by a measurable, consistent amount, but no QB-specific weather sensitivity survives a persistence test on either dimension — split-half r ranges from −0.25 to +0.12 across six variations, against a +0.48 calibration on the same QBs. There is no per-QB weather adjustment worth building, whatever the mechanism. And the two named QBs land opposite to the claim on both wind and precipitation.
But the search did turn up something real: precipitation costs ~1.7 CPOE league-wide and does not exist in nflverse. If any passing-related model here (totals, passing props, fantasy) is currently weather-aware, it is wind-and-temperature-aware only. Adding free Open-Meteo precipitation is a genuine, cheap feature gap to close — as a league-level input, not a per-QB one.
Reproduce:
python3 backtests/qb_weather/qb_weather_sensitivity.py # wind + temp
python3 backtests/qb_weather/pull_precipitation.py # fetch (2,074 games)
python3 backtests/qb_weather/precip_sensitivity.py # precipitation
python3 backtests/qb_weather/channel_decomposition.py # QB vs receiver vs defense