{"slug":"santa-claus-rally","qid":"folklore_test","label":"folklore_test","post_title":"santa-claus-rally","post_url":"/blog/santa-claus-rally#q-folklore_test","columns":["label","windows_counted","following_year_down","following_year_down_pct","following_year_mean_pct","following_year_median_pct"],"rows":[{"label":"Window fell","windows_counted":6,"following_year_down":2,"following_year_down_pct":33.3,"following_year_mean_pct":2.2,"following_year_median_pct":6.33},{"label":"Window rose","windows_counted":16,"following_year_down":3,"following_year_down_pct":18.8,"following_year_mean_pct":12.88,"following_year_median_pct":13.61}],"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(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    if(w.end_close < w.base_close, 'Window fell', 'Window rose')                          AS label,\n    count()                                                                               AS windows_counted,\n    countIf(n.year_end_close < w.december_close)                                          AS following_year_down,\n    round(countIf(n.year_end_close < w.december_close) * 100 / count(), 1)                AS following_year_down_pct,\n    round(avg((n.year_end_close / w.december_close - 1) * 100), 2)                        AS following_year_mean_pct,\n    round(quantileDeterministic(0.5)((n.year_end_close / w.december_close - 1) * 100,\n                                     toUInt32(w.year)), 2)                                AS following_year_median_pct\nFROM windows AS w\nINNER JOIN year_ends AS n ON n.y = w.next_year\nGROUP BY label\nORDER BY label ASC","computed_at":"2026-09-17T17:09:50.682665+00:00","elapsed":2.074517873}