{"slug":"santa-claus-rally","qid":"worst_windows","label":"worst_windows","post_title":"santa-claus-rally","post_url":"/blog/santa-claus-rally#q-worst_windows","columns":["label","measured_from","measured_to","santa_window_pct","following_year_pct"],"rows":[{"label":"Dec 2014 to Jan 2015","measured_from":"Dec 23","measured_to":"Jan 5","santa_window_pct":-2.9,"following_year_pct":-0.81},{"label":"Dec 2015 to Jan 2016","measured_from":"Dec 23","measured_to":"Jan 5","santa_window_pct":-2.26,"following_year_pct":9.64},{"label":"Dec 2007 to Jan 2008","measured_from":"Dec 21","measured_to":"Jan 3","santa_window_pct":-2.21,"following_year_pct":-38.28},{"label":"Dec 2004 to Jan 2005","measured_from":"Dec 23","measured_to":"Jan 4","santa_window_pct":-1.61,"following_year_pct":3.01},{"label":"Dec 2023 to Jan 2024","measured_from":"Dec 21","measured_to":"Jan 3","santa_window_pct":-0.83,"following_year_pct":23.3}],"shape":"table","sql":"WITH\n    spy_days AS\n    (\n        SELECT\n            date,\n            toYear(date)                                   AS y,\n            toMonth(date)                                  AS m,\n            argMax(toFloat64(close), _ingest_time)         AS close\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker = 'SPY'\n        GROUP BY date\n    ),\n    ranked AS\n    (\n        SELECT\n            date,\n            y,\n            m,\n            close,\n            row_number() OVER (PARTITION BY y, m ORDER BY date DESC) AS sessions_from_end,\n            row_number() OVER (PARTITION BY y, m ORDER BY date ASC)  AS sessions_from_start\n        FROM spy_days\n        WHERE m IN (12, 1)\n    ),\n    windows AS\n    (\n        SELECT\n            toUInt16(if(m = 1, y - 1, y))                       AS year,\n            toUInt16(year + 1)                                  AS next_year,\n            anyIf(date, m = 12 AND sessions_from_end = 6)       AS base_date,\n            anyIf(date, m = 1 AND sessions_from_start = 2)      AS end_date,\n            anyIf(close, m = 12 AND sessions_from_end = 6)      AS base_close,\n            anyIf(close, m = 12 AND sessions_from_end = 1)      AS december_close,\n            anyIf(close, m = 1 AND sessions_from_start = 2)     AS end_close\n        FROM ranked\n        GROUP BY year\n        HAVING countIf(m = 12 AND sessions_from_end = 6) = 1\n           AND countIf(m = 1 AND sessions_from_start = 2) = 1\n    ),\n    year_ends AS\n    (\n        SELECT\n            y,\n            argMax(close, date)                                 AS year_end_close\n        FROM spy_days\n        WHERE m = 12\n          AND date < toStartOfYear(today())\n        GROUP BY y\n    )\nSELECT\n    concat('Dec ', toString(w.year), ' to Jan ', toString(w.next_year))                 AS label,\n    concat(formatDateTime(w.base_date, '%b '), toString(toDayOfMonth(w.base_date)))     AS measured_from,\n    concat(formatDateTime(w.end_date, '%b '), toString(toDayOfMonth(w.end_date)))       AS measured_to,\n    round((w.end_close / w.base_close - 1) * 100, 2)                                    AS santa_window_pct,\n    round((n.year_end_close / w.december_close - 1) * 100, 2)                           AS following_year_pct\nFROM windows AS w\nINNER JOIN year_ends AS n ON n.y = w.next_year\nORDER BY santa_window_pct ASC\nLIMIT 5","computed_at":"2026-09-17T17:09:48.413252+00:00","elapsed":2.749935171}