{"slug":"real-returns-vs-random-walks","qid":"autocorrelation","label":"Autocorrelation of returns and absolute returns, lags 1 to 10","post_title":"Is the Market a Random Walk? Real Returns","post_url":"/blog/real-returns-vs-random-walks#q-autocorrelation","columns":["lag","return_autocorr","abs_return_autocorr"],"rows":[{"lag":"01","return_autocorr":-0.103,"abs_return_autocorr":0.314},{"lag":"02","return_autocorr":-0.014,"abs_return_autocorr":0.401},{"lag":"03","return_autocorr":0.004,"abs_return_autocorr":0.34},{"lag":"04","return_autocorr":-0.035,"abs_return_autocorr":0.354},{"lag":"05","return_autocorr":-0.013,"abs_return_autocorr":0.357},{"lag":"06","return_autocorr":-0.032,"abs_return_autocorr":0.342},{"lag":"07","return_autocorr":0.045,"abs_return_autocorr":0.326},{"lag":"08","return_autocorr":-0.039,"abs_return_autocorr":0.315},{"lag":"09","return_autocorr":0.038,"abs_return_autocorr":0.314},{"lag":"10","return_autocorr":0,"abs_return_autocorr":0.304}],"shape":"ranking","sql":"WITH daily AS (SELECT date, argMax(toFloat64(close), _ingest_time) AS px FROM global_markets.stocks_daily_aggs WHERE ticker = 'SPY' AND date >= '2006-01-01' AND date <= '2026-09-30' GROUP BY date),\nrets AS (SELECT date, px / prev_px - 1 AS ret FROM (SELECT date, px, lagInFrame(px) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px FROM daily) WHERE prev_px > 0),\nseries AS (SELECT arrayMap(x -> tupleElement(x, 2), arraySort(groupArray(tuple(date, ret)))) AS r FROM rets),\nlagged AS (SELECT lags.k AS k, arraySlice(s.r, lags.k + 1) AS x, arraySlice(s.r, 1, length(s.r) - lags.k) AS y FROM series AS s CROSS JOIN (SELECT arrayJoin(range(1, 11)) AS k) AS lags),\nsums AS\n(\n    SELECT\n        k,\n        toFloat64(length(x))                                AS n,\n        arraySum(x)                                         AS sx,\n        arraySum(y)                                         AS sy,\n        arraySum(arrayMap((a, b) -> a * b, x, y))           AS sxy,\n        arraySum(arrayMap(a -> a * a, x))                   AS sxx,\n        arraySum(arrayMap(a -> a * a, y))                   AS syy,\n        arraySum(arrayMap(a -> abs(a), x))                  AS sax,\n        arraySum(arrayMap(a -> abs(a), y))                  AS say,\n        arraySum(arrayMap((a, b) -> abs(a) * abs(b), x, y)) AS saxy\n    FROM lagged\n)\nSELECT\n    leftPad(toString(k), 2, '0')                                                                   AS lag,\n    round((n * sxy - sx * sy) / sqrt((n * sxx - sx * sx) * (n * syy - sy * sy)), 3)                 AS return_autocorr,\n    round((n * saxy - sax * say) / sqrt((n * sxx - sax * sax) * (n * syy - say * say)), 3)          AS abs_return_autocorr\nFROM sums\nORDER BY k","computed_at":"2026-10-01T15:35:50.890537+00:00","elapsed":0.435639626}