Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Gold vs Real Interest Rates: Does It Hold?

Do gold and real interest rates move inversely? We measure the rolling 12-month correlation of GLD against the 10-year real yield, and show where it broke.

Gold vs real interest rates is the most quoted relationship in gold commentary. Gold pays no interest, so the inflation-adjusted yield on a Treasury note is the income an owner of metal gives up, and the textbook version says the two move in opposite directions. The panels here measure that claim on daily data back to 2005 instead of restating it. The inverse relationship is real but loose, and it has gone missing for years at a stretch.

Gold vs real interest rates: the textbook mechanism

An ounce of gold pays no coupon and no dividend. A 10-year Treasury note pays a coupon, and once expected inflation is subtracted from it, what remains is the real yield: the purchasing power the holder picks up per year. That real yield is the opportunity cost of owning gold instead of the note. When the real yield sits high, the income an investor forgoes by holding metal is large. When it sits below zero, the note is losing purchasing power too, and gold's lack of income costs its holder nothing in relative terms. The same arithmetic is why where to park idle cash comes up in the same conversation.

That is the mechanism, and it is a statement about opportunity cost rather than a law of motion. The rest of this post treats it as a hypothesis with a measurable error.

How the 10-year real yield is built

There is no single published "gold discount rate". The series used here is the 10-year Treasury yield minus the 10-year market-implied inflation rate, the number usually called the 10-year breakeven: the annual inflation rate at which a conventional Treasury note and an inflation-protected one would come out even. Subtract one from the other and the remainder is a real yield in the Fisher sense. It tracks the Treasury's own published 10-year real curve rate closely without being identical to it.

QueryThe 10-year real yield, built from the nominal yield and the breakeven
80 rows (showing 20)
quarterquarter_labelnominal_10y_pctbreakeven_10y_pctreal_10y_pct
2005-01-01Q1 20054.272.621.64
2005-04-01Q2 20054.192.481.71
2005-07-01Q3 20054.132.391.74
2005-10-01Q4 20054.552.412.13
2006-01-01Q1 20064.582.522.06
2006-04-01Q2 20065.122.622.5
2006-07-01Q3 20064.862.52.36
2006-10-01Q4 20064.52.312.19
2007-01-01Q1 20074.72.372.33
2007-04-01Q2 20074.792.42.4
2007-07-01Q3 20074.762.232.53
2007-10-01Q4 20074.462.362.11
2008-01-01Q1 20083.622.331.29
2008-04-01Q2 20083.672.371.3
2008-07-01Q3 20083.992.331.67
2008-10-01Q4 20083.250.652.59
2009-04-01Q2 20093.21.61.6
2009-07-01Q3 20093.471.751.72
2009-10-01Q4 20093.252.071.17
2010-01-01Q1 20103.652.251.4
The exact SQL behind every number
SELECT
    toString(toStartOfQuarter(t.date))                                      AS quarter,
    concat('Q', toString(toQuarter(t.date)), ' ', toString(toYear(t.date))) AS quarter_label,
    round(avg(toFloat64(t.yield_10_year)), 2)                               AS nominal_10y_pct,
    round(avg(toFloat64(e.market_10_year)), 2)                              AS breakeven_10y_pct,
    round(avg(toFloat64(t.yield_10_year) - toFloat64(e.market_10_year)), 2) AS real_10y_pct
FROM global_markets.treasury_yields AS t
INNER JOIN global_markets.inflation_expectations AS e ON e.date = t.date
WHERE t.date >= '2005-01-01'
  AND t.yield_10_year > 0
  AND e.market_10_year > 0
GROUP BY quarter, quarter_label
ORDER BY quarter
Run this yourself

The panel covers 80 quarters. In Q1 2005 the real yield averaged 1.64%. In the most recent full quarter on the chart, Q2 2026, the 10-year yield averaged 4.39% against a breakeven of 2.44%, leaving a real yield of 1.95%. Watch the distance between the two upper lines: the breakeven moves far less than the nominal yield across most of the record, so a swing in the real yield is mostly a swing in the nominal 10-year. Our Treasury curve walkthrough covers how that nominal curve has been moving.

Does the correlation hold?

Correlation is the standard test. A correlation of -1 would mean daily moves in gold and in the real yield are perfect mirror images, 0 means no linear relationship at all, and +1 means they rise and fall together. The panel below takes the change in the real yield and the GLD return between consecutive matched dates, then measures the correlation over every trailing 12-month window, sampled at each quarter end.

QueryRolling 12-month correlation: daily GLD returns vs daily changes in the 10-year real yield
76 rows (showing 20)
quarterquarter_labelcorr_12msessions
2006-01-01Q1 20060.048
2006-04-01Q2 20060.178
2006-07-01Q3 20060.278
2006-10-01Q4 20060.458
2007-01-01Q1 20070.538
2007-04-01Q2 2007-0.098
2007-07-01Q3 2007-0.137
2007-10-01Q4 2007-0.577
2008-01-01Q1 2008-0.916
2008-04-01Q2 2008-0.936
2008-07-01Q3 2008-0.626
2008-10-01Q4 2008-0.357
2009-04-01Q2 2009-0.596
2009-07-01Q3 2009-0.596
2009-10-01Q4 2009-0.667
2010-01-01Q1 2010-0.548
2010-04-01Q2 2010-0.737
2010-07-01Q3 2010-0.667
2010-10-01Q4 2010-0.699
2011-01-01Q1 2011-0.638
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 - 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
    ),
    quarters AS
    (
        SELECT DISTINCT toStartOfQuarter(d) AS q
        FROM changes
        WHERE d >= '2006-01-01'
          AND addMonths(toStartOfQuarter(d), 3) <= today()
    )
SELECT
    toString(qs.q)                                                     AS quarter,
    concat('Q', toString(toQuarter(qs.q)), ' ', toString(toYear(qs.q))) AS quarter_label,
    round(corr(c.real_chg, c.gld_ret), 2)                              AS corr_12m,
    count()                                                            AS sessions
FROM quarters AS qs
CROSS JOIN changes AS c
WHERE c.d > addMonths(qs.q, -9)
  AND c.d < addMonths(qs.q, 3)
GROUP BY qs.q
ORDER BY qs.q
Run this yourself

76 rolling windows come out of that calculation, each one spanning twelve months of the calendar. What a window does not hold is a full year of trading days: the inflation-expectation series behind the real yield prints far less often than the price series, and the join keeps only the dates on which both print. The window ending in Q1 2006 measured 0.04 across 8 matched dates. The latest complete window, Q2 2026, measured 0.02 across 4 matched dates. Counts that small make any single window a rough reading; the series is worth taking as a whole rather than one window at a time.

The shape of the line carries the lesson. The series spends most of its life in negative territory, which is the textbook direction, yet it rarely approaches -1 and it crosses above zero more than once. Scale matters for interpretation: a correlation of 0.4 in absolute terms puts about 16% of the day-to-day variance in one series in common with the other, that figure being 0.4 squared. The remaining 84% is everything else that moves a gold price.

Where it held, and where it broke

A long-run average hides episodes, so the next panel pins five windows with fixed start and end dates and measures both series across each. Each bar pairs the change in the real yield, in percentage points, with the GLD return over the identical window, plus the daily correlation inside it.

QueryFive pinned episodes: real-yield move, GLD return, and the daily correlation inside each
episodespan_labelreal_yield_deltagld_return_pctdaily_corr
2008 credit crisisJun 2008 to Dec 20080.9-18.40.22
2013 taper repricingApr 2013 to Dec 20131.11-10-0.63
2020 easing cycleDec 2019 to Aug 2020-0.2911.50.04
2022 hiking cycleDec 2021 to Oct 20221.53-6.2-0.66
2025 to 2026 advanceDec 2024 to Sep 20260.0247.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)
Run this yourself

Take the 2013 taper repricing bar, covering Apr 2013 to Dec 2013. The real yield rose 1.11 percentage points and GLD returned -10% over the same window, with a daily correlation of -0.63 inside it. That is the textbook relationship working as advertised. The 2022 hiking cycle window holds the larger rate move of the five: 1.53 points on the real yield, alongside a GLD return of -6.2% and a daily correlation of -0.66.

Now compare the 2025 to 2026 advance bar, Dec 2024 to Sep 2026. GLD returned 47.2% while the real yield moved 0.02 points, with a daily correlation of -0.19. A real yield that stayed near its post-2008 highs, next to a gold price that advanced by tens of percent over the same stretch, is the cleanest counterexample in the record. Used as a trading rule over that window, the textbook rule pointed the wrong way for most of two years.

What commentary offers for the gap

Four explanations circulate whenever the correlation stops working. Each is a hypothesis, and none of them is settled by a correlation.

  • Official-sector buying. Central banks and sovereign funds accumulating bullion for reserve composition are not weighing an opportunity cost against a Treasury real yield.
  • Currency debasement hedging. Buyers treating gold as a claim on no issuer at all, priced against sovereign balance sheets rather than against a yield.
  • Fund flow. Creations into physical gold funds take metal onto balance sheets and out of the float, and the plumbing of that process sits in our ETF creation and redemption explainer.
  • The measurement itself. A breakeven is a market price, not realized inflation, so the "real" in real yield is partly a forecast that can be wrong after the fact.

A correlation cannot pick among these. It measures co-movement over a window, nothing more. Note too that the first three would all appear in the data as the same pattern: a gold price moving while the real yield stands still.

The volatility is measurable even when the direction is not

Implied volatility is the annualized size of move the options market is charging for, quoted in percent. It is not a forecast of direction. The panel reads it from GLD contracts sitting within 5% of the money with 20 to 45 days left to expiry, which is the standard place to look for a clean level.

QueryGLD implied volatility by month, near-the-money contracts with 20 to 45 days to expiry
25 rows (showing 20)
monthmonth_labelmedian_iv_pctp90_iv_pct
2024-09-01Sep 20241618.2
2024-10-01Oct 202416.818.5
2024-11-01Nov 202415.818.3
2024-12-01Dec 202414.515.7
2025-01-01Jan 202514.315.6
2025-02-01Feb 202515.717.9
2025-03-01Mar 202515.817.1
2025-04-01Apr 202521.326.1
2025-05-01May 202520.223.2
2025-06-01Jun 20251820.2
2025-07-01Jul 202515.917.5
2025-08-01Aug 202514.816.4
2025-09-01Sep 202516.818.7
2025-10-01Oct 202522.628.9
2025-11-01Nov 20252124.2
2025-12-01Dec 202520.124.1
2026-01-01Jan 202623.538.8
2026-02-01Feb 202630.137.2
2026-03-01Mar 202631.239.5
2026-04-01Apr 202625.933.8
The exact SQL behind every number
SELECT
    toString(toStartOfMonth(date))                                                                 AS month,
    formatDateTime(toStartOfMonth(date), '%b %Y')                                                  AS month_label,
    round(100 * quantileDeterministic(0.5)(toFloat64(implied_volatility), cityHash64(ticker)), 1) AS median_iv_pct,
    round(100 * quantileDeterministic(0.9)(toFloat64(implied_volatility), cityHash64(ticker)), 1) AS p90_iv_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'GLD'
  AND iv_converged = 1
  AND volume > 0
  AND underlying_close > 0
  AND days_to_expiry BETWEEN 20 AND 45
  AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
  AND date >= toStartOfMonth(today() - 760)
  AND date <  toStartOfMonth(today())
GROUP BY month, month_label
HAVING count() >= 20
ORDER BY month
Run this yourself

The panel holds 25 months. As of Sep 2026, the median implied volatility across those GLD contracts measured 23.3%, with the 90th percentile of the same contracts at 26.8%. The series opens at 16% in Sep 2024, so the level has not been static. Our GLD implied volatility post works through that chain in detail, and micro gold futures vs GLD compares the two common ways of carrying the exposure. Equity products on the mining side, including gold miner covered call ETFs, carry a different risk profile again.

The practical read for someone already holding GLD or micro gold futures: the real yield is one input among several, and the record above puts it in common with a minority of gold's daily variance even in the windows where it works. The expected size of the position's swing is the part that is directly measurable, and it comes from the options chain rather than from the rate.

FAQ

Do gold and real interest rates always move in opposite directions?

No. The rolling 12-month correlation above is negative in most windows since 2006, which matches the textbook direction, but it is far from -1 and it turns positive in some windows. The Dec 2024 to Sep 2026 panel row is a long stretch in which gold advanced while the real yield stayed high.

What is the 10-year real yield and how is it calculated?

It is the 10-year Treasury yield minus expected inflation over the same 10 years. The version in this post subtracts the 10-year market-implied inflation rate, the breakeven, from the nominal 10-year yield. The Treasury also publishes a real curve rate derived from inflation-protected securities, and the two track each other closely.

What does a correlation of -0.4 actually mean for gold?

It means daily moves in the two series have about 16% of their variance in common, that being 0.4 squared, and that the common part runs in opposite directions. The other 84% of gold's daily movement lines up with something other than the real yield.

Can a falling real yield be used to predict the gold price?

Nothing here supports that. The panels measure co-movement over past windows, including windows where the two series moved the same way for months at a time. A correlation describes a historical relationship and does not forecast the next move.

How much does GLD typically move?

The options chain gives the market's charged level directly. The monthly panel above shows the median implied volatility on near-the-money GLD contracts with 20 to 45 days to expiry, in annualized percent, alongside the 90th percentile of the same contracts.


Every panel above ships with the exact SQL beneath it. Open one, change the dates or swap the ticker, and run the same test on the Strasmore terminal.

#gold#real rates#treasuries#etfs#correlation