{"slug":"santa-claus-rally","qid":"window_volume","label":"window_volume","post_title":"santa-claus-rally","post_url":"/blog/santa-claus-rally#q-window_volume","columns":["bucket","avg_volume_vs_year_pct","median_volume_vs_year_pct","years_measured"],"rows":[{"bucket":"Dec -5","avg_volume_vs_year_pct":52.3,"median_volume_vs_year_pct":39.2,"years_measured":23},{"bucket":"Dec -4","avg_volume_vs_year_pct":57.8,"median_volume_vs_year_pct":52.3,"years_measured":23},{"bucket":"Dec -3","avg_volume_vs_year_pct":72.1,"median_volume_vs_year_pct":65.3,"years_measured":23},{"bucket":"Dec -2","avg_volume_vs_year_pct":66.3,"median_volume_vs_year_pct":56.8,"years_measured":23},{"bucket":"Dec -1","avg_volume_vs_year_pct":90.4,"median_volume_vs_year_pct":88.1,"years_measured":23},{"bucket":"Jan +1","avg_volume_vs_year_pct":110.2,"median_volume_vs_year_pct":92.2,"years_measured":23},{"bucket":"Jan +2","avg_volume_vs_year_pct":94.9,"median_volume_vs_year_pct":90.3,"years_measured":23}],"shape":"ranking","sql":"WITH\n    spy_days AS\n    (\n        SELECT\n            date,\n            toYear(date)                                   AS y,\n            toMonth(date)                                  AS m,\n            argMax(toFloat64(volume), _ingest_time)        AS volume\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker = 'SPY'\n        GROUP BY date\n    ),\n    yearly AS\n    (\n        SELECT\n            y,\n            avg(volume)                                    AS avg_volume\n        FROM spy_days\n        GROUP BY y\n    ),\n    ranked AS\n    (\n        SELECT\n            date,\n            y,\n            m,\n            volume,\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    slots AS\n    (\n        SELECT\n            if(r.m = 12, concat('Dec -', toString(r.sessions_from_end)),\n                         concat('Jan +', toString(r.sessions_from_start)))  AS bucket,\n            if(r.m = 12, toInt32(0) - toInt32(r.sessions_from_end),\n                         toInt32(r.sessions_from_start))                    AS slot_order,\n            r.y                                                             AS y,\n            r.volume / yr.avg_volume * 100                                  AS volume_vs_year_pct\n        FROM ranked AS r\n        INNER JOIN yearly AS yr ON yr.y = r.y\n        WHERE (r.m = 12 AND r.sessions_from_end <= 5)\n           OR (r.m = 1 AND r.sessions_from_start <= 2)\n    )\nSELECT\n    bucket,\n    round(avg(volume_vs_year_pct), 1)                                       AS avg_volume_vs_year_pct,\n    round(quantileDeterministic(0.5)(volume_vs_year_pct, toUInt32(y)), 1)   AS median_volume_vs_year_pct,\n    count()                                                                 AS years_measured\nFROM slots\nGROUP BY bucket, slot_order\nORDER BY slot_order","computed_at":"2026-09-17T17:09:50.842461+00:00","elapsed":0.007487347}