{"slug":"tax-loss-harvesting-deadlines","qid":"tracking","label":"Daily open-to-close gap versus SPY, in basis points, July to December 2025","post_title":"Tax-Loss Harvesting Deadlines: The Real Dates","post_url":"/blog/tax-loss-harvesting-deadlines#q-tracking","columns":["ticker","median_gap_bps","max_gap_bps"],"rows":[{"ticker":"VOO","median_gap_bps":0.8,"max_gap_bps":6.7},{"ticker":"IVV","median_gap_bps":0.8,"max_gap_bps":4},{"ticker":"QQQ","median_gap_bps":16.6,"max_gap_bps":121.4},{"ticker":"RSP","median_gap_bps":27.9,"max_gap_bps":120.8}],"shape":"ranking","sql":"WITH moves AS\n(\n    SELECT\n        ticker,\n        date,\n        toFloat64(close) / toFloat64(open) - 1 AS pct_move\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('SPY', 'IVV', 'VOO', 'RSP', 'QQQ')\n      AND date >= '2025-07-01'\n      AND date <= '2025-12-31'\n      AND open > 0\n)\nSELECT\n    f.ticker AS ticker,\n    round(quantileDeterministic(0.5)(abs(f.pct_move - b.spy_move) * 10000, toUInt64(f.date)), 1) AS median_gap_bps,\n    round(max(abs(f.pct_move - b.spy_move)) * 10000, 1)                                          AS max_gap_bps\nFROM moves AS f\nINNER JOIN\n(\n    SELECT date, pct_move AS spy_move\n    FROM moves\n    WHERE ticker = 'SPY'\n) AS b USING (date)\nWHERE f.ticker != 'SPY'\nGROUP BY f.ticker\nORDER BY median_gap_bps","computed_at":"2026-10-16T15:07:08.554153+00:00","elapsed":0.006071177}