Skip to main content
← All research papers

Explainer · Kresmion Research

Futures Seasonality: What Monthly Patterns Can and Cannot Tell You

July 19, 2026 · 17 min read
ShareXLinkedInReddit
seasonalityfuturesCommoditiesdata-literacyCL=FNG=FRB=F

# Futures Seasonality: What Monthly Patterns Can and Cannot Tell You

The one takeaway: Seasonal averages are descriptive history built from tiny samples (about ten observations per calendar month). They are context for understanding a market, not a timing tool, and across the 240 cells Kresmion tracks some extreme-looking numbers are inevitable by chance.

When someone says a futures market "tends to rise" in a given month, they almost always mean one thing: the average of a handful of past versions of that month was positive. This piece explains what that statement contains, walks through three real cells from the Kresmion futures seasonality tool, and is honest about how little weight one cell can carry. All figures come from Kresmion's production price database as of the Friday 2026-07-17 close.

Key takeaways

PointWhat the data showsAs of
A cell is a small sampleEach calendar-month cell holds about 10 yearly observations across roughly ten years of history (2016-07-19 to 2026-07-17)2026-07-17
The grid is large20 active contracts times 12 months equals 240 cells, so some extremes are expected by chance2026-07-17
Headline averages are fuzzyStandard errors are large: WTI July mean +3.47% with SE 2.84% (t 1.22); RBOB March mean +10.88% with SE 9.09% (t 1.20)2026-07-17
The significance bar is high and mostly unmetOnly natural gas December (mean -12.35%, t -2.38) clears the two-sided 5% threshold for nine degrees of freedom (about 2.26), and only barely; WTI July and RBOB March fall well short2026-07-17
Some cells embed contract rollsRBOB March embeds a February-to-March contract roll worth about +14% overnight in the continuous series, so part of that cell is a contract switch a single position could not capture; the in-progress July 2026 lifts WTI July from +1.78% (9 completed Julys) to +3.47%2026-07-17

What "tends to rise in month X" actually means

Kresmion builds each seasonal cell from plain arithmetic on daily closes; there is no model, no smoothing, and no statistical test behind the numbers. The pipeline collapses each month to its month-end close (the last daily close in that month), then takes a month-over-month percent change: for month M, the return is (month-end close of M minus the prior month-end close) divided by that prior close, times 100. So the number is a calendar-month change measured end to end, not an intramonth swing, and it is labeled by the later month (a "January" figure is the move from end of December to end of January). The definitions live in the Kresmion methodology, section 21.

Each cell reports three things: n (how many yearly observations landed in that calendar month), the average of those yearly returns, and the hit rate (the share strictly positive). So "crude tends to rise in July" means: across the roughly ten past Julys in the sample, the average July return was positive and more than half were up. It is a summary of a small pile of past Julys, nothing more. Kresmion shows the average and hit rate only when n is at least three; that floor is a display-honesty guard, not a reliability threshold. Three observations is still far too few to trust.

Three real cells, and why none is a clean signal

The seasonality tool surfaces cells like these. All three verify from the production database. None of the three survives a close look as a dependable signal, and for three different reasons.

WTI crude (CL=F), July

Across the nine completed Julys in the sample (2017 through 2025), WTI crude averaged +1.78% with 66.7% positive. If you add the in-progress July 2026, which was only about 12 trading days old at the 2026-07-17 close, the average jumps to +3.47% with 70.0% positive (7 of 10), because that partial month ran +18.69% (a 2026-06-30 close of 69.500 rising to 82.490). The completed-month history is roughly half the headline figure, and the single unfinished month is the largest positive contributor. That is why the honest number to lead with is +1.78%, not +3.5%. Neither version clears a conventional significance bar: the included-partial t is only 1.22.

Natural gas (NG=F), December

Natural gas December averaged -12.35% across ten complete Decembers, with a median of -11.09% and only 20.0% (2 of 10) positive. On a naive test it is the only one of the three that clears a conventional threshold (t -2.38 against a two-sided 5% cutoff near 2.26 for nine degrees of freedom), and natural gas is the commodity with the clearest physical seasonality in demand. Even so, two cautions apply before anyone calls this a clean seasonal signal.

First, the average is stretched by a single extreme year. December 2018 fell -36.25%, the largest move in the column, while the best December rose +11.10% (2016). That one year pulls the mean well below where the other Decembers sit. But the pattern survives its removal: strip December 2018 out and the remaining nine Decembers still average about -9.7%, a clear seasonal decline rather than noise. So the outlier exaggerates the size of the December drop without being the reason it exists; the small-sample fragility here is about the precise magnitude, not about whether the direction is real.

Second, the mechanism is subtler than the simple "cold weather lifts prices" story, and it is worth being precise about why, because the naive version gets it backwards. Under Kresmion's month-end-to-month-end method, the December cell measures the move from the end-of-November close to the end-of-December close. Across almost all of that window the front contract is the January contract: the December-delivery contract had already expired in late November, and January does not expire until the final few days of December. So the -12.35% is predominantly the January front contract's own price falling over the month, a genuine front-month move, not a stitching or roll artifact. The January-to-February roll only lands in the last couple of days of the window, and that calendar spread is typically a low-single-digit percentage and can point either way, so it cannot account for much of the figure. Why would a winter contract fall through December even as heating demand climbs? The most plausible reading is that the market spends months pricing a risk premium into deep-winter delivery, and as that winter's weather and storage picture actually resolves, the premium tends to deflate. Naive demand logic (more heating demand should mean higher prices) points the opposite way to what the front-month number does, which is exactly why this seasonal figure is so easy to misread. So even natural gas, the textbook seasonal commodity, does not hand a holder a clean, capturable monthly return.

RBOB gasoline (RB=F), March

RBOB gasoline March averaged +10.88% with a median of +14.42% and 90.0% positive (9 of 10). Two things make that average untrustworthy as a signal.

First, Kresmion's series is continuous front-month, and across the February-to-March boundary the front contract switches to a more expensive summer-specification gasoline (NYMEX RBOB summer-grade, which carries a tighter, lower-volatility blend requirement, begins with the April contract). In the 2026 data the series gaps from a 2026-02-27 close of 2.078 to a 2026-03-02 close of 2.371, about +14% overnight with no trading day in between. A jump that large with no trading day between the two closes can only be a difference in contract specification, not a return a holder of one position could have captured.

Second, the sample contains two enormous opposite-signed prints of similar magnitude: March 2020 at -58.93% (the COVID crash) and March 2026 at +59.41%. Because they are large and roughly cancel, they do little to the average but a great deal to the spread. That is why the standard error is a huge 9.09% and the t-stat is only 1.20: the two tails inflate the dispersion, not the central tendency. The +59.41% March 2026 print is worth unpacking rather than waving away as a glitch. Read against the daily closes, it is two effects stacked together: the roughly +14% February-to-March roll gap described above, plus a real and continuous gasoline advance through the month, from the 2026-03-02 close of 2.371 to a 2026-03-31 close of 3.312, about +40% climbed in an orderly day-by-day fashion across the roughly 21 trading days of March on healthy volume, with no further gaps or single-day spikes. So the number is genuine, not a data error. But it still is not a clean seasonal return: a meaningful chunk of the headline print is the contract switch rather than a price a single position could have held, and one dramatic year like this widens the March column's dispersion far more than it moves its center. The honest reading of the +10.88% average is that it sits on top of a large roll gap and a pair of violent, offsetting years, so it should carry very little weight as a forecast.

The 240-cell problem

Kresmion tracks 20 active contracts, each with a 12-month row, for 240 cells. This is the load-bearing fact of the whole subject. When you scan 240 cells for the ones that "tend to rise", you are running 240 separate looks, which is precisely why some cells look dramatic even if no real seasonal effect existed anywhere.

A teaching illustration (not a database readout): suppose no market had any true seasonality, so every cell's real average was zero. Sampling noise alone would still make some cells look large. If you flagged any cell that cleared a one-in-twenty threshold, you would expect about 0.05 times 240, roughly a dozen cells, to trip that bar by luck. So finding a handful of eye-catching cells is the expected outcome of scanning the grid, not evidence that any one pattern is real.

The same logic undercuts "best month" and "worst month" labels. The maximum of twelve noisy estimates is biased upward, so a labeled best month overstates whatever edge that month truly has. Read it as "the month that scored highest in this sample", not "the month that is genuinely strongest".

Hit rates deserve the same skepticism. A 70% hit rate over ten years is simply 7 of 10 up years. The band around a 7-of-10 proportion is wide; a standard binomial interval spans from roughly the high 30s to the low 90s percent (illustrative, not a tool output). "Up 70% of the time" is compatible with a true frequency anywhere from a coin flip to near-certainty, and it is not a probability that next year will be up.

Where a physical cause exists, and why that is still not a timing tool

The honest framing is not that seasonality is all noise. Demand for some commodities genuinely swings with the calendar, and natural gas is the textbook case on the demand side. US working-gas inventories build from April through October (the injection season) and are drawn down from November through March (the withdrawal season), because production stays fairly steady while demand swings with the weather (US EIA). Inventories therefore tend to peak around the end of injection season in late autumn and bottom at the end of winter. US gas use has two demand peaks, not one: a larger winter peak from heating, when residential deliveries exceed about 30 Bcf per day, and a smaller summer peak from air conditioning and gas-fired power (US EIA).

That physical demand pattern is real. Turning it into a specific monthly futures return is where it gets slippery, for three reasons.

First, the forward curve, not just today's spot price, carries the seasonal expectation. Because a build-and-draw storage cycle and the cost of carrying inventory are well understood, the futures curve already prices in expected seasonal supply and demand: winter-delivery contracts typically trade at a premium to shoulder-season contracts well before winter arrives. A seasonal tendency that everyone can see is largely embedded in the curve already, so it is context, not a free edge.

Second, it helps to keep two different ideas about curve shape apart, because they are easy to confuse. "Contango" and "backwardation" describe the shape of the curve today, with the front contract priced below or above the next one; Kresmion's curve service labels the front-to-second-month spread as contango above +0.25% and backwardation below -0.25%. Those states come from storage and carry economics. That is a different idea from Keynes's "normal backwardation", a risk-premium theory holding that futures sit below the expected future spot price so that hedgers pay speculators a premium for bearing price risk (normal backwardation). Normal backwardation is about risk premia, has only qualified empirical support, and does not explain the seasonal shape of a curve at all; the seasonal shape comes from expected seasonal supply and demand plus storage and carry, as above. Treating a seasonal curve shape as if Keynes's theory produced it is a common but wrong move.

Third, magnitude is unknowable from ten data points, and a pattern that everyone can see tends to weaken as more participants trade it. As the natural gas December cell above shows, even the commodity with a genuine physical demand cycle does not hand you a clean, isolatable monthly return: its most-cited seasonal figure is a front-month decline that runs opposite to naive heating-demand logic, is amplified by one extreme year, and is largely anticipated in the shape of the forward curve before winter even arrives. Real physical cause, still not a timing tool.

Honest limitations

  • Ten years is about ten observations per cell. The most any bucket holds is ten yearly returns (nine for WTI July, because the series starts 2016-07-19 with no June 2016). The minimum-three-years floor is a display guard, not a reliability threshold.
  • The tool is purely descriptive. It reports average, hit rate, and count, with no confidence intervals, no significance test, no de-trending, and no regime control. Any claim of statistical strength here comes from Kresmion's own caveated reasoning, not the tool.
  • Averages can be inflated by one year. Natural gas December's -12.35% is amplified by December 2018 (-36.25%); remove that single observation and the remaining nine Decembers still average about -9.7%, so the direction of the pattern survives while its size is exaggerated by the outlier. Treat the magnitude of any small-sample average that one year stretches with extra caution.
  • Continuous front-month series carry roll artifacts. The series is stitched, not a single held position, so some monthly returns embed the contract switch rather than a pure move in the commodity. This is worst for RBOB across the February-to-March boundary (about +14% built into the 2026 series). It applies to the monthly-expiry energy contracts in general, but far less to contracts that expire only quarterly (equity index and FX futures roll about four times a year, so most of their monthly cells carry no roll at all). Not every energy cell is roll-driven, though: natural gas December, for instance, is predominantly a genuine front-month decline, not a stitch.
  • Extreme single prints must be checked against raw data, not assumed. An eye-popping monthly cell can be a database error, a contract-roll gap, or a genuine violent move, and only inspecting the underlying daily closes tells those apart. The March 2026 RBOB figure (+59.41%) is the case in point: on inspection it is real (a roughly +14% roll gap plus a continuous, orderly intramonth climb on healthy volume), not a glitch, yet it still is not a return a single held position would have earned in full. The lesson is to verify an extreme cell against its daily prices before either trusting it or dismissing it.
  • 240 cells guarantee chance extremes. Scanning 20 contracts times 12 months manufactures striking numbers with no real cause, and the tool does not correct for multiple looks. Best-month and worst-month labels are biased outward by selection.
  • Regimes change. The sample is entirely post-2016 and leans heavily on an unusual stretch that includes the 2020 COVID crash and the 2022 energy shock. A decade that contains 2020 and 2022 is not a neutral sample, so a "seasonal" average can be a trend artifact of those years.
  • Partial current months contaminate. July 2026 was only about 12 trading days done at the as-of close yet counts as a full July; the completed-month average is materially lower.
  • A calendar correlation is not causation. Without a supply-and-demand mechanism, an apparent effect can be a coincidence of the window, and known seasonal edges tend to weaken as more participants learn them. Even a practitioner who defends commodity seasonality recommends paper-trading any pattern out of sample for at least a year before relying on it, especially where no physical cause exists (Ernie Chan).

Methodology and sources

Data desk basis. Kresmion production database, table `futures_prices`: continuous front-month daily closes (yfinance-style =F symbols) for 20 active contracts, roughly 2,511 to 2,521 rows each, from 2016-07-19 to 2026-07-17 (about ten years). Seasonality is the last-trading-day close of each calendar month, month-end to month-end simple returns, aggregated by calendar month. As-of last close: Friday 2026-07-17; brief run Sunday 2026-07-19. Method: Kresmion methodology, section 21 (month-end method, minimum-three-years rule). Reproduce the cells in the Kresmion futures seasonality tool.

Curve states. Any contango or backwardation labels here use Kresmion's curve service definitions: contango above +0.25% and backwardation below -0.25% on the front-to-second-month spread.

Cross-check. The public `futures/curve` endpoint returned as_of 2026-07-17 with the CL front contract CLQ26.NYM at 82.49, matching the continuous CL=F close for 2026-07-17. This piece uses that value as the in-progress July partial, not as a true month-end (July was not complete at the as-of date).

Every figure ties to a single source: Kresmion's `futures_prices` via saved SQL, cross-checked against the public curve endpoint, or a clearly labeled arithmetic illustration. The 0.05-times-240 and 7-of-10 figures are teaching illustrations, not database readouts. This is descriptive market education from Kresmion Research; it contains no buy or sell advice, no target prices, and no prediction of what any contract will do.

FAQ

Does a positive seasonal average mean the market will rise this year?

No. A positive average means that across about ten past versions of that calendar month, the returns averaged above zero. It says nothing certain about the next occurrence. With only about ten observations per cell, the standard error is large (for example, WTI July's +3.47% average carries a standard error of 2.84%, well within reach of zero), so the average is a fuzzy estimate of the past, not a forecast. Treat it as a market's "climate", useful orientation, rather than a forecast for the specific month ahead.

Why do some seasonal cells look so strong if the effect is not real?

Because Kresmion tracks 240 cells (20 contracts times 12 months), and scanning that many noisy estimates guarantees some will look dramatic by chance. As a teaching illustration, if no market had any true seasonality, you would still expect roughly a dozen cells to clear a one-in-twenty threshold by luck. "Best month" labels are also the maximum of twelve noisy numbers (biased upward), and roll gaps can inflate a cell with no real price move. A single striking cell is the expected output of a wide grid, not proof of a pattern.

Natural gas has an obvious winter demand spike. Is its seasonality real?

The physical demand pattern is real: heating drives a large winter peak and air conditioning a smaller summer one (US EIA). But a real demand pattern is not the same as a reliable monthly futures return. The forward curve already prices the expected seasonal build and draw before the season arrives, and on a continuous front-month series a figure like December's -12.35% is mostly a genuine front-month price decline (the winter risk premium deflating as that season's weather and storage resolve, which runs opposite to naive heating-demand logic), only slightly affected by the roll, and amplified by one extreme year (2018, -36.25%), though it is still about -9.7% with that year removed. So the cause is genuine while the tradeable monthly number is not clean. Real physical cause, still not a timing tool.

Sources

1. Kresmion production database, table `futures_prices` (continuous front-month daily closes, 20 contracts, 2016-07-19 to 2026-07-17), via the saved SQL queries; as-of close 2026-07-17. Tool: https://kresmion.com/tools/futures-seasonality 2. Kresmion methodology, section 21 (month-end method, minimum-three-years rule): https://kresmion.com/about/methodology 3. US EIA, Today in Energy id=62724 (injection April through October, withdrawal November through March): https://www.eia.gov/todayinenergy/detail.php?id=62724 4. US EIA, Today in Energy id=22892 (two seasonal demand peaks; winter residential deliveries above about 30 Bcf per day): https://www.eia.gov/todayinenergy/detail.php?id=22892 5. Wikipedia, Normal backwardation (Keynes, A Treatise on Money, 1930): https://en.wikipedia.org/wiki/Normal_backwardation 6. Ernie Chan, Are claims of seasonality in commodity futures for real? (2007): http://epchan.blogspot.com/2007/05/are-claims-of-seasonality-in-commodity.html

Kresmion Research. Information only. Not investment advice.

Sources
  • · Kresmion production DB futures_prices via saved SQL, as-of close 2026-07-17 (tool: https://kresmion.com/tools/futures-seasonality)
  • · Kresmion methodology, section 21 (month-end method, n>=3 rule): https://kresmion.com/about/methodology
  • · Kresmion public futures/curve endpoint cross-check, as_of 2026-07-17, CLQ26.NYM 82.49 (used as the in-progress July partial value, not a true month-end)
  • · Kresmion curve service (futures_curve_service.py) contango/backwardation thresholds: +0.25% / -0.25% on front-to-second-month spread
  • · US EIA, Today in Energy id=62724 (injection/withdrawal seasons): https://www.eia.gov/todayinenergy/detail.php?id=62724
  • · US EIA, Today in Energy id=22892 (two seasonal demand peaks; winter residential deliveries above ~30 Bcf/day): https://www.eia.gov/todayinenergy/detail.php?id=22892
  • · Wikipedia, Normal backwardation (Keynes, A Treatise on Money, 1930): https://en.wikipedia.org/wiki/Normal_backwardation
  • · Ernie Chan, Are claims of seasonality in commodity futures for real? (2007): http://epchan.blogspot.com/2007/05/are-claims-of-seasonality-in-commodity.html
FREE, NO ACCOUNT

Put this to work every morning

Real filings, 13F flows, and positioning reads with the source on every number, in your inbox daily or live on Telegram. Free, no account.

Get the morning brief by email

One email a day. Unsubscribe anytime. We never sell your data.

Or get live alerts on Telegram
Join on Telegram

One tap. Live alerts, no email needed.

Kresmion publishes information, not investment advice. See our methodology and the latest research notes.

Kresmion
Ahead of the move. Ahead of the news.

You just read one finding. Kresmion surfaces a new cross-source signal like this every day. See what else is moving, free.

One tap with Google. No card. Prefer email?
Free in beta
Get the next finding, free.

Kresmion finds one sourced cross-asset signal like the one above every day. Drop your email and the next one lands in your inbox. Every figure links to its filing. No card.

One email a day. Unsubscribe anytime. Every number on Kresmion links to its source.