{"slug":"dollar-cost-averaging","qid":"entry","label":"Five-year, $30,000 plans by start year: dollar-cost averaging vs lump sum ($ thousands)","post_title":"Does Dollar-Cost Averaging Work?","post_url":"/blog/dollar-cost-averaging#q-entry","columns":["start_year","lumpsum_final","dca_final"],"rows":[{"start_year":"2016","lumpsum_final":54.6,"dca_final":42.2},{"start_year":"2017","lumpsum_final":60,"dca_final":45.5},{"start_year":"2018","lumpsum_final":45.5,"dca_final":37},{"start_year":"2019","lumpsum_final":55,"dca_final":38.1},{"start_year":"2020","lumpsum_final":55.7,"dca_final":44.3},{"start_year":"2021","lumpsum_final":55.3,"dca_final":43.6}],"shape":"ranking","sql":"WITH\nmonthly AS (\n    SELECT toStartOfMonth(dt) AS mo, argMin(c, dt) AS px\n    FROM (\n        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,\n               argMax(toFloat64(close), window_start) AS c\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker = 'SPY'\n          AND window_start >= '2016-01-01 00:00:00' AND window_start < '2026-07-01 00:00:00'\n          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n               + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n        GROUP BY dt\n    )\n    GROUP BY mo\n),\nw AS (\n    SELECT mo, px,\n        sum(500.0 / px) OVER (ORDER BY mo ROWS BETWEEN CURRENT ROW AND 59 FOLLOWING) AS dca_shares,\n        count() OVER (ORDER BY mo ROWS BETWEEN CURRENT ROW AND 59 FOLLOWING) AS n_ahead,\n        leadInFrame(px, 59) OVER (ORDER BY mo ROWS BETWEEN CURRENT ROW AND 59 FOLLOWING) AS end_px\n    FROM monthly\n)\nSELECT toString(toYear(mo)) AS start_year,\n    round(30000.0 / px * end_px / 1000, 1) AS lumpsum_final,\n    round(dca_shares * end_px / 1000, 1) AS dca_final\nFROM w\nWHERE toMonth(mo) = 1 AND n_ahead = 60 AND toYear(mo) BETWEEN 2016 AND 2021\nORDER BY start_year","computed_at":"2026-07-16T11:19:36.276090+00:00","elapsed":0.003420654}