Strasmore Research
Learn Matt ConnorBy Matt Connor · data as of September 18, 2026 · refreshed weekly

The September Effect: Is It Real? SPY Data

Is the September effect real? We count every SPY September on record: average and median return, hit rate, the three worst years, and a split by decade.

Is the September effect real? Measured on SPY, the S&P 500 tracking fund, September carries the weakest reputation of any calendar month, and the count below shows where that reputation comes from: over 22 Septembers from 2004 through 2025, the average September price return is -0.71% and the month finished higher 59.1% of the time. The effect exists in the historical averages. It is also small and noisy, close to a coin flip in any single year, which is a different thing from a tradeable rule.

What is the September effect?

The September effect is the observation that US stocks have, on average, returned less in September than in any other calendar month. It belongs to the same family of calendar patterns as the January effect, sell in May and go away and the Santa Claus rally: each is a statement about historical averages sliced by the calendar, with a story attached.

Every number on this page is computed the same way. A month's return is the last closing price of the month divided by the last closing price of the prior month, minus one. That is a price return, with dividends excluded; the arithmetic and its traps are laid out in how monthly returns are measured. The instrument is SPY, starting in 2004, the first year with a full September in the daily history used here. Only complete calendar years count, so the sample runs through 2025 and extends itself by one September each January.

Is September the worst month? All twelve months compared

The folklore quotes one headline number. The table below puts all twelve months on the same footing: average return, median return, the standard deviation of the monthly returns, and the hit rate, meaning the share of years in which the month closed above the prior month's close.

QuerySPY monthly price returns by calendar month, complete years only
labelavg_return_pctmedian_return_pctstdev_pcthit_rate_pctsample_count
Jan0.271.554.4154.522
Feb0.361.324.2459.122
Mar0.614.4659.122
Apr1.631.134.4372.722
May0.921.613.8177.322
Jun-0.1-0.024.015022
Jul2.362.283.3277.322
Aug0.270.793.3863.622
Sep-0.710.484.5959.122
Oct1.162.215.7460.923
Nov2.452.753.8882.623
Dec0.450.73.4665.223
The exact SQL behind every number
WITH month_ends AS
(
    SELECT
        toStartOfMonth(date)           AS month_start,
        argMax(toFloat64(close), date) AS month_end_close
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date < toStartOfYear(today())
    GROUP BY month_start
),
monthly_returns AS
(
    SELECT
        month_start,
        month_end_close,
        lagInFrame(month_end_close, 1) OVER (ORDER BY month_start ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close
    FROM month_ends
)
SELECT
    formatDateTime(month_start, '%b')                                                                    AS label,
    round(avg(month_end_close / prev_close - 1) * 100, 2)                                                AS avg_return_pct,
    round(quantileDeterministic(0.5)(month_end_close / prev_close - 1, toYYYYMM(month_start)) * 100, 2) AS median_return_pct,
    round(stddevSamp(month_end_close / prev_close - 1) * 100, 2)                                         AS stdev_pct,
    round(countIf(month_end_close > prev_close) / count() * 100, 1)                                      AS hit_rate_pct,
    count()                                                                                              AS sample_count
FROM monthly_returns
WHERE prev_close > 0
GROUP BY toMonth(month_start), label
ORDER BY toMonth(month_start)
Run this yourself

September's row reads -0.71% on average and 0.48% at the median, with a hit rate of 59.1% from 22 observations. October, the month with the crash reputation, averages 1.16% with a hit rate of 60.9%. Two columns deserve a second look. When the average and the median disagree, the gap measures how much a few large months are pulling the average, and the median is the better guide to a typical year. The standard deviation column sets the scale of the noise: September's returns scatter by 4.59 percentage points around their average. Divide that by the square root of 22 and the standard error of the average lands in the same neighbourhood as the average itself, which is the statistician's way of saying the sample cannot separate a small negative average from zero.

Every September on record

An average hides the shape. The chart below plots each September's return as its own point, from 2004 to 2025.

QuerySPY September price return, year by year
22 rows (showing 20)
yearsep_return_pct
20040.59
20050.38
20062.25
20073.38
2008-9.94
20093.05
20108.38
2011-7.42
20121.99
20132.66
2014-1.84
2015-3.06
2016-0.5
20171.51
20180.14
20191.48
2020-4.13
2021-4.97
2022-9.62
2023-5.08
The exact SQL behind every number
WITH month_ends AS
(
    SELECT
        toStartOfMonth(date)           AS month_start,
        argMax(toFloat64(close), date) AS month_end_close
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date < toStartOfYear(today())
    GROUP BY month_start
),
monthly_returns AS
(
    SELECT
        month_start,
        month_end_close,
        lagInFrame(month_end_close, 1) OVER (ORDER BY month_start ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close
    FROM month_ends
)
SELECT
    toYear(month_start)                                AS year,
    round((month_end_close / prev_close - 1) * 100, 2) AS sep_return_pct
FROM monthly_returns
WHERE prev_close > 0
  AND toMonth(month_start) = 9
ORDER BY year
Run this yourself

Read it as a scatter rather than a trend. Most points sit within a few percent of zero on either side, and a handful of deep negatives sit well below the rest. Those few years do most of the work in the average. Remove the two deepest and the average moves most of the way back to zero; that fragility is the first reason to treat the effect as a description of the past rather than a forecast.

Which were the three worst Septembers?

Three months carry a large share of the reputation.

QueryThe three worst SPY Septembers on record
labelsep_return_pct
Sep 2008-9.94
Sep 2022-9.62
Sep 2011-7.42
The exact SQL behind every number
WITH month_ends AS
(
    SELECT
        toStartOfMonth(date)           AS month_start,
        argMax(toFloat64(close), date) AS month_end_close
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date < toStartOfYear(today())
    GROUP BY month_start
),
monthly_returns AS
(
    SELECT
        month_start,
        month_end_close,
        lagInFrame(month_end_close, 1) OVER (ORDER BY month_start ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close
    FROM month_ends
)
SELECT
    formatDateTime(month_start, '%b %Y')               AS label,
    round((month_end_close / prev_close - 1) * 100, 2) AS sep_return_pct
FROM monthly_returns
WHERE prev_close > 0
  AND toMonth(month_start) = 9
ORDER BY sep_return_pct ASC
LIMIT 3
Run this yourself

The worst September in this history is Sep 2008 at -9.94%, followed by Sep 2022 at -9.62% and Sep 2011 at -7.42%. Each of those months sits inside a longer drawdown that neither began on September 1 nor ended on September 30. The calendar gets the credit; the episode did the work.

Has the September effect weakened by decade?

Splitting the sample by decade shows whether the pattern is stable or an artefact of one bad stretch. Each row compares the average September with the average of the other eleven months in the same decade.

QueryAverage September vs. the other eleven months, by decade
labelsep_avg_return_pctother_months_avg_return_pctsample_count
2000s-0.050.266
2010s0.331.0110
2020s-3.121.566
The exact SQL behind every number
WITH month_ends AS
(
    SELECT
        toStartOfMonth(date)           AS month_start,
        argMax(toFloat64(close), date) AS month_end_close
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date < toStartOfYear(today())
    GROUP BY month_start
),
monthly_returns AS
(
    SELECT
        month_start,
        month_end_close,
        lagInFrame(month_end_close, 1) OVER (ORDER BY month_start ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close
    FROM month_ends
)
SELECT
    concat(toString(intDiv(toYear(month_start), 10) * 10), 's')      AS label,
    round(avgIf(monthly_return, toMonth(month_start) = 9) * 100, 2)  AS sep_avg_return_pct,
    round(avgIf(monthly_return, toMonth(month_start) != 9) * 100, 2) AS other_months_avg_return_pct,
    countIf(toMonth(month_start) = 9)                                AS sample_count
FROM
(
    SELECT
        month_start,
        month_end_close / prev_close - 1 AS monthly_return
    FROM monthly_returns
    WHERE prev_close > 0
)
GROUP BY label
HAVING countIf(toMonth(month_start) = 9) > 0
ORDER BY label
Run this yourself

In the 2000s the average September came in at -0.05% against 0.26% for the other months. In the 2020s, a partial decade with 6 Septembers so far, the figures are -3.12% and 1.56%. Read the middle rows the same way. The honest summary is that each decade holds ten Septembers at most, so a single month like Sep 2008 shifts its decade's average by roughly a point on its own. A pattern that one observation can flip is one the data can neither confirm nor rule out at this sample size.

Why might September be weak? The candidate explanations

Four explanations circulate. None has been isolated in the data, and each predicts things the record does not clearly show.

  • Post-summer rebalancing. Portfolio managers return from August holidays and reposition. The story predicts selling concentrated in the first days of September, and it says nothing about why the reset should net out negative rather than neutral.
  • Mutual fund fiscal year-end on October 31. Many US mutual funds close their fiscal year at the end of October, and selling losing positions ahead of that date would land in September and October. The story predicts October should look at least as weak, and the table above puts October at 1.16%.
  • Tax-loss selling by individuals. The individual tax year ends in December, which points at December rather than September, and that version of the story already belongs to the January effect.
  • Quarterly expiration. Stock index futures and index options expire together on the third Friday of the last month of each quarter. That predicts a one-day volume spike in four months a year, not a month-long drift in one of them.

None of these is testable enough to trade on, for four separate reasons. The explanations overlap in time, so a September that fits one fits all of them. There is no counterfactual September without fund year-ends or expirations to compare against. The sample is roughly three dozen months, and a difference of half a percentage point sits inside the noise measured above. And a rule that names only a month, with no way to tell which September will be the bad one, carries the table's hit rate, which is close to a coin flip. The same test applies to sell in May and the Santa Claus rally: the average is a real historical number, and the average is not a signal.

FAQ

What is the September effect in stocks?

The September effect is the historical observation that US stock indexes have, on average, returned less in September than in any other calendar month. It is a statement about long-run averages, not about any particular year.

Is September really the worst month for the stock market?

In the SPY history above, September's average price return is -0.71% with a hit rate of 59.1%, from 22 Septembers through 2025. The average is weak, the median is 0.48%, and a few deep negative years account for most of the gap between the two.

Why is September a bad month for stocks?

No single cause has been isolated. The explanations most often offered are post-summer rebalancing, the October 31 fiscal year-end of many mutual funds, tax-loss selling and quarterly index expiration, and they overlap in time, which makes them impossible to separate in a sample of a few dozen months.

Is October worse than September?

Not on average in this data. October's average SPY return is 1.16% with a hit rate of 60.9%, against -0.71% and 59.1% for September. October's reputation comes from a few famous single days rather than from its monthly average.

How is the monthly return on this page calculated?

Each month's return is the last SPY closing price of the month divided by the last closing price of the prior month, minus one, using complete calendar years only. Dividends are excluded, so these are price returns, slightly below the total return an investor holding the fund would have earned.


Every panel above ships with the exact SQL beneath it; expand any one to see how the number was counted, or rerun the same month-by-month tally for any ticker on the Strasmore terminal.