10.13 Seasonality: demand calendars and how to test them
Motivation
Commodity demand has calendars: weddings and festivals for gold in India, the US summer driving season for gasoline, the northern-hemisphere winter for natural gas. It is tempting to conclude that prices have calendars too. This section separates the two claims. Seasonal demand is a fact. Seasonal futures returns are a hypothesis, and the theory of storage and of futures pricing says they should be much weaker than seasonal demand, because a predictable demand pattern is already in the price. We then test the hypothesis properly on 26 years of data.
10.13.1The demand calendars#
Gold in India Indian demand is heavily jewellery, and jewellery buying is tied to auspicious dates and the wedding calendar.
- Akshaya Tritiya (April–May; 19 Apr 2026 per Drik Panchang, with some calendars giving 20 Apr) is a traditional gold-buying day.
- Dhanteras, two days before Diwali, is the largest single buying day; in 2026 it fell on 6 Nov (Diwali 8 Nov) (panchang sources, read 6 Nov 2026).
- The October–December quarter is usually the strongest for Indian demand, combining Dussehra, Dhanteras, Diwali and the start of the main wedding season; the July–September quarter is usually soft (monsoon, and the Pitru Paksha period, considered inauspicious for purchases). This is the standard description in news coverage of the World Gold Council's quarterly Gold Demand Trends (secondary, multiple years). The primary data are WGC's country-level quarterly tables (the "GDT Tables" XLSX on gold.org Goldhub). Download them and check the seasonal pattern yourself before relying on this paragraph.
- Hindu festival dates follow the lunisolar calendar and move by up to about three weeks between years. That is useful for testing: a festival effect and a calendar-month effect can be told apart, because the festival moves and the month does not.
Crude oil and products US gasoline demand rises through spring and peaks in July–August; Labor Day (early September) is the unofficial end of the driving season. Refiners schedule maintenance in low-demand periods, typically late winter/spring and again in September–October, which cuts crude runs (bearish crude, bullish products) while it lasts (EIA Today in Energy and This Week in Petroleum notes, 2007–2026). The seasonality is strongest in product cracks and the gasoline–heating oil spread, weaker in crude itself, which is a global product with offsetting hemispheres.
Natural gas The EIA defines the US storage injection season as 1 April–31 October and the withdrawal (heating) season as 1 November–31 March; inventories peak around end-October and trough around end-March (EIA, Today in Energy and STEO handbook). The October 2026 STEO projected end-October 2026 inventories of 3,850 Bcf, about 2% above the five-year average (EIA, Oct 2026 STEO, secondary summary). The winter premium shows up directly in the futures curve: in a typical year the contracts for January delivery trade above those for the following April–May. Check this on the CME curve for the current date; it is a regularity, not a law.
10.13.2Why seasonal demand need not mean seasonal returns#
Proposition 10.13predictable spot seasonality is priced in the curve
Let be the futures price at for delivery at . If futures prices are unbiased predictors, , then for every fixed contract, , whatever the seasonal pattern of in .
Proof
By the law of iterated expectations, .∎
The seasonal shape lives in the cross-section of delivery months, , not in the time series of any one contract's price. A known winter peak in demand makes the January contract expensive today; it does not make it rise predictably between now and January. Futures are not exactly unbiased (there are risk premia, 10.2 and the Kang–Rouwenhorst–Tang hedging premium), and a risk premium can itself be seasonal, for instance if hedging pressure peaks before winter. So the test is not pointless. But the null hypothesis is "no seasonal return", and the economic prior is that any seasonal return will be small relative to the seasonal swing in spot demand.
For gold the argument is stronger still. Gold is a stock, not a flow (10.4): above-ground stocks are many decades of mine supply, and Indian jewellery demand is a fraction of annual flow, which is itself a small fraction of the stock. A predictable 20–30% swing in one country's quarterly jewellery demand is a tiny, fully anticipated change in the demand for the stock. Where Indian festival demand should show up is in local prices relative to import parity: the domestic premium or discount that dealers quote over the landed cost (10.5). That is a testable prediction (Problem 10.24).
Roll gaps create artificial seasonality Most free data (Yahoo's GC=F, CL=F, NG=F) are continuous front-month series: the price of the nearest contract, switching to the next contract near expiry, with no adjustment. Yahoo does not document its roll rule; the series appears to switch when the front contract expires. Let a month contain one roll, at which the series switches from contract (price ) to contract (price ). The monthly log return of the continuous series is
The first part is what an investor holding and rolling futures earns (compare the roll-yield decomposition in 10.3). The roll gap is not earned by anyone: it is the price difference between two contracts at one instant.
Proposition 10.14seasonal curves produce seasonal roll gaps that sum to zero
Suppose the log futures curve has a stable seasonal shape, , where is the delivery month and is periodic with period 12. A continuous series that rolls once a month from delivery month to has roll gap , and
Proof
At the roll date both contracts are priced off the same , so . The sum telescopes to by periodicity.∎
So roll gaps add nothing to the average return over a year but are concentrated in particular calendar months: for natural gas, with a winter premium, the gaps are positive in the autumn rolls (into November, December and January delivery) and negative in the late-winter rolls (out of February and March delivery into the cheap spring months). A month-dummy regression on the continuous series will "find" this pattern even if no held contract has any seasonal return. A real curve also has a trend component across maturities (contango or backwardation), which adds a non-zero average gap but does not change the seasonal concentration. Problem 10.23 quantifies the effect.
10.13.3The test: month dummies, the -test, multiple testing and a hold-out#
Model Let be the monthly log return and if month is calendar month . Fit
so is the sample mean return of calendar month . The null of no seasonality is (11 restrictions). Equivalently, include a constant and 11 dummies and test that the 11 dummy coefficients are zero.
Proposition 10.15the -statistic
Let be the residual sum of squares under (a constant only) and that of (10.26), with observations. Under , with iid normal errors,
where is the of (10.26) with a constant. This is the one-way ANOVA test of equal group means.
Proof
Under the restricted model is nested in the unrestricted one. With , and , and they are independent because they are squared lengths of projections of onto orthogonal subspaces (the residual space of the unrestricted model, and the part of the dummy space orthogonal to the constant). The ratio of independent chi-squares over their degrees of freedom is . The second form divides numerator and denominator by .∎
Commodity returns are fat-tailed and heteroscedastic (NG volatility is much higher in winter), so also report a heteroscedasticity-robust (HC) Wald version of the same restriction. Monthly returns have little autocorrelation, so HAC corrections matter less here than in 10.12.5.
Multiple testing Reporting the best single month ("January is gold's best month, ") is 12 tests per commodity; doing it for three commodities is 36. The joint -test is one test per commodity, which is why it should come first. Across commodities, and for any month-by-month claims, apply Bonferroni or Holm (M04 · 4.6, Propositions 4.14–4.15). With 36 tests at 5% you expect false rejections even if nothing is seasonal.
Out of sample Estimate the month means on the first half, then check the second half: do the month means correlate across halves, and does a rule that goes long in months with positive first-half means and short in the others make money in the second half? A real seasonal effect predicts a positive correlation; data-mined noise predicts none.
10.13.4Results: gold, WTI and Henry Hub, September 2000 to October 2026#
Data Yahoo Finance continuous front-month futures GC=F (COMEX gold), CL=F (NYMEX WTI) and NG=F (NYMEX Henry Hub), month-end closes, monthly log returns, 314 full months from September 2000 to October 2026 (downloaded 6 Nov 2026 with yfinance; OLS with statsmodels, HC1 errors for the robust test). Re-running later will add months and shift the numbers slightly. No month-end close was non-positive (WTI's −$37.63 on 20 Apr 2020 was intra-month). These are continuous series and include roll gaps (10.24).
Joint tests (10.27),
| Series | Mean (% / month) | SD (%) | HC-robust | ||||
|---|---|---|---|---|---|---|---|
| GC=F | 0.84 | 4.81 | 1.32 | 0.210 | 1.30 | 0.223 | 0.046 |
| CL=F | 0.37 | 11.08 | 0.75 | 0.690 | 1.14 | 0.330 | 0.027 |
| NG=F | −0.16 | 16.08 | 2.06 | 0.023 | 1.84 | 0.047 | 0.070 |
Month means (% per month) and the split-sample check First half: Sep 2000–Dec 2013 (160 months); second half: Jan 2014–Oct 2026 (154 months).
| Month | GC full | GC 1st | GC 2nd | CL full | NG full | NG 1st | NG 2nd |
|---|---|---|---|---|---|---|---|
| Jan | 2.81 | 2.08 | 3.53 | 1.63 | −7.04 | −8.41 | −5.67 |
| Feb | 1.12 | 0.94 | 1.31 | 3.24 | −3.38 | 0.81 | −7.57 |
| Mar | 0.11 | −0.38 | 0.60 | 1.01 | 0.22 | −0.56 | 1.00 |
| Apr | 1.17 | 0.51 | 1.83 | 1.88 | 3.18 | 0.69 | 5.68 |
| May | 0.19 | 0.62 | −0.25 | 1.44 | 2.01 | 0.98 | 3.05 |
| Jun | −1.01 | −1.59 | −0.44 | 1.80 | −0.74 | −2.77 | 1.29 |
| Jul | 0.86 | 1.03 | 0.68 | 1.10 | −2.37 | −1.30 | −3.44 |
| Aug | 2.38 | 2.70 | 2.06 | −0.91 | −0.96 | −9.02 | 7.11 |
| Sep | 0.27 | 2.11 | −1.70 | −1.35 | 6.91 | 10.10 | 3.48 |
| Oct | −0.26 | −0.80 | 0.32 | −1.79 | 5.69 | 7.38 | 3.87 |
| Nov | 1.19 | 3.04 | −0.98 | −3.26 | 1.17 | 0.29 | 2.20 |
| Dec | 1.34 | 0.60 | 2.20 | −0.27 | −7.10 | −0.44 | −14.88 |
Each month has 26 or 27 observations; with monthly standard deviations of 4.8% (gold) and 16% (gas), the standard error of a single month mean is about 0.9% for gold and 3.1% for gas.
Multiple testing The smallest single-month -values (Welch test of the month against all other months) are gold January (), gas September () and gas October (): three raw rejections out of 36 tests, against 1.8 expected under the null. After Holm within each commodity, no month is significant (smallest adjusted : gold 0.41, WTI 0.61, gas 0.30). Across the three joint -tests, Holm multiplies the smallest by 3: gas becomes , not significant at 5% (Problem 10.22).
Out of sample The correlation between first-half and second-half month means is 0.10 for gold (Spearman 0.02), 0.34 for WTI (Spearman 0.22) and 0.15 for gas (Spearman 0.20); none is distinguishable from zero with 12 points. The sign rule earns 0.68% a month on gold in the second half (), 1.31% on WTI () and 2.02% on gas (). The gold figure is the most tempting number in this section and the one to distrust: it is one of three rules, its two-sided is 0.054 before any adjustment, and it was found by looking.
Reading the results
- Gold and WTI: no evidence of calendar seasonality in returns, jointly or month by month, in or out of sample. This is what Proposition 10.13 leads you to expect for liquid, storable, globally traded commodities. Indian festival demand is real, but it is not visible in the dollar gold price.
- Natural gas: the joint test rejects at 5% on its own (robust ) but not after accounting for the three commodities tested. The pattern (strong September–October, weak December–February) has the shape Proposition 10.14 predicts from roll gaps under a winter-premium curve. The first-half/second-half instability (August −9.0% then +7.1%; December −0.4% then −14.9%) also looks more like noise and roll effects than a stable premium. To test gas seasonality properly you need individual contract prices, so that you can compute the held-contract return in (10.24) and drop the roll gap. A contract-by-contract dataset (CME, or a vendor) is required; Yahoo's free series is not enough.
- The general lesson matches M04 · 4.6: one joint test first, multiple-testing control for anything finer, and a hold-out sample that you look at once.