{"slug":"do-volume-indicators-predict-anything","qid":"corr","label":"corr","post_title":"do-volume-indicators-predict-anything","post_url":"/blog/do-volume-indicators-predict-anything#q-corr","columns":["ticker","trailing_corr","forward_corr","session_count"],"rows":[{"ticker":"SPY","trailing_corr":0.84,"forward_corr":-0.16,"session_count":2596},{"ticker":"HD","trailing_corr":0.8,"forward_corr":0,"session_count":2596},{"ticker":"JPM","trailing_corr":0.8,"forward_corr":-0.1,"session_count":2596},{"ticker":"PEP","trailing_corr":0.78,"forward_corr":-0.14,"session_count":2596},{"ticker":"XOM","trailing_corr":0.78,"forward_corr":-0.01,"session_count":2596},{"ticker":"MCD","trailing_corr":0.76,"forward_corr":0.01,"session_count":2596},{"ticker":"KO","trailing_corr":0.74,"forward_corr":-0.15,"session_count":2596},{"ticker":"MSFT","trailing_corr":0.74,"forward_corr":-0.14,"session_count":2596},{"ticker":"PG","trailing_corr":0.69,"forward_corr":-0.09,"session_count":2596},{"ticker":"JNJ","trailing_corr":0.59,"forward_corr":-0.04,"session_count":2596}],"shape":"ranking","sql":"WITH\n    bars AS\n    (\n        SELECT\n            ticker,\n            date,\n            max(toFloat64(close))  AS close,\n            max(toFloat64(volume)) AS volume\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker IN ('MSFT', 'SPY', 'KO', 'JNJ', 'JPM', 'XOM', 'PG', 'PEP', 'MCD', 'HD')\n          AND date >= '2016-01-04'\n          AND date <= '2026-06-30'\n        GROUP BY ticker, date\n    ),\n    stepped AS\n    (\n        SELECT\n            ticker,\n            date,\n            close,\n            volume,\n            lagInFrame(close, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close\n        FROM bars\n    ),\n    cumulative AS\n    (\n        SELECT\n            ticker,\n            date,\n            close,\n            sum(if(prev_close = 0, 0, if(close > prev_close, volume, if(close < prev_close, -volume, 0))))\n                OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS obv,\n            row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS bar_no\n        FROM stepped\n    ),\n    deltas AS\n    (\n        SELECT\n            ticker,\n            close,\n            bar_no,\n            obv - lagInFrame(obv, 20) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS obv_change,\n            lagInFrame(close, 20)     OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS close_back,\n            leadInFrame(close, 20)    OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN CURRENT ROW AND 20 FOLLOWING) AS close_fwd\n        FROM cumulative\n    )\nSELECT\n    ticker,\n    round(corr(obv_change, 100 * (close / close_back - 1)), 2) AS trailing_corr,\n    round(corr(obv_change, 100 * (close_fwd / close - 1)), 2)  AS forward_corr,\n    count()                                                    AS session_count\nFROM deltas\nWHERE bar_no > 21\n  AND close_back > 0\n  AND close_fwd > 0\nGROUP BY ticker\nORDER BY trailing_corr DESC","computed_at":"2026-10-01T16:15:07.504032+00:00","elapsed":0.005680914}