How we calculate seasonal returns and win rates

Every pattern on SeasonalityX is computed from real price history. This page explains the data we use, the exact formulas behind each number, and what seasonal statistics can and can't tell you.

Last reviewed November 2026

The price data

We use daily closing prices from third-party market-data providers, adjusted for stock splits and dividends. Adjusting matters: without it, a 4-for-1 split would look like a 75% crash, and a dividend payment would look like a drop on the ex-dividend date.

Patterns use up to 20 years of history, depending on your plan and how long the security has been listed. Only completed calendar years go into the historical statistics. The current, unfinished year is shown separately (see this-year comparison) so a partial year can never skew the averages. A pattern needs at least 2 years of data before we show it.

Prices are laid out on every calendar day, not only trading days. When a window starts or ends on a weekend or market holiday, the most recent trading day's close is used. That way every year contributes a value for the same calendar window, and no year is silently dropped because a date landed on a Saturday.

Why pages show different periods

The number of years behind a figure depends on where you see it. It is always stated next to the figure.

  • Pattern Screener and Chart Explorer: up to 20 years, set by you (the Free plan is limited to 5).
  • Ticker pages and best-stocks-by-month pages: the last 10 complete years, or fewer for a recently listed security.
  • Guides and blog articles: 15 years, stated in each article.

The calculation is identical in every case; only the look-back changes. A shorter period reflects recent behaviour, a longer one gives more years of evidence.

Missing data and updates

A year is left out of a pattern if prices are missing at either end of the window, and the “years” count always shows how many years a figure is based on. Securities with no usable price data are not given a public page in search results.

Ticker pages are refreshed daily. Tools calculate from the latest prices each time you run them, and the monthly rankings are refreshed with each site update. The historical statistics change only when a new calendar year completes; the this-year figures change as the year progresses.

How a window's return is measured

A seasonal window is a fixed span of the calendar, such as November 3 to November 23. For each year, its return is the change in price from the window's start to its end:

return (%) = ( close at end ÷ close at start − 1 ) × 100

This is a direct price ratio, so it's exact for any length of window. It is not a sum of daily percentage changes, which drifts from the true figure over longer periods.

Windows are identified by month and day, and leap years are handled so that February 29 doesn't shift a window by a day in some years and split it in two. The screener reports standard 10, 20 and 30-day windows; the interactive chart lets you measure any range you drag.

Bullish and bearish patterns

A pattern is bullish when its average return across the years is positive, and bearish when it is negative. Bearish patterns are as useful as bullish ones: they show windows where a security has repeatedly declined.

Win rate

The win rate is how often the window moved in the pattern's direction. For a bullish pattern a “win” is a year with a positive return; for a bearish pattern it is a year with a negative return.

win rate (%) = years that moved in the pattern's direction ÷ years with data × 100

So a bullish window that rose in 8 of the last 10 years has an 80% win rate, and a bearish window that fell in 7 of 10 years has a 70% win rate. Every pattern page also lists each individual year, so you can see which years broke the pattern and by how much.

Average, median and spread

  • Average return: the mean of the yearly window returns.
  • Median return: the middle yearly return. Less affected by one extreme year than the average.
  • Standard deviation (σ): how widely the yearly returns spread around the average, using the sample formula (dividing by years − 1). A smaller σ means a more consistent pattern.
  • Best and worst year: the highest and lowest yearly return in the window.
  • Return per year: where shown, the average window return scaled to a full year, to compare short and long windows on the same footing. It is a comparison aid, not an expected return.

This-year comparison

Once the current year has passed both the start and end of a window, we calculate that year's return with the same formula and show it beside the historical average. It answers a simple question: did the pattern repeat this year? While a window is still upcoming or in progress, there is no this-year figure yet.

Limits of seasonal data

  • Past patterns are not forecasts. A high win rate says a window repeated often in the past. It does not say it will repeat next time.
  • Small samples. Ten years means ten observations. Prefer patterns with more years of history, and look at the size of the losing years, not just how many there were.
  • Chance patterns. When many windows are tested, some will look strong by luck alone. Consistency (a low σ), a sensible size and more years make a pattern more credible.
  • Today's companies only. Lists such as index members reflect current constituents, so companies that were delisted or dropped out are not included.
  • No trading costs. Returns are before commissions, spreads, slippage and taxes.

SeasonalityX is a research and education tool, not investment advice. See our disclaimer and risk disclosure.

Questions about a number?

SeasonalityX is built by Gemini Fintech LLC. If a figure looks wrong, tell us and we'll check it against the underlying prices.