{"slug":"biggest-stock-movers-2026","qid":"index_ytd","label":"The four major index ETFs, year to date, over the same measured window","post_title":"Biggest Stock Gainers & Losers of 2026","post_url":"/blog/biggest-stock-movers-2026#q-index_ytd","columns":["label","ytd_return_pct","measured_from_date","measured_through_date"],"rows":[{"label":"Russell 2000 (IWM)","ytd_return_pct":21.8,"measured_from_date":"2026-01-02","measured_through_date":"2026-08-19"},{"label":"Nasdaq 100 (QQQ)","ytd_return_pct":15.5,"measured_from_date":"2026-01-02","measured_through_date":"2026-08-19"},{"label":"S&P 500 (SPY)","ytd_return_pct":12.2,"measured_from_date":"2026-01-02","measured_through_date":"2026-08-19"},{"label":"Dow (DIA)","ytd_return_pct":10.9,"measured_from_date":"2026-01-02","measured_through_date":"2026-08-19"}],"shape":"series","sql":"WITH complete AS (\n    SELECT 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 >= toDateTime('2026-01-01 00:00:00')\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n    GROUP BY d\n    HAVING count() >= 380\n),\nedges AS (\n    SELECT ticker,\n        argMinIf(toFloat64(open), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS year_open,\n        argMaxIf(toFloat64(close), toTimeZone(window_start, 'America/New_York'), toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS latest_close,\n        countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT min(d) FROM complete)) AS bars_open,\n        countIf(toDate(toTimeZone(window_start, 'America/New_York')) = (SELECT max(d) FROM complete)) AS bars_close\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ((window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-01-10 00:00:00'))\n        OR (window_start >= now() - INTERVAL 8 DAY))\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n      AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')\n    GROUP BY ticker\n    HAVING bars_open >= 100 AND bars_close >= 100\n)\nSELECT multiIf(ticker = 'SPY', 'S&P 500 (SPY)', ticker = 'QQQ', 'Nasdaq 100 (QQQ)',\n               ticker = 'DIA', 'Dow (DIA)', ticker = 'IWM', 'Russell 2000 (IWM)', ticker) AS label,\n    round((latest_close / year_open - 1) * 100, 1) AS ytd_return_pct,\n    (SELECT toString(min(d)) FROM complete) AS measured_from_date,\n    (SELECT toString(max(d)) FROM complete) AS measured_through_date\nFROM edges\nORDER BY ytd_return_pct DESC","computed_at":"2026-08-25T13:02:44.827078+00:00","elapsed":0.965876693}