{"slug":"how-monthly-returns-are-measured","qid":"month_decomposition","label":"June 2026 measured two ways: close-to-close vs open-to-close, NVDA and SPY","post_title":"How Monthly Stock Returns Are Measured","post_url":"/blog/how-monthly-returns-are-measured#q-month_decomposition","columns":["ticker","may_final_close","june_first_open","june_final_close","close_to_close_pct","open_to_close_pct","convention_gap_points"],"rows":[{"ticker":"NVDA","may_final_close":211.15,"june_first_open":215.73,"june_final_close":199.76,"close_to_close_pct":-5.39,"open_to_close_pct":-7.4,"convention_gap_points":2.01},{"ticker":"SPY","may_final_close":756.4,"june_first_open":755.36,"june_final_close":746.32,"close_to_close_pct":-1.33,"open_to_close_pct":-1.2,"convention_gap_points":0.14}],"shape":"table","sql":"SELECT ticker,\n       round(argMaxIf(cl, day, day <= '2026-05-31'), 2) AS may_final_close,\n       round(argMinIf(op, day, day >= '2026-06-01'), 2) AS june_first_open,\n       round(argMaxIf(cl, day, day <= '2026-06-30'), 2) AS june_final_close,\n       round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))\n             / argMaxIf(cl, day, day <= '2026-05-31'), 2) AS close_to_close_pct,\n       round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))\n             / argMinIf(op, day, day >= '2026-06-01'), 2) AS open_to_close_pct,\n       round(abs(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))\n                 / argMinIf(op, day, day >= '2026-06-01')\n             - 100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))\n                 / argMaxIf(cl, day, day <= '2026-05-31')), 2) AS convention_gap_points\nFROM (\n    SELECT ticker,\n               toDate(toTimeZone(window_start, 'America/New_York')) AS day,\n               argMinIf(toFloat64(open), window_start, rth) AS op,\n               argMaxIf(toFloat64(close), window_start, rth) AS cl\n        FROM (\n            SELECT ticker, window_start, open, close,\n                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')\n                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth\n            FROM global_markets.delayed_stocks_minute_aggs\n            WHERE ticker IN ('NVDA', 'SPY')\n              AND window_start >= '2026-05-28 04:00:00'\n              AND window_start < '2026-07-01 08:00:00'\n        )\n        GROUP BY ticker, day\n)\nGROUP BY ticker\nORDER BY ticker","computed_at":"2026-07-26T05:37:27.729230+00:00","elapsed":0.088295781}