{"slug":"the-low-volatility-anomaly","qid":"by_group","label":"Volatility thirds: median return, and the range from worst to best name in each","post_title":"The Low-Volatility Anomaly","post_url":"/blog/the-low-volatility-anomaly#q-by_group","columns":["vol_group","median_vol_pct","median_return_pct","worst_return_pct","best_return_pct","range_pct"],"rows":[{"vol_group":"1. Calmest third","median_vol_pct":19.1,"median_return_pct":24.1,"worst_return_pct":-13,"best_return_pct":86.1,"range_pct":99},{"vol_group":"2. Middle third","median_vol_pct":25.1,"median_return_pct":23,"worst_return_pct":-3.4,"best_return_pct":81.7,"range_pct":85},{"vol_group":"3. Wildest third","median_vol_pct":44.3,"median_return_pct":54.4,"worst_return_pct":-21.5,"best_return_pct":195.6,"range_pct":217}],"shape":"table","sql":"WITH d AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,\n           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('SPY','KO','JNJ','PG','PEP','WMT','MCD','MO','VZ','XOM','JPM','HD','COST','UNH','MRK','LLY','HON','LMT','CAT','TXN','ORCL','NVDA','TSLA','AMD','NFLX')\n      AND window_start >= now() - INTERVAL 800 DAY\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 ticker, dt\n),\nr AS (\n    SELECT ticker, dt,\n           c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret\n    FROM d\n),\npername AS (\n    SELECT ticker,\n           stddevSamp(ret) * sqrt(252) * 100 AS vol,\n           (exp(sum(log(1 + ret))) - 1) * 100 AS tr\n    FROM r\n    WHERE ret IS NOT NULL AND ret > -0.5 AND ret < 0.5\n    GROUP BY ticker\n),\nranked AS (\n    SELECT ticker, vol, tr, ntile(3) OVER (ORDER BY vol) AS bucket FROM pername\n)\nSELECT multiIf(bucket = 1, '1. Calmest third', bucket = 2, '2. Middle third', '3. Wildest third') AS vol_group,\n       round(median(vol), 1) AS median_vol_pct,\n       round(median(tr), 1) AS median_return_pct,\n       round(min(tr), 1) AS worst_return_pct,\n       round(max(tr), 1) AS best_return_pct,\n       round(max(tr) - min(tr), 0) AS range_pct\nFROM ranked\nGROUP BY bucket\nORDER BY bucket","computed_at":"2026-08-22T04:23:03.824697+00:00","elapsed":16.203964469}