Gold vs Real Interest Rates: Does It Hold?
Five pinned episodes: real-yield move, GLD return, and the daily correlation inside eachtable ·
2026-10-05 · 5×5
Rolling 12-month correlation: daily GLD returns vs daily changes in the 10-year real yieldtable ·
2026-10-05 · 76×4
The 10-year real yield, built from the nominal yield and the breakeventable ·
2026-10-05 · 80×5
GLD implied volatility by month, near-the-money contracts with 20 to 45 days to expiryseries ·
2026-10-05 · 25×4
Five pinned episodes: real-yield move, GLD return, and the daily correlation inside each
Five pinned episodes: real-yield move, GLD return, and the daily correlation inside each
| episode | span_label | real_yield_delta | gld_return_pct | daily_corr |
|---|---|---|---|---|
| 2008 credit crisis | Jun 2008 to Dec 2008 | 0.9 | -18.4 | 0.22 |
| 2013 taper repricing | Apr 2013 to Dec 2013 | 1.11 | -10 | -0.63 |
| 2020 easing cycle | Dec 2019 to Aug 2020 | -0.29 | 11.5 | 0.04 |
| 2022 hiking cycle | Dec 2021 to Oct 2022 | 1.53 | -6.2 | -0.66 |
| 2025 to 2026 advance | Dec 2024 to Sep 2026 | 0.02 | 47.2 | -0.19 |
the exact SQL behind every number
WITH
daily AS
(
SELECT
t.date AS d,
toFloat64(t.yield_10_year) - toFloat64(e.market_10_year) AS real_10y,
toFloat64(g.close) AS gld_close
FROM global_markets.treasury_yields AS t
INNER JOIN global_markets.inflation_expectations AS e ON e.date = t.date
INNER JOIN
(
SELECT
date,
max(close) AS close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'GLD'
AND date >= '2005-01-01'
GROUP BY date
) AS g ON g.date = t.date
WHERE t.date >= '2005-01-01'
AND t.yield_10_year > 0
AND e.market_10_year > 0
),
changes AS
(
SELECT
d,
real_10y,
gld_close,
real_10y - prev_real AS real_chg,
gld_close / prev_close - 1 AS gld_ret
FROM
(
SELECT
d,
real_10y,
gld_close,
lagInFrame(real_10y) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_real,
lagInFrame(gld_close) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_close
FROM daily
)
WHERE prev_close > 0
),
tagged AS
(
SELECT
multiIf(
d BETWEEN toDate('2008-06-30') AND toDate('2008-12-31'), '2008 credit crisis',
d BETWEEN toDate('2013-04-30') AND toDate('2013-12-31'), '2013 taper repricing',
d BETWEEN toDate('2019-12-31') AND toDate('2020-08-31'), '2020 easing cycle',
d BETWEEN toDate('2021-12-31') AND toDate('2022-10-31'), '2022 hiking cycle',
d BETWEEN toDate('2024-12-31') AND toDate('2026-09-30'), '2025 to 2026 advance',
'other') AS episode,
multiIf(
d BETWEEN toDate('2008-06-30') AND toDate('2008-12-31'), 'Jun 2008 to Dec 2008',
d BETWEEN toDate('2013-04-30') AND toDate('2013-12-31'), 'Apr 2013 to Dec 2013',
d BETWEEN toDate('2019-12-31') AND toDate('2020-08-31'), 'Dec 2019 to Aug 2020',
d BETWEEN toDate('2021-12-31') AND toDate('2022-10-31'), 'Dec 2021 to Oct 2022',
d BETWEEN toDate('2024-12-31') AND toDate('2026-09-30'), 'Dec 2024 to Sep 2026',
'other') AS span_label,
d,
real_10y,
gld_close,
real_chg,
gld_ret
FROM changes
)
SELECT
episode,
span_label,
round(argMax(real_10y, d) - argMin(real_10y, d), 2) AS real_yield_delta,
round(100 * (argMax(gld_close, d) / argMin(gld_close, d) - 1), 1) AS gld_return_pct,
round(corr(real_chg, gld_ret), 2) AS daily_corr
FROM tagged
WHERE episode != 'other'
GROUP BY episode, span_label
ORDER BY min(d)
More from this analysisGold vs Real Interest Rates: Does It Hold?
The 10-year real yield, built from the nominal yield and the breakeven
table 80×5
→
Rolling 12-month correlation: daily GLD returns vs daily changes in the 10-year real yield
table 76×4
→
GLD implied volatility by month, near-the-money contracts with 20 to 45 days to expiry
series 25×4
→
What one Micro Gold (MGC) contract controls at different gold prices
table 7×6
→
See all 3,094 queries →