STRASMORE/EXPLORE 3,293 QUERIES

Santa Claus rally window return by year, SPY, with the full calendar December alongside

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-11-01, from Santa Claus Rally: Hit Rate and Returns by Year.

as of table 23×5read in context →
Santa Claus rally window return by year, SPY, with the full calendar December alongside — 23 rows by 5 columns, computed from US exchange, SIP and OPRA data.
yearmeasured_frommeasured_tosanta_window_pctcalendar_december_pct
2003Dec 23Jan 52.474.54
2004Dec 23Jan 4-1.612.53
2005Dec 22Jan 40.48-0.72
2006Dec 21Jan 40.040.78
2007Dec 21Jan 3-2.21-1.65
2008Dec 23Jan 57.760.17
2009Dec 23Jan 51.51.36
2010Dec 23Jan 41.16.12
2011Dec 22Jan 41.940.41
2012Dec 21Jan 32.060.18
2013Dec 23Jan 30.192.04
2014Dec 23Jan 5-2.9-0.8
2015Dec 23Jan 5-2.26-2.31
2016Dec 22Jan 40.531.43
2017Dec 21Jan 31.080.7
2018Dec 21Jan 31.46-9.33
2019Dec 23Jan 30.372.4
2020Dec 23Jan 51.023.26
2021Dec 23Jan 41.484.26
2022Dec 22Jan 40.8-6.19
2023Dec 21Jan 3-0.834.14
2024Dec 23Jan 3-0.46-2.73
2025Dec 23Jan 5-0.03-0.22
Rows × columns
23 × 5
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for Santa Claus rally window return by year, SPY, with the full calendar December alongside, derived from the stored result.
ColumnTypeRangeNotes
year number 2,003 to 2,025
measured_from text 3 distinct values (Dec 21, Dec 22, Dec 23)
measured_to text 3 distinct values (Jan 3, Jan 4, Jan 5)
santa_window_pct number -2.9 to 7.76 percent
calendar_december_pct number -9.33 to 6.12 percent

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

Run it yourself

This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.

WITH
    spy_days AS
    (
        SELECT
            date,
            toYear(date)                                   AS y,
            toMonth(date)                                  AS m,
            argMax(toFloat64(close), _ingest_time)         AS close
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'SPY'
          AND toMonth(date) IN (11, 12, 1)
        GROUP BY date
    ),
    ranked AS
    (
        SELECT
            date,
            y,
            m,
            close,
            row_number() OVER (PARTITION BY y, m ORDER BY date DESC) AS sessions_from_end,
            row_number() OVER (PARTITION BY y, m ORDER BY date ASC)  AS sessions_from_start
        FROM spy_days
    )
SELECT
    toUInt16(if(m = 1, y - 1, y))                                                    AS year,
    concat(formatDateTime(anyIf(date, m = 12 AND sessions_from_end = 6), '%b '),
           toString(toDayOfMonth(anyIf(date, m = 12 AND sessions_from_end = 6))))  AS measured_from,
    concat(formatDateTime(anyIf(date, m = 1 AND sessions_from_start = 2), '%b '),
           toString(toDayOfMonth(anyIf(date, m = 1 AND sessions_from_start = 2)))) AS measured_to,
    round((anyIf(close, m = 1 AND sessions_from_start = 2)
           / anyIf(close, m = 12 AND sessions_from_end = 6) - 1) * 100, 2)          AS santa_window_pct,
    round((anyIf(close, m = 12 AND sessions_from_end = 1)
           / anyIf(close, m = 11 AND sessions_from_end = 1) - 1) * 100, 2)          AS calendar_december_pct
FROM ranked
GROUP BY year
HAVING countIf(m = 11 AND sessions_from_end = 1) = 1
   AND countIf(m = 12 AND sessions_from_end = 6) = 1
   AND countIf(m = 1 AND sessions_from_start = 2) = 1
ORDER BY year
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysisSanta Claus Rally: Hit Rate and Returns by Year
The five weakest Santa Claus windows on record, with the calendar year that followed each table 5×5 → Santa Claus window vs. the rest of December vs. the whole month, SPY, all years on record table 3×8 → Failed vs. successful Santa Claus windows and the calendar year that followed table 2×6 → SPY volume in each Santa Claus window session as a share of its year's average daily volume ranking 7×4 → SPY monthly price returns by calendar month, complete years only table 12×6 → SPY September price return, year by year ranking 22×2 → See all 3,293 queries →