{"slug":"bootstrapping-backtest-confidence-intervals","qid":"variance_ratio","label":"Variance ratio by block length: does SPY variance scale like independent draws?","post_title":"Bootstrapping Backtest Confidence Bands","post_url":"/blog/bootstrapping-backtest-confidence-intervals#q-variance_ratio","columns":["block_length","block_count","variance_ratio"],"rows":[{"block_length":"2 sessions","block_count":2515,"variance_ratio":0.844},{"block_length":"3 sessions","block_count":1676,"variance_ratio":0.918},{"block_length":"5 sessions","block_count":1005,"variance_ratio":0.809},{"block_length":"10 sessions","block_count":502,"variance_ratio":0.848},{"block_length":"21 sessions","block_count":238,"variance_ratio":0.646},{"block_length":"42 sessions","block_count":118,"variance_ratio":0.632},{"block_length":"63 sessions","block_count":78,"variance_ratio":0.584}],"shape":"ranking","sql":"WITH daily AS\n(\n    SELECT\n        date,\n        toFloat64(close) / nullIf(lagInFrame(toFloat64(close), 1)\n            OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW), 0) - 1 AS ret\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND date >= '2005-12-01'\n      AND date <  '2026-01-01'\n),\nindexed AS\n(\n    SELECT\n        ret,\n        row_number() OVER (ORDER BY date) AS i\n    FROM daily\n    WHERE date >= '2006-01-01'\n      AND ret IS NOT NULL\n),\nbase AS\n(\n    SELECT varSamp(ret) AS var_1d FROM indexed\n),\nblocks AS\n(\n    SELECT\n        k,\n        intDiv(i, k)  AS blk,\n        count()       AS n,\n        sum(ret)      AS block_ret\n    FROM indexed\n    CROSS JOIN (SELECT arrayJoin([2, 3, 5, 10, 21, 42, 63]) AS k) AS ks\n    GROUP BY k, blk\n    HAVING n = k\n)\nSELECT\n    concat(toString(k), ' sessions')                          AS block_length,\n    count()                                                   AS block_count,\n    round(varSamp(block_ret) / (k * any(var_1d)), 3)          AS variance_ratio\nFROM blocks\nCROSS JOIN base\nGROUP BY k\nORDER BY k","computed_at":"2026-08-14T16:02:33.240032+00:00","elapsed":0.104016841}