{"slug":"pairs-trading-and-cointegration","qid":"pair_correlation","label":"Daily-return correlation vs price-level correlation, five familiar pairs (2024-2025)","post_title":"Pairs Trading and Cointegration Explained","post_url":"/blog/pairs-trading-and-cointegration#q-pair_correlation","columns":["pair","return_corr","price_corr"],"rows":[{"pair":"HD / LOW","return_corr":0.868,"price_corr":0.849},{"pair":"V / MA","return_corr":0.862,"price_corr":0.954},{"pair":"XOM / CVX","return_corr":0.795,"price_corr":0.512},{"pair":"KO / PEP","return_corr":0.576,"price_corr":-0.493},{"pair":"AAPL / MSFT","return_corr":0.479,"price_corr":0.508}],"shape":"ranking","sql":"WITH\n    px AS (\n        SELECT\n            ticker,\n            date,\n            toFloat64(any(close)) AS close_px\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker IN ('KO', 'PEP', 'HD', 'LOW', 'XOM', 'CVX', 'V', 'MA', 'AAPL', 'MSFT')\n          AND date BETWEEN '2024-01-01' AND '2025-12-31'\n        GROUP BY ticker, date\n    ),\n    rets AS (\n        SELECT\n            ticker,\n            date,\n            close_px,\n            close_px / lagInFrame(close_px) OVER (\n                PARTITION BY ticker ORDER BY date\n                ROWS BETWEEN 1 PRECEDING AND CURRENT ROW\n            ) - 1 AS ret\n        FROM px\n    )\nSELECT\n    p.pair                                  AS pair,\n    round(corr(a.ret, b.ret), 3)            AS return_corr,\n    round(corr(a.close_px, b.close_px), 3)  AS price_corr\nFROM\n(\n    SELECT\n        tupleElement(t, 1) AS leg_a,\n        tupleElement(t, 2) AS leg_b,\n        tupleElement(t, 3) AS pair\n    FROM\n    (\n        SELECT arrayJoin([\n            ('KO',   'PEP',  'KO / PEP'),\n            ('HD',   'LOW',  'HD / LOW'),\n            ('XOM',  'CVX',  'XOM / CVX'),\n            ('V',    'MA',   'V / MA'),\n            ('AAPL', 'MSFT', 'AAPL / MSFT')\n        ]) AS t\n    )\n) AS p\nINNER JOIN rets AS a ON a.ticker = p.leg_a\nINNER JOIN rets AS b ON b.ticker = p.leg_b AND b.date = a.date\nWHERE isFinite(a.ret) AND isFinite(b.ret)\nGROUP BY pair\nORDER BY return_corr DESC","computed_at":"2026-08-13T16:30:37.486187+00:00","elapsed":0.32173818}