Filed · Sourced · Walk-Forward Backtested

Mortgage rate — the short horizon, honestly

Multi-year rate prediction does not work — we proved that and stopped pretending. This is a short-horizon model: it forecasts the 30-year mortgage rate ~1 and ~3 months ahead from the rate's lagged catch-up to Treasury moves that already happened. Every prediction below was made walk-forward — fit only on data available at the time — and the chart overlays each prediction on what actually happened so you can see it track reality. Where the model does not beat “rate stays flat,” we say so.

30-yr Mortgage loading… FRED MORTGAGE30US
10-yr Treasury FRED DGS10
Spread (30y − 10y) Mean-reversion anchor
Model edge @ ~1mo MAE reduction vs “rate stays flat”
Near-term forecast — ~1 and ~3 months ahead
Weekly model · OLS · lag-catch-up
5-year forward projection — rates to 2031
Central path + honest p10–p90 band
Left of the line is tested history. Right of the line is the projection. The chart shows the actual 30-year mortgage rate up to today, then a 5-year forward central path with a p10–p90 uncertainty band out to 2031. The central path uses the short-horizon model for the first ~3 months (where it has real, tested skill), then glides toward a long-run anchor. The band is the empirical p10–p90 of how much the mortgage rate has actually moved over each horizon in 50+ years of FRED history — no assumed volatility. It fans out because rates genuinely move more over longer spans. This is a plausibility range, not a point prediction.
30-yr mortgage — tested history + 5-year forward cone to 2031 Actual MORTGAGE30 Model 13-wk prediction Forward central path Empirical p10–p90 cone
How we know this — model validation & methodology Historical chart · walk-forward proof · backtest scoreboard
Historical rates
Weekly · FRED
30-yr mortgage vs 10-yr Treasury MORTGAGE30US DGS10
Walk-forward proof — the short-horizon backtest
Predictions vs actuals · ends at today
Walk-forward proof — every ~3-month prediction overlaid on what actually happened Actual MORTGAGE30 Model 13-wk-ahead prediction (placed at its target week)
Residual distribution — ~3-month model prediction error (predicted − actual) count of weeks

Backtest scoreboard — model vs the baselines it has to beat

Every row is a full walk-forward backtest: at each week the model is fit only on data available at the time, predicts ahead, and is scored against what actually happened. naive = “rate stays flat.” momentum = “recent trend continues.” A real short-horizon model should beat naive; if it does not, the cell is plain, not green.

Horizon / modelMAE (pp)RMSE (pp)Directional hit-ratevs naive MAE

What the model is

The 30-yr mortgage rate is the Freddie Mac PMMS weekly survey average — a smoothed series that trails the Treasury market by a few weeks. So mortgage ≈ Treasury + spread, and when the 10-yr Treasury has already moved, the survey-based mortgage rate has a predictable near-term drift to catch up. The model is an ordinary least-squares regression on three lag-catch-up features:

  • DGS10 1-week momentum — the most recent Treasury move not yet absorbed.
  • DGS10 4-week momentum — the longer recent Treasury move.
  • spread deviation — the mortgage-minus-Treasury spread relative to its own 52-week rolling mean (the mean-reversion term).

mortgage_forecast(h) = mortgage_now + OLS(features). We tested the textbook decomposition that also forecasts the 10-yr Treasury — it added noise, because rate changes are near-unforecastable even at a week. So the model holds the Treasury level fixed and predicts only the part that is real: the catch-up. We also ran this model at monthly frequency — it does not beat naive monthly. The edge is a weekly phenomenon; monthly sampling washes it out. That is why the model runs weekly.

  • No AI claim. This is ordinary least squares — transparent coefficients, shown live below.
  • Gradient boosting was an optional cross-check “if sklearn is available.” sklearn is not installed in the build environment, so OLS stands alone — stated, not hidden.
  • No lookahead leakage: at each week, training uses only pairs whose outcome was observed strictly before that week.

Live coefficients (fit on all history):

Sources: FRED MORTGAGE30US, DGS10, DGS2, FEDFUNDS, DFF, T10Y2Y (all public domain). Model: ordinary least squares (numpy). Built . Not investment advice.
Beyond ~6 months — we do not predict
Empirical range · not a forecast
This is not a forecast. Multi-year rate moves are genuinely unforecastable — our earlier multi-year ensemble honestly backtested to ~zero edge. Instead of pretending, the band below is the empirical range: where the rate would land if each future year repeated the 10th / 50th / 90th percentile of historical year-over-year mortgage-rate moves. It widens with time because uncertainty does. Use it as a plausibility envelope, not a prediction.
30-yr mortgage — empirical 5-year envelope from historical YoY moves Today → p50 path p10–p90 empirical range