{"slug":"tax-loss-harvesting-deadlines","qid":"wash_window","label":"The 61 day wash sale window around each late-December 2025 session","post_title":"Tax-Loss Harvesting Deadlines: The Real Dates","post_url":"/blog/tax-loss-harvesting-deadlines#q-wash_window","columns":["sale_date","sale_label","window_opens","window_closes","sessions_before","sessions_after"],"rows":[{"sale_date":"2025-12-22","sale_label":"Dec 22, 2025","window_opens":"Nov 22, 2025","window_closes":"Jan 21, 2026","sessions_before":19,"sessions_after":19},{"sale_date":"2025-12-23","sale_label":"Dec 23, 2025","window_opens":"Nov 23, 2025","window_closes":"Jan 22, 2026","sessions_before":20,"sessions_after":19},{"sale_date":"2025-12-24","sale_label":"Dec 24, 2025","window_opens":"Nov 24, 2025","window_closes":"Jan 23, 2026","sessions_before":21,"sessions_after":19},{"sale_date":"2025-12-26","sale_label":"Dec 26, 2025","window_opens":"Nov 26, 2025","window_closes":"Jan 25, 2026","sessions_before":20,"sessions_after":18},{"sale_date":"2025-12-29","sale_label":"Dec 29, 2025","window_opens":"Nov 29, 2025","window_closes":"Jan 28, 2026","sessions_before":19,"sessions_after":20},{"sale_date":"2025-12-30","sale_label":"Dec 30, 2025","window_opens":"Nov 30, 2025","window_closes":"Jan 29, 2026","sessions_before":20,"sessions_after":20},{"sale_date":"2025-12-31","sale_label":"Dec 31, 2025","window_opens":"Dec 1, 2025","window_closes":"Jan 30, 2026","sessions_before":21,"sessions_after":20}],"shape":"series","sql":"WITH sessions AS\n(\n    SELECT DISTINCT toDate(toTimeZone(window_start, 'America/New_York')) AS d\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= '2025-11-18 00:00:00'\n      AND window_start <  '2026-02-02 00:00:00'\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960\n)\nSELECT\n    toString(s.d)                           AS sale_date,\n    formatDateTime(s.d, '%b %e, %Y')        AS sale_label,\n    formatDateTime(s.d - 30, '%b %e, %Y')   AS window_opens,\n    formatDateTime(s.d + 30, '%b %e, %Y')   AS window_closes,\n    countIf(t.d >= s.d - 30 AND t.d < s.d)  AS sessions_before,\n    countIf(t.d > s.d AND t.d <= s.d + 30)  AS sessions_after\nFROM\n(\n    SELECT d\n    FROM sessions\n    WHERE d >= '2025-12-22'\n      AND d <  '2026-01-01'\n) AS s\nCROSS JOIN sessions AS t\nGROUP BY s.d\nORDER BY s.d","computed_at":"2026-10-16T15:07:08.339313+00:00","elapsed":0.003849837}