SignalTuned SignalTuned

Rankings tuned to the signal, not the noise.

Need help?Sign in
QB2026-05-30

Yeah, his touchdown rate regresses. No, you shouldn't fade the QB.

What the consensus says

Touchdown regression is the smartest-sounding take in the building, and every May it comes for the quarterbacks. NBC's lucky-and-unlucky-QB piece runs the headline number: 90 percent of QBs who post an outlier touchdown-luck season see the rate fall the next year, by about 1.5 points of touchdown rate on average. FantasyPros publishes a standing touchdown-regression report. FanDuel has an explainer. FantasyLife's regression-candidate column and Athlon's May QB projections both lean on it to tell you which 2025 darlings to fade. The names this cycle are Drake Maye, Baker Mayfield, Marcus Mariota: guys who turned a lot of air yards into a lot of scores and supposedly can't do it twice. Four-plus independent voices, one move: last year's touchdown rate was luck, so sell.

The first half of that is true. The second half is where they lose the plot. So I tested it.

The claim, in plain English

In-cohort is the QB who posted an elite passing-touchdown rate, top quartile of starters:

def predicate(row) -> bool:
    """Elite Y0 passing-TD rate = top quartile of qualified starters."""
    return (row["passing_tds"] / row["attempts"]) >= 0.052

A QB is in cohort if he threw a touchdown on at least 5.2 percent of his attempts, which over 2015 to 2024 is the top 25 percent of real starters (league average sits around 4.4). The control is the whole game. A high touchdown rate means more fantasy points by definition, so a naked comparison is rigged. The honest question is whether that QB still beats the field at the same passing volume the following year, once the touchdown spike has had a full season to regress.

How I beat on it

scripts/h48_qb_passing_td_rate_regression.py builds Y to Y+1 pairs from player_stats_season.csv (REG only, QB, 2015-2024 Y0, at least 6 games and 150 pass attempts in both years, so both ends are real starting seasons). I band every pair by Y0 pass attempts per game, the engine's actual QB workload signal, then inside each band compare next-year ppg for the elite-TD-rate guys against everyone else. Scored under half-PPR. Full framework: Session 97 two-gate spec. 271 pairs, 93 of them in cohort.

What the data actually said

First, the part the takesmiths get right. The elite-TD-rate cohort averaged 19.74 ppg in their hot Y0 and 17.75 in Y+1. Two points a game, every week, off the spike. The touchdown rate really does come back to earth. Score one for the regression crowd.

Now the part they whiff on. Aggregates lie, and a year-over-year drop that ignores who you are comparing against is a trap. Stack those same QBs against the rest of the league at equal passing volume and they are still, comfortably, the better bet:

Y0 pass-att/g n_in in ppg n_out out ppg delta
37+ 20 18.02 30 16.56 +1.46
34 to 37 24 17.42 45 16.21 +1.21
31 to 34 21 17.63 48 15.92 +1.71
28 to 31 17 17.05 35 14.50 +2.56
24 to 28 8 19.28 12 15.91 +3.37
under 24 3 19.18 8 16.17 +3.01

Positive in all six bands. Every single one. The two with clean sample on both sides, 31-to-34 and 28-to-31, clear the bar at +1.71 and +2.56. The lift gets bigger as volume drops, which makes sense: when everyone throws 38 times a game the field is already loaded with good QBs, but down in the 28-to-31 band the elite-rate guy is the one who can actually play. Aggregate edge across the whole set: +1.92 ppg. The rate regressed and he still beat the room by two a game.

Fading him because his touchdown rate fell is selling a QB1 for parts because his receipt looked too good. That is not regression analysis. That is pattern-matching on the scary-looking number while ignoring the outcome.

What the engine already figured out

Here is the quiet part. SignalTuned does not regress quarterbacks for touchdown luck, and that turns out to be correct. The only mean-reversion layer in the engine, production_regression, is RB-only by design: we tried extending it to passers and it failed to move the backtest, so it never shipped for QBs. Quarterbacks get a single flat additive nudge, bias_correction.QB at +0.62, and otherwise ride their weighted production. So while the consensus is busy hand-applying a touchdown haircut, the engine simply declines to. The cohort says declining was the right call.

What the engine does NOT have is the inverse: an explicit forward term that says an elite-TD-rate season is a positive durable signal inside a volume band, worth about +1.9 ppg. That gap is the "adds information" verdict. The engine is right not to fade these QBs; it just is not actively crediting the signal either.

What to do about it

For your roster: when the group chat tells you to sell Maye or Mayfield because the touchdowns can't repeat, let them. The rate will dip a couple points. The player will still out-score the QB you would replace him with at the same volume. Buy the discount the regression takes create.

Engine-side, this stages an experimental_features.qb_passing_td_rate_forward_lift block at weight 0 with warm-loop watch, so the A/B harness can sample it without touching live rankings. It is NOT auto-merged: a weight-0 staging makes no ranking change, so it cannot earn the clean-SHIP walk-forward verdict our auto-merge gate demands. And there is an honest caveat the promotion test has to settle, the same one that bit the rushing-QB signal: a chunk of that +1.9 is already baked into weighted_ppg, because a high touchdown rate already meant a high Y0 ppg. Whether any of it is new information the engine misses is a question for the residual harness, not a blog table. This one goes to Ryan with the diff in docs/agent_proposals/. No live ranking change today.

Receipts


Back to all posts