Seasonality: is September a bad month for stocks and bonds?
On this page
Key takeaways
- A seasonality table averages every January, every February and so on, and shows how often each month was positive and whether its average stands out from chance.
- Forty years of data give only about forty Septembers. With monthly stock returns as volatile as they are, an average needs to be far from zero before it stands out from chance.
- The usual test, the t-statistic, asks how far a month's average sits from zero compared with how noisy it is. A reading beyond about 2 either way would arise by chance only about one time in twenty if the month had no real effect.
- Testing twelve months at once makes a chance hit likely: with no real effect anywhere, there is close to an even chance that at least one month crosses the line.
- MarketHeist tests each month's average against zero, not against the other months, so a steadily rising asset can show several standout months without any calendar effect.
Definition
Seasonality is the pattern of average returns by calendar month: whether some months, such as September, have tended to be weaker or stronger than others. Because each month appears only once a year, even decades of data give a few dozen observations per month, so a seasonal average needs a significance test, such as a t-statistic, before it means anything.
Also known as: September effect, monthly seasonality, calendar effects, sell in May, January effect, month-of-the-year effect, t-statistic of monthly returns.
How it works
Take a portfolio's monthly returns, group them by calendar month, and average each group. The share of positive years in each group and the number of years in it complete the picture. A month that averaged a loss over decades, or was positive in fewer than half its years, looks like a candidate for an effect.
The problem is sample size. A stock index moves several percent in a typical month, and a calendar month appears once a year, so the average of forty Septembers still has a wide margin of error: roughly the monthly standard deviation divided by the square root of forty. A single crash month, such as September 2008, moves that average noticeably on its own.
The t-statistic puts the average in units of its own margin of error. A t-statistic of 1 says the average is one standard error from zero, something chance produces about a third of the time. Beyond about 2 it is unusual for chance alone, and that is the conventional bar for calling an average statistically significant. A seasonal story with a t-statistic near 1 is a story about noise.
Looking for the weakest month among twelve is like finding the unluckiest seat in a classroom by counting who got sick last winter: some seat always comes last, and it usually tells you nothing about the chair.
Two further cautions apply. First, the test asks whether a month's average differs from zero, not whether it differs from the other months; a fund that tends to rise shows several months significantly above zero for that reason alone. Second, whoever tests twelve months and reports the most striking one has run twelve tests, and the chance that one of them looks significant by accident is much higher than for a single test.
Formula
- r_y,m
- return in calendar month m of year y
- nₘ
- number of years in the window that include month m
- r̄ₘ
- average return of month m
- pₘ
- share of years in which month m's return was zero or more
- tₘ
- t-statistic of month m: its average in standard errors from zero
- sₘ
- sample standard deviation of month m's returns (divides by nₘ − 1)
- sₘ / √nₘ
- standard error of the month's average
With about forty years, |tₘ| ≥ 2 corresponds to a two-sided p-value of about 0.05 under the usual assumptions: independent months and a roughly normal average.
- P(·)
- probability, if no calendar month has a true effect
- 0.05
- chance that one month crosses |t| ≥ 2 by accident
- 12
- number of calendar months tested
About 0.46. A Bonferroni correction keeps the overall false-alarm rate near 0.05 by asking each month for p ≤ 0.05 / 12, roughly |t| ≥ 3 with forty years of data.
Worked example
The S&P 500 (SPY) and intermediate-term Treasuries (IEF), monthly total returns from Feb 1985 to Sep 2026, about 42 years.
The S&P 500's weakest calendar month on average was September: across 42 Septembers the index averaged -0.7% and finished positive in 47.6% of them, about a coin toss.
Is that a September effect? The t-statistic says the evidence is thin. September's was -1.03: the average sits about one standard error below zero, which chance alone produces routinely in a sample of this size. A few bad Septembers, such as 2002, 2008 and 2022, do much of the work.
Treasuries did not share it. IEF's Septembers averaged 0.4%, positive in 64.3% of years, with a t-statistic of 1.22. Bonds and stocks both gained on average across the year, and for bonds September was an ordinary month.
By the |t| ≥ 2 rule, 4 of the S&P 500's twelve months and 6 of IEF's look significant, and September is not one of them for either. Those significant months are ones with high averages, and they mostly reflect that both assets tended to rise; the test compares each month with zero, not with the rest of the year, and twelve months were tested at once.
Data through Sep 2026. Reproduce id f622e8be3cd67f15 (this guide, its lab setup and the data month).
Interactive lab
Average return by calendar month for both picks over the same years, with the share of positive years and the t-statistic of each month; months with |t| of 2 or more are marked. Switch the portfolios to test another September.
| Month | SPY average | SPY positive | SPY t | IEF average | IEF positive | IEF t |
|---|---|---|---|---|---|---|
| January | 1.1% | 63% | 1.59 | 0.7% | 68% | 2.47 ● |
| February | 0.6% | 60% | 0.92 | 0.2% | 57% | 0.80 |
| March | 1.0% | 69% | 1.58 | 0.1% | 55% | 0.49 |
| April | 1.7% | 69% | 2.58 ● | 0.1% | 57% | 0.20 |
| May | 1.7% | 76% | 3.09 ● | 0.6% | 60% | 2.22 ● |
| June | 0.5% | 62% | 0.86 | 0.7% | 67% | 3.30 ● |
| July | 1.5% | 62% | 2.55 ● | 0.7% | 71% | 2.86 ● |
| August | 0.1% | 62% | 0.09 | 0.9% | 69% | 3.65 ● |
| September | -0.7% | 48% | -1.03 | 0.4% | 64% | 1.22 |
| October | 1.1% | 63% | 1.18 | 0.1% | 51% | 0.68 |
| November | 2.2% | 76% | 3.16 ● | 0.7% | 63% | 2.22 ● |
| December | 1.2% | 71% | 1.83 | 0.4% | 59% | 1.14 |
Average: mean return of that calendar month across the window (41 and 41 observations per month). Positive: share of those months at or above zero. t-statistic: the mean over its standard error; ● marks |t| of 2 or more. Feb 1985 to Sep 2026.
How MarketHeist computes it
Every choice an implementation has to make, as the code makes it today. The page is checked against the code each time it is built.
| Choice | How it is computed | In the code |
|---|---|---|
| Data | Monthly total returns (dividends reinvested). Funds younger than the period shown are extended backward with older funds, spliced on returns, not prices. | |
| Window | The worked example and the lab use the common window of the two portfolios compared, Feb 1985 to Sep 2026 (500 months), ending at the data month of this page; every calendar month has one observation per year. | |
| Portfolio streams | A fund is its proxy-extended monthly return stream. A built-in portfolio is read as the MarketHeist MCP reads it: its composed stream with its own rebalancing rule and overlay. A custom mix is rebalanced yearly. | |
| Calendar months | The monthly returns are grouped by calendar month. For each: the mean, the share of months at or above zero, and the t-statistic, the mean over the sample standard deviation divided by the square root of the number of years. A bar is marked when the t-statistic is 2 or more in size. | |
| Inputs | Monthly total returns (dividends reinvested) over the common window of the two picks; portfolios are simulated with their own rebalancing rule first. A partial first or last year contributes only the months it has, so the counts per month can differ by one. | simulatePortfoliopackages/portfolio/engine/portfolio.ts |
| Average and positive share | For each calendar month: the arithmetic mean of its returns, and the share of years in which the return was zero or more. | seasonalitypackages/portfolio/engine/analytics.ts |
| t-statistic | The month's mean divided by its sample standard deviation (divides by n − 1) over √n. It tests the month against zero, not against the other months, and makes no correction for testing twelve months. A month with fewer than two years, or with no variation, gets 0. | seasonalitypackages/portfolio/engine/analytics.ts |
| Significant months | Months whose t-statistic is 2 or more in absolute value. This is the conventional single-test bar, not a multiple-comparisons bar. | |
| Same numbers in the app and the MCP | The portfolio app's seasonality chart and the MCP's seasonality table call the same function on the same monthly returns. | seasonalitypackages/portfolio/engine/analytics.ts |
| Engine functions | The functions the portfolio app and the MarketHeist MCP tools run, called here on the same monthly returns. | seasonalitypackages/portfolio/engine/analytics.ts |
Seasonality of returns (calendar-month effects) compared with its neighbours
| Check | What it tells you | What it misses |
|---|---|---|
| Average return by month | Which months were weak or strong in this sample | Whether the difference is larger than chance |
| Share of positive years | How often the month gained | How large the gains and losses were |
| t-statistic against zero | Whether the month's average stands out from zero | Whether it differs from the other months; the twelve-test problem |
| Test against the other months | Whether the month differs from the rest of the year | Still twelve tests, and still a short sample per month |
| Out-of-sample check | Whether the pattern held in years not used to find it | Needs decades more data to say much |
Limitations
- A few dozen observations per month leave wide margins of error, and one extreme year can create or erase an apparent effect.
- The t-statistic assumes independent months and a roughly normal average. Fat tails and clusters of bad years make the true uncertainty larger than it suggests.
- Testing all twelve months and pointing at the most extreme one is a multiple-comparisons problem. A month that clears |t| ≥ 2 on its own is weaker evidence when it was picked from twelve.
- A pattern found in the past, even a real one, can fade once it is widely known and traded on. Calendar effects published in the research have often weakened afterward.
- Long histories are extended backward with older funds or indexes where a fund is younger than the window, so early months approximate the fund rather than reproduce it.
Frequently asked questions
- Is September a bad month for stocks?
- In this window it was the S&P 500's weakest month on average, and many studies of longer US history find the same. But the t-statistic is small: the September average is within the range that chance produces with a few dozen years of data, so it is weak evidence of a reliable effect.
- Is September a bad month for bonds?
- Not for intermediate Treasuries in this window: their September average was positive and unremarkable. The worked example shows the figures.
- What does a t-statistic of 2 mean?
- That the average is two standard errors away from zero. If the true average were zero, a value that extreme would come up by chance roughly one time in twenty. It is a conventional threshold for one test, not proof of an effect, and it is too lenient when twelve months are tested at once.
- Does sell in May and go away work?
- Historically, US stocks have averaged less from May to October than from November to April, and some studies across many countries find the same. Whether the gap is large and stable enough to trade on, after costs and taxes and with stocks still averaging gains in the summer months, is much less clear. The lab shows each month's average and t-statistic for any portfolio offered.
- How many years of data does a seasonality test need?
- More than most investors have. Each year adds a single observation per month, and the margin of error shrinks only with the square root of the number of years, so quadrupling the history halves it.
References
- Bouman, S. and Jacobsen, B. (2002) The Halloween Indicator, Sell in May and Go Away: Another Puzzle. American Economic Review 92(5).
- Rozeff, M. S. and Kinney, W. R. (1976) Capital Market Seasonality: The Case of Stock Returns. Journal of Financial Economics 3(4). The January effect.
- Lakonishok, J. and Smidt, S. (1988) Are Seasonal Anomalies Real? A Ninety-Year Perspective. Review of Financial Studies 1(4).
- Sullivan, R., Timmermann, A. and White, H. (2001) Dangers of Data Mining: The Case of Calendar Effects in Stock Returns. Journal of Econometrics 105(1). Calendar effects after accounting for how many were searched.
- Harvey, C. R., Liu, Y. and Zhu, H. (2016) ... and the Cross-Section of Expected Returns. Review of Financial Studies 29(1). Why multiple testing raises the bar to roughly |t| above 3.
Try it on your own holdings
Open the S&P 500 in the portfolio app and see its seasonality chart →
Or ask an assistant connected to the MarketHeist MCP server (https://marketheist.io/mcp), which computes the same figures:
Using MarketHeist.io, is September a bad month for stocks and bonds? Show the average September return, the share of positive Septembers and the t-statistic for SPY and for IEF.
Ask an AI assistant
The prompt opens in a new tab, already filled in. An assistant without the MarketHeist connector answers from its own knowledge, not from the figures on this page.
Historical simulation, not advice. Computed by the MarketHeist portfolio engine from monthly total returns, data through Sep 2026. Markdown version of this page: seasonality.md.