The month split is quieter than the folklore. From 1999 through 2025, October overs went 858-821-26, the best full-period month at 51.1%. November was the lowest at 805-859-26, or 48.4%. Every other regular-season calendar month landed between those two rates.
That narrow range matters. “Cold weather means unders” and “early defenses are ahead” are stories. The closing total is the test. Across all 6,967 regular-season games, overs went 3,399-3,469-99, a 49.5% hit rate. The monthly ledger gives the story a receipt and mostly tells it to lower its voice.
The full monthly record
| Month | Over-under-push | Over rate | Avg points | Avg close |
|---|---|---|---|---|
| September | 701-730-15 | 49.0% | 43.89 | 43.48 |
| October | 858-821-26 | 51.1% | 44.50 | 43.68 |
| November | 805-859-26 | 48.4% | 44.17 | 43.70 |
| December | 901-929-30 | 49.2% | 44.09 | 43.23 |
| January | 134-130-2 | 50.8% | 43.97 | 42.43 |
The table includes only regular-season games. January therefore means late regular-season dates, not playoff football. There were no August regular-season rows in the selected completed seasons. Assigning August a zero would be false; the honest state is that the filtered sample contains no August games.
Closing totals did most of the adjustment
Actual scoring exceeded the average closing total in every calendar month over the full window. The average gap was 0.41 points in September, 0.83 in October, 0.46 in November, 0.86 in December, and 1.54 in January. Yet only October and January produced more over decisions than under decisions.
That is possible because average margin and win count answer different questions. A handful of games that fly far over can lift the average while more games still finish under. For a bettor, the W-L-P line grades the side. For a modeler, the average residual helps diagnose magnitude. We keep both so one cannot impersonate the other.
The closing total itself also changed across the calendar. It averaged 43.48 in September, 43.68 in October, 43.70 in November, 43.23 in December, and 42.43 in January. The lowest average line was in January, which is one reason raw points alone cannot answer whether late-season games went over. The market moved the target.
The recent window tells a different story
| Month | Over-under-push, 2021–2025 | Over rate |
|---|---|---|
| September | 123-151-1 | 44.9% |
| October | 161-172-4 | 48.3% |
| November | 135-167-3 | 44.7% |
| December | 179-150-3 | 54.4% |
| January | 56-54-0 | 50.9% |
Now both screens disagree. The long window says October had the highest over rate. The recent five-season window says December did. September fell from 49.0% over the full history to 44.9% recently. November moved from 48.4% to 44.7%. A monthly “truth” changed when the start date changed.
That does not make either table wrong. It makes the window part of the claim. A current analysis should say “December overs, 2021–2025” rather than “December games go over.” The first is a record. The second quietly promotes a selected sample into a law.
Why calendar month is a blunt feature
A month bundles many things without measuring any of them directly. Schedule week shifts across seasons. Teams change. Closing totals change. Weather and venue vary. The January sample is much smaller than the other months because it contains only the tail of regular seasons. A month label can be useful for orientation, but it is not a mechanism.
The monthly split also pools every total from 28.5 to 63.5 points in the snapshot. A decision at the top of that range and one at the bottom each count equally. That is correct for the broad question. It is not enough to say whether the market behaves differently at high or low totals. A follow-up would predeclare total buckets and keep a separate holdout period.
We also do not turn the average score-minus-line gap into a unit return. The source has over and under prices in many rows, but the broad record is cleaner than assuming one standard price. Profit needs the actual side price and an explicit staking rule.
Both Screens Say
Screen one has the full history: October at 51.1%, November at 48.4%, and no month far from the middle. Screen two has the recent window: December at 54.4%, September and November below 45%. The conclusion is not “bet December overs.” It is “do not quote a monthly angle without its dates and record.”
For current totals, use the NFL picks page to see a graded pick tied to a current number. Use Analytics to test a declared month, season, and market. The NFL totals guide explains why the line, not raw scoring, is the target. Month is a filter. The close is the price.
A practical reading order
Read the record first. Then read the denominator. September has 1,431 decisions in the full window; January has 264. A small change in the January percentage is supported by far fewer games. Next, compare the actual total with the closing total. That tells you whether misses were large even when the decision count was near even.
Finally, choose the window before looking at the answer. The recent table is useful because it tests whether the long-run ranking persisted. It did not. If we had selected 2021–2025 only after noticing December’s result, the split would be exploration. It becomes evidence only when the next test uses games not used to choose it.
What this article cannot answer
It cannot identify why a month moved. The CSV includes weather, roof, surface, rest, quarterbacks, coaches, and officials, but this batch does not fit a multivariable model. It cannot measure opening-to-closing movement because no opening total is present. It cannot grade a preseason total because the snapshot has no preseason game rows.
Those limits are not empty space to fill with a guess. They define the next honest question. A month split is useful when it narrows a follow-up. It is dangerous when it is presented as the follow-up’s conclusion.
A push is not an under
The monthly records retain 99 pushes across the full 6,967-game sample. A push means the final total equaled the closing total. It is not evidence for either side, and moving it into the under column would lower every over rate that contains one.
This matters most when two month rates are close. October and January both finished just above 50% over, but each had pushes that leave the decision denominator. Reporting only games and overs would quietly count refunds as failures. W-L-P makes the rule visible.
The same discipline applies when a total is missing. Missing is not a push. This snapshot has a closing total for every completed regular-season row used here, so the monthly table has no missing-line branch. A live loader still needs one, because a failed odds fetch must say what failed rather than manufacture an under, push, or apparently graded empty state.
When this table is refreshed, the calendar grouping should stay unchanged. Reclassifying January games as “late season” only after seeing their rate creates a new feature. That feature may be worth testing, but it must carry a new label and a new holdout rather than borrowing the monthly record.
Where these numbers come from
How we counted: We concatenated the four files under data/training-snapshots/nfl/, kept played rows with game_type = REG and seasons 1999–2025, and grouped by the calendar month in gameday. Total margin is total - total_line. Positive is an over, zero a push, negative an under. Over rate is overs divided by overs plus unders. January excludes playoffs because the filter remains regular season. The recent comparison repeats the same computation for seasons 2021–2025. Field definitions are in DICTIONARY.json; shard hashes and snapshot row count are in manifest.json.
Average total points by weather bucket
Average combined points scored in NFL games by weather bucket over recent seasons. Wind above 20mph and snow each clip totals by 6-8 points vs domed games, which is why books move totals aggressively when forecasts shift.
NFL ATS cover-margin distribution
Distribution of (final margin − closing spread) across an NFL season. Roughly normal with mean ≈ 0 and standard deviation ≈ 13 points, which is why most ATS edges live in the ±1.5 point window.


