A forecast that admits what it can and can't do
Every number below is out of sample. For each test year from 2017 to 2025, the models were retrained using only data that existed at the time, then scored on what actually happened over the next 12 months. Errors are in percentage points of 12-month change.
The design: two models, not one
A single model forecasting each ZIP's price change did well in calm years but missed badly at turning points such as 2022–2023: it got the overall direction of the market wrong even while it still ranked ZIPs correctly. So the forecast is split in two.
- Trend model: where each metro (and the nation) is heading. Inputs are the metro's own price history, national momentum, mortgage rates, and Redfin market activity: months of supply, days on market, sale-to-list ratio and price cuts.
- Relative model: how each ZIP will do compared with its metro. Inputs are the ZIP's history relative to its metro, its price level relative to the metro and the nation, the change in its monthly mortgage payment, and (where Zillow tracks rents) its price-to-rent ratio and rent growth relative to the metro.
A ZIP's forecast is its metro's trend plus its relative forecast. Both are LightGBM models.
Metro forecasts
Mean absolute error, bias (negative means forecasts were too low) and rank correlation across metros.
| Model | MAE | MAE 2023+ | Bias | Rank corr. |
|---|---|---|---|---|
| Trend model (with Redfin market activity) | 3.44 | 2.66 | −0.45 | 0.48 |
| Trend model (prices and rates only) | 4.02 | 3.93 | −1.60 | 0.48 |
| Damped momentum (60% of last year's change) | 4.24 | 2.70 | −2.13 | 0.40 |
| Test year | Trend + Redfin | Trend, prices only | Damped momentum |
|---|---|---|---|
| 2017 | 2.49 | 2.82 | 3.35 |
| 2018 | 2.39 | 2.40 | 2.86 |
| 2019 | 1.96 | 2.03 | 3.52 |
| 2020 | 7.08 | 7.00 | 9.37 |
| 2021 | 4.27 | 3.74 | 5.52 |
| 2022 | 4.83 | 6.42 | 5.41 |
| 2023 | 2.53 | 4.95 | 3.18 |
| 2024 | 3.10 | 3.08 | 2.48 |
| 2025 | 2.37 | 3.77 | 2.46 |
ZIP forecasts
| Model | MAE | MAE 2023+ | Bias | Rank corr. |
|---|---|---|---|---|
| Two-part model (trend + relative) | 4.11 | 3.47 | −0.03 | 0.41 |
| Damped momentum (60% of last year's change) | 4.92 | 3.64 | −2.16 | 0.30 |
| Test year | Two-part | Damped momentum |
|---|---|---|
| 2017 | 2.76 | 3.76 |
| 2018 | 2.87 | 3.18 |
| 2019 | 2.50 | 4.00 |
| 2020 | 7.89 | 10.58 |
| 2021 | 4.46 | 5.62 |
| 2022 | 6.11 | 6.16 |
| 2023 | 3.17 | 4.16 |
| 2024 | 3.91 | 3.33 |
| 2025 | 3.33 | 3.44 |
Ranking ZIPs within their metro
This is the question the site leads with: which ZIPs will do better or worse than the metro around them.
| Model | MAE | Rank corr. | Top decile beat metro | Decile spread (pts) |
|---|---|---|---|---|
| Relative model | 2.46 | 0.25 | 70% | 4.01 |
| Moves with its metro (zero relative change) | 2.56 | — | — | — |
| Damped relative momentum | 2.68 | 0.12 | 63% | 2.47 |
Feature experiments
Each candidate feature group was added on its own and run through the same walk-forward backtest. The bar was set before looking at results: a trend group must lower metro error on average, in at least two-thirds of the years it affects, and not hurt 2023 onward; a relative group must improve the within-metro ranking on average and in two-thirds of years without raising error more than 1%. Groups that pass are combined, and the combination is kept only if it beats the best single group.
One amendment, made after the first run: groups that only exist for part of history (Zillow market data from 2018, rent from 2015) are judged on the years they change. That run also had a bug in which rows without the new data lost the Redfin features too; both were fixed before the results below.
Trend model (metros)
| Features | Metro MAE | MAE 2023+ | Years better | Verdict |
|---|---|---|---|---|
| Baseline: Price history + rates + Redfin market activity (3 mo. lag) | 3.445 | 2.662 | — | Kept |
| + Rent: price-to-rent & rent growth | +0.045 | +0.124 | 3/8 | Rejected |
| + Affordability (payment change, price vs. nation) | +0.055 | +0.095 | 4/9 | Rejected |
| + Volatility & drawdown | +0.063 | +0.045 | 4/9 | Rejected |
| Zillow market activity (current), replacing Redfin market activity (3 mo. lag) | +0.132 | −0.201 | 3/9 | Rejected |
| + Zillow market activity (current) | +0.157 | −0.158 | 2/5 | Rejected |
| + National macro (jobs, inflation, yields, starts) | +0.182 | +0.320 | 4/9 | Rejected |
| + Local unemployment & job growth | +0.202 | −0.131 | 4/9 | Rejected |
| Without Redfin market activity (3 mo. lag) | +0.579 | +1.269 | 3/9 | Rejected |
Relative model (ZIPs within their metro)
| Features | Rank corr. in metro | MAE | Years better | Verdict |
|---|---|---|---|---|
| Baseline: Price history + rates | 0.239 | 2.473 | — | |
| + Affordability (payment change, price vs. nation) + Rent: price-to-rent & rent growth | +0.005 | −0.014 | 8/9 | Adopted |
| + Rent: price-to-rent & rent growth | +0.004 | −0.006 | 7/9 | Passed, not best |
| + Affordability (payment change, price vs. nation) | +0.002 | −0.011 | 6/9 | Passed, not best |
| + Top vs. bottom tier spread | +0.001 | −0.001 | 4/9 | Rejected |
| + Volatility & drawdown | −0.005 | −0.000 | 2/9 | Rejected |
Relative model, round 2: groups added later, on top of round 1's winners
| Features | Rank corr. in metro | MAE | Years better | Verdict |
|---|---|---|---|---|
| Baseline: Price history + rates + Affordability (payment change, price vs. nation) + Rent: price-to-rent & rent growth | 0.245 | 2.458 | — | Kept |
| + Local unemployment & job growth | −0.002 | −0.012 | 4/9 | Rejected |
| + National macro (jobs, inflation, yields, starts) | −0.005 | +0.007 | 4/9 | Rejected |
Round 3: re-tests with fixes
Zillow market data blew up in 2022 after training on about two years of history, so a data source now needs three years of training history before its booster is used (it is active only in 2024–2025 here, a thin test). Unemployment hurt during the pandemic, so it was re-tested clipped to its 2005–2019 range, and with April 2020–September 2021 readings treated as missing. Picking that window uses hindsight, and testing two variants raises the odds of a lucky pass; neither passed.
| Features | Metro MAE | MAE 2023+ | Years better | Verdict |
|---|---|---|---|---|
| Baseline: Price history + rates + Redfin market activity (3 mo. lag) | 3.445 | 2.662 | — | Kept |
| + Zillow market activity (current) | −0.076 | −0.227 | 1/2 | Rejected |
| + Unemployment, pandemic months masked | −0.018 | −0.119 | 5/9 | Rejected |
| + Unemployment, clipped to pre-2020 ranges | +0.220 | −0.112 | 4/9 | Rejected |
| Features | Rank corr. in metro | MAE | Years better | Verdict |
|---|---|---|---|---|
| Baseline: Price history + rates + Affordability (payment change, price vs. nation) + Rent: price-to-rent & rent growth | 0.245 | 2.458 | — | Kept |
| + Unemployment, pandemic months masked | −0.000 | −0.002 | 5/9 | Rejected |
| + Unemployment, clipped to pre-2020 ranges | −0.002 | −0.011 | 4/9 | Rejected |
Differences are against the baseline; green is better.
The national forecast
Redfin has no national series, so the nation was forecast without market-activity data, the weakest setup. The alternative is a weighted mean of the metro forecasts, which do use Redfin.
National forecast: aggregate the metros?
Adopted by override (better in 5 of 9 years)Weights were chosen on 2005–2016 by how well they rebuild the actual national change from actual metro changes: Equal weights 1.80, Labor force × home value 1.01, Metro labor force 0.34 pts error. The rule (lower error overall and in 6 of 9 years) was set beforehand; with four forecasts a year, each year is a small sample.
| National MAE | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | Mean |
|---|---|---|---|---|---|---|---|---|---|---|
| Trend model on the national series | 2.45 | 0.57 | 0.88 | 7.09 | 2.00 | 7.15 | 4.37 | 1.83 | 2.31 | 3.18 |
| Weighted mean of metro forecasts | 1.22 | 0.89 | 0.71 | 7.41 | 4.03 | 4.37 | 1.24 | 3.09 | 1.59 | 2.73 |
| Damped momentum | 2.77 | 1.23 | 2.66 | 10.17 | 6.27 | 5.72 | 2.31 | 1.28 | 0.81 | 3.69 |
Rural ZIPs (outside any tracked metro) take the national trend as their parent. With the aggregate as parent their forecast error is 4.91 vs 5.20 pts, better in 6 of 9 years, so they use it too.
Hyperparameter tuning
Optuna (Bayesian search with early stopping of bad trials) tuned each model using only the earlier test years. The best settings and the defaults were then compared on later years the search never saw, and the tuned settings were kept only if they won there. Tuning on the same years you report is the easiest way to fool yourself with a backtest.
Trend model
Defaults kept: tuning didn't hold up42 trials completed, 18 stopped early. Searched on 2017, 2018, 2019, 2020, 2021; judged on 2022–2025 (metro MAE, lower is better).
| Holdout year | 2022 | 2023 | 2024 | 2025 | Mean |
|---|---|---|---|---|---|
| default | 4.832 | 2.526 | 3.095 | 2.365 | 3.204 |
| tuned | 6.959 | 3.770 | 3.667 | 2.429 | 4.206 |
- Loss
- L1 (absolute)
- Row sample
- 0.591
- Leaves per tree
- 13
- L2 penalty
- 0.267
- Trees
- 948
- Learning rate
- 9.8e-3
- Feature sample
- 0.322
- Min rows per leaf
- 65
- Trees23%
- Feature sample23%
- L2 penalty19%
- Loss14%
Relative model
Defaults kept: tuning didn't hold up28 trials completed, 2 stopped early. Searched on 2017, 2019, 2021; judged on 2022–2025 (within-metro rank correlation, higher is better).
| Holdout year | 2022 | 2023 | 2024 | 2025 | Mean |
|---|---|---|---|---|---|
| default | 0.201 | 0.306 | 0.169 | 0.235 | 0.228 |
| tuned | 0.182 | 0.279 | 0.148 | 0.237 | 0.212 |
- Loss
- L1 (absolute)
- Row sample
- 0.941
- Leaves per tree
- 20
- L2 penalty
- 0.657
- Trees
- 468
- Learning rate
- 0.103
- Feature sample
- 0.723
- Min rows per leaf
- 772
- Trees35%
- Feature sample15%
- Row sample13%
- L2 penalty10%
Honest caveats
- Zillow's index is smoothed, which makes momentum look stronger than it would on raw sales. Both our models and the baselines are scored on the same smoothed series.
- Redfin's public file trails Zillow's by about three months, so Redfin data is used 3 months behind in both the backtest and the live forecast.
- The 80% ranges come from backtest errors: for ZIPs, actual outcomes fell between -6.4 and +6.9 points of the forecast 80% of the time. They are pooled across all test years, so expect them to be too narrow in a shock year and too wide in a calm one.
- Zillow publishes its own forecast. Its history isn't public, so this site archives each month's snapshot and will score it against ours as outcomes arrive.
- Unemployment (BLS, via FRED) and national macro series are revised after release, and the backtest uses today's revised values with a one-month publication lag. That flatters those features slightly; the price, listing and rate data are not materially revised.
- This is a forecast of an index for an area, not an appraisal of any particular home.
Model v20261012-1839, data through August 2026.