R-MODEL · Rent Forecast

Where is the rent heading?ZORI

DSCR today is a spot number — current rent divided by current value. It tells you where a market is, not where it is going. This page forecasts metro rent growth one year and three years ahead, so debt-service coverage can be read forward, not just frozen at today. A pooled mean-reversion model on Zillow ZORI history, walk-forward backtested, honest about its skill.

Walk-forward backtest — does the model beat naive?

The bar to beat is naive: assume rent growth simply keeps its current year-over-year rate. For every historical metro-month the model is fit only on data observed by that point, then scored on the rent growth that actually followed. Error is mean absolute error in percentage points of annual rent growth.

The mean-reversion signal, over time
Pooled AR(1) persistence b, re-fit at each walk-forward cut-off
Persistence coefficient b in gₐ₊ₕ = a + b·gₐ
1-year horizon 3-year horizon

At 1 year, b is positive but well below 1 — hot markets stay warm, but converge. At 3 years, b turns negative: today's fastest-growing metros are, on average, tomorrow's slowest. That reversal is the forecastable signal.

Fastest & slowest forecast rent growth
3-year forecast CAGR · all metros ranked
▲ Fastest forecast growth
#MetroRent now3yr fcstCAGR
▼ Slowest forecast growth
#MetroRent now3yr fcstCAGR
Every metro — forward-looking DSCR
Click a column to sort
# Metro Rent now YoY now 1yr fcst 3yr fcst 3yr CAGR DSCR now DSCR fwd 3y

DSCR fwd 3y holds property value flat and scales the spot DSCR by forecast rent growth only. It is a deliberately conservative rent-side projection — not a full DSCR forecast (it does not move home prices or mortgage rates).

Methodology & honest caveats

The model — pooled AR(1) mean-reversion on rent growth

We model the year-over-year rent growth rate gₐ directly, not the rent level. Growth is persistent in the short run and mean-reverts in the medium run, so a first-order autoregression is the natural, defensible form:

gₐ₊ₕ = a + b · gₐ

One pair (a, b) is fit per horizon by ordinary least squares across all metro-month observations pooled together — roughly 27 000 pairs at 1 year and 21 000 at 3 years. The rent level forecast then chains the predicted growth: rent × (1 + ĝ)^(h/12).

Why pooled, not per-metro

An earlier version fit a separate AR(1) for each of 245 metros. With only ~18–100 noisy growth observations apiece, those fits overfit badly — persistence drifted near 1.0 for hot markets and produced explosive extrapolations (a +33%/yr rent CAGR for one metro). It lost to naive by 35–50%. Mean reversion in rent growth is a structural property of the housing market, not a per-metro quirk; pooling 30 000 observations pins the coefficients tightly. Forecasts are additionally clamped to the empirical 1st–99th percentile of observed YoY growth, so no metro is projected outside the range rents have actually moved in.

Walk-forward backtest — no lookahead

A cut-off month walks forward through history. At each cut-off the pooled model is fit only on training pairs whose outcome was observed by that cut-off, then used to predict pairs whose outcome lands later. No future data leaks into any fit.

Honest caveats

Source — Zillow ZORI (Zillow Observed Rent Index), monthly, CC-BY research use. Built by build_rent_forecast.py. Data: rent_forecast.json.