{"slug":"bootstrapping-backtest-confidence-intervals","qid":"autocorr","label":"Lag-one autocorrelation: signed returns against absolute returns, 2016 to 2025","post_title":"Bootstrapping Backtest Confidence Bands","post_url":"/blog/bootstrapping-backtest-confidence-intervals#q-autocorr","columns":["ticker","obs_count","return_autocorr","abs_return_autocorr"],"rows":[{"ticker":"SPY","obs_count":2514,"return_autocorr":-0.133,"abs_return_autocorr":0.366},{"ticker":"PG","obs_count":2514,"return_autocorr":-0.1,"abs_return_autocorr":0.291},{"ticker":"MSFT","obs_count":2514,"return_autocorr":-0.154,"abs_return_autocorr":0.269},{"ticker":"XOM","obs_count":2514,"return_autocorr":-0.028,"abs_return_autocorr":0.268},{"ticker":"KO","obs_count":2514,"return_autocorr":-0.032,"abs_return_autocorr":0.265},{"ticker":"JNJ","obs_count":2514,"return_autocorr":-0.08,"abs_return_autocorr":0.239}],"shape":"ranking","sql":"WITH daily AS\n(\n    SELECT\n        ticker,\n        date,\n        toFloat64(close) / nullIf(lagInFrame(toFloat64(close), 1)\n            OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW), 0) - 1 AS ret\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('SPY', 'MSFT', 'KO', 'XOM', 'JNJ', 'PG')\n      AND date >= '2015-11-01'\n      AND date <  '2026-01-01'\n),\nlagged AS\n(\n    SELECT\n        ticker,\n        date,\n        ret,\n        lagInFrame(ret, 1) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS ret_prev\n    FROM daily\n    WHERE ret IS NOT NULL\n      AND abs(ret) < 0.35\n)\nSELECT\n    ticker,\n    count()                                AS obs_count,\n    round(corr(ret, ret_prev), 3)          AS return_autocorr,\n    round(corr(abs(ret), abs(ret_prev)), 3) AS abs_return_autocorr\nFROM lagged\nWHERE date >= '2016-01-01'\n  AND ret_prev IS NOT NULL\nGROUP BY ticker\nORDER BY abs_return_autocorr DESC","computed_at":"2026-08-14T16:02:33.039173+00:00","elapsed":0.003072101}