STRASMORE/EXPLORE 2,309 QUERIES

santa_windows

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-09-17, from santa-claus-rally.

as of table 23×5read in context →
santa_windows — 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_windows, 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.

the exact SQL behind every number
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

Run your own version of this

The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.

More from this analysissanta-claus-rally
worst_windows table 5×5 window_vs_december table 3×8 folklore_test table 2×6 window_volume ranking 7×4 The 2s10s spread, every print of the half table 124×2 The 2s10s spread, every print of the half table 124×2 See all 2,309 queries →