{"slug":"gold-vs-real-interest-rates","qid":"shock_episodes","label":"Five pinned episodes: real-yield move, GLD return, and the daily correlation inside each","post_title":"Gold vs Real Interest Rates: Does It Hold?","post_url":"/blog/gold-vs-real-interest-rates#q-shock_episodes","columns":["episode","span_label","real_yield_delta","gld_return_pct","daily_corr"],"rows":[{"episode":"2008 credit crisis","span_label":"Jun 2008 to Dec 2008","real_yield_delta":0.9,"gld_return_pct":-18.4,"daily_corr":0.22},{"episode":"2013 taper repricing","span_label":"Apr 2013 to Dec 2013","real_yield_delta":1.11,"gld_return_pct":-10,"daily_corr":-0.63},{"episode":"2020 easing cycle","span_label":"Dec 2019 to Aug 2020","real_yield_delta":-0.29,"gld_return_pct":11.5,"daily_corr":0.04},{"episode":"2022 hiking cycle","span_label":"Dec 2021 to Oct 2022","real_yield_delta":1.53,"gld_return_pct":-6.2,"daily_corr":-0.66},{"episode":"2025 to 2026 advance","span_label":"Dec 2024 to Sep 2026","real_yield_delta":0.02,"gld_return_pct":47.2,"daily_corr":-0.19}],"shape":"table","sql":"WITH\n    daily AS\n    (\n        SELECT\n            t.date                                                   AS d,\n            toFloat64(t.yield_10_year) - toFloat64(e.market_10_year) AS real_10y,\n            toFloat64(g.close)                                       AS gld_close\n        FROM global_markets.treasury_yields AS t\n        INNER JOIN global_markets.inflation_expectations AS e ON e.date = t.date\n        INNER JOIN\n        (\n            SELECT\n                date,\n                max(close) AS close\n            FROM global_markets.stocks_daily_aggs\n            WHERE ticker = 'GLD'\n              AND date >= '2005-01-01'\n            GROUP BY date\n        ) AS g ON g.date = t.date\n        WHERE t.date >= '2005-01-01'\n          AND t.yield_10_year > 0\n          AND e.market_10_year > 0\n    ),\n    changes AS\n    (\n        SELECT\n            d,\n            real_10y,\n            gld_close,\n            real_10y - prev_real       AS real_chg,\n            gld_close / prev_close - 1 AS gld_ret\n        FROM\n        (\n            SELECT\n                d,\n                real_10y,\n                gld_close,\n                lagInFrame(real_10y)  OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_real,\n                lagInFrame(gld_close) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_close\n            FROM daily\n        )\n        WHERE prev_close > 0\n    ),\n    tagged AS\n    (\n        SELECT\n            multiIf(\n                d BETWEEN toDate('2008-06-30') AND toDate('2008-12-31'), '2008 credit crisis',\n                d BETWEEN toDate('2013-04-30') AND toDate('2013-12-31'), '2013 taper repricing',\n                d BETWEEN toDate('2019-12-31') AND toDate('2020-08-31'), '2020 easing cycle',\n                d BETWEEN toDate('2021-12-31') AND toDate('2022-10-31'), '2022 hiking cycle',\n                d BETWEEN toDate('2024-12-31') AND toDate('2026-09-30'), '2025 to 2026 advance',\n                'other')                                                 AS episode,\n            multiIf(\n                d BETWEEN toDate('2008-06-30') AND toDate('2008-12-31'), 'Jun 2008 to Dec 2008',\n                d BETWEEN toDate('2013-04-30') AND toDate('2013-12-31'), 'Apr 2013 to Dec 2013',\n                d BETWEEN toDate('2019-12-31') AND toDate('2020-08-31'), 'Dec 2019 to Aug 2020',\n                d BETWEEN toDate('2021-12-31') AND toDate('2022-10-31'), 'Dec 2021 to Oct 2022',\n                d BETWEEN toDate('2024-12-31') AND toDate('2026-09-30'), 'Dec 2024 to Sep 2026',\n                'other')                                                 AS span_label,\n            d,\n            real_10y,\n            gld_close,\n            real_chg,\n            gld_ret\n        FROM changes\n    )\nSELECT\n    episode,\n    span_label,\n    round(argMax(real_10y, d) - argMin(real_10y, d), 2)               AS real_yield_delta,\n    round(100 * (argMax(gld_close, d) / argMin(gld_close, d) - 1), 1) AS gld_return_pct,\n    round(corr(real_chg, gld_ret), 2)                                 AS daily_corr\nFROM tagged\nWHERE episode != 'other'\nGROUP BY episode, span_label\nORDER BY min(d)","computed_at":"2026-10-05T15:05:28.940825+00:00","elapsed":0.007363116}