{"slug":"buying-puts-vs-buying-calls","qid":"realised_vol_by_month","label":"realised_vol_by_month","post_title":"buying-puts-vs-buying-calls","post_url":"/blog/buying-puts-vs-buying-calls#q-realised_vol_by_month","columns":["month_return_band","avg_realised_vol_pct","months"],"rows":[{"month_return_band":"fell more than 5%","avg_realised_vol_pct":31.65,"months":26},{"month_return_band":"fell 0 to 5%","avg_realised_vol_pct":16.71,"months":60},{"month_return_band":"rose 0 to 5%","avg_realised_vol_pct":11.36,"months":126},{"month_return_band":"rose more than 5%","avg_realised_vol_pct":16.14,"months":36}],"shape":"ranking","sql":"WITH\ndaily AS\n(\n    SELECT\n        date                                                                                      AS d,\n        toFloat64(close) / lagInFrame(toFloat64(close)) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND date >= '2006-01-01'\n      AND date <  '2026-09-01'\n),\nmonths AS\n(\n    SELECT\n        toStartOfMonth(d)                            AS month,\n        (exp(sum(log(1 + ret))) - 1) * 100           AS month_return_pct,\n        stddevPop(ret) * sqrt(252) * 100             AS realised_vol_pct,\n        count()                                      AS sessions\n    FROM daily\n    WHERE abs(ret) < 0.5\n    GROUP BY month\n    HAVING sessions >= 15\n)\nSELECT\n    multiIf(month_return_pct < -5, 'fell more than 5%',\n            month_return_pct <  0, 'fell 0 to 5%',\n            month_return_pct <  5, 'rose 0 to 5%',\n                                   'rose more than 5%') AS month_return_band,\n    round(avg(realised_vol_pct), 2)                     AS avg_realised_vol_pct,\n    count()                                             AS months\nFROM months\nGROUP BY month_return_band\nORDER BY min(month_return_pct) ASC","computed_at":"2026-09-30T15:04:04.122989+00:00","elapsed":0.003654042}