Forecasting neighborhood home price appreciation from macroeconomic and regional drivers
NeighborCast is a forecasting study of 12-month home price appreciation for 21,605 US neighborhoods, built on Zillow's Home Value Index (1996 to 2026) and economic data from FRED, BEA, the Census Bureau and Redfin. It addresses two questions:
- Do macroeconomic conditions such as mortgage rates, unemployment, credit standards and housing supply improve 12-month price forecasts beyond what a neighborhood's own price history provides?
- Which neighborhoods are most exposed when mortgage rates rise?
Blue: realized 12-month change in the average neighborhood's home value. Magenta, dashed: a benchmark that extrapolates each neighborhood's previous 12 months. Green: the model with macroeconomic inputs. Both forecasts use only information available at the forecast date. The model's forecast peaked in mid-2021 and turned down in March 2022, two months before the benchmark. The chart shows the national component only; ranking neighborhoods within a date is a separate and harder problem, addressed below.
Models are evaluated as a forecaster would use them. At each month from January 2010 to July 2025 the model is fitted on data available at that date and predicts the following 12 months, giving 187 forecast dates. Forecast error is reported in two components, each against its own benchmark:
- National skill measures accuracy on the average price change across all neighborhoods, relative to extrapolating each neighborhood's previous 12 months. This is the market-direction question.
- Within-origin R² measures accuracy in ranking neighborhoods against one another at a given date, relative to a constant forecast that assigns every neighborhood the same change. This is the relative-performance question. A constant forecast is the appropriate benchmark here because a neighborhood's own recent change is a poor ranking signal.
Skill is the share of the benchmark's squared error removed by the model: 0.42 means 42% less error than the benchmark, and zero means no improvement.
| Model | Inputs | National skill | Within-origin R² |
|---|---|---|---|
| LightGBM | price history and valuation only | 0.17 | −0.19 |
| LightGBM | + national macro and credit conditions | 0.42 | 0.04 |
| LightGBM | + state and county conditions | 0.43 | 0.05 |
| LightGBM | + realized macro path over the forecast year | 0.44 | 0.07 |
| Ridge regression | + state and county conditions | 0.04 | 0.12 |
| Blend (LightGBM level, ridge ranking) | + state and county conditions | 0.43 | 0.12 |
Principal findings:
- Macroeconomic conditions improve the national forecast. Adding them raises national skill from 0.17 to 0.42. The gain is economically large, but a 12-month forecast horizon leaves only about 16 independent windows in the test period, so the Diebold-Mariano test gives p = 0.10.
- The signal comes from housing supply rather than the mortgage rate. Removing the four supply series (permits, starts, months' supply of new homes, homeowner vacancy) from the model eliminates the national gain; removing the mortgage-rate series has almost no effect; the supply series alone reach a skill of 0.50.
- Cross-sectional predictability is limited. The strongest ranking model, ridge regression, explains 12% of the variation across neighborhoods at a given date, a statistically significant but modest result. The tree model explains 5%, which is not significant.
- The two model families are complementary. LightGBM's national skill derives from the state and metro identifiers it receives, and those same inputs reduce its ranking accuracy. Ridge ranks more accurately but loses the national direction once macro inputs are added. A blend that takes the national level from LightGBM and the ranking from ridge has the lowest overall error.
- Foreknowledge of the macro path adds little. Supplying the realized changes in rates, unemployment and inflation over the forecast year raises national skill by less than 0.01 and within-origin R² by 0.02. Conditions known at the forecast date carry most of the information.
- Neighborhoods priced high relative to local income are the most exposed. After a one-point rise in mortgage rates over a year, a neighborhood one standard deviation higher in price-to-income records 1.5 percentage points less appreciation over the following two years (t = −4.5). The same exposure responds to inflation but not to unemployment, so the data do not identify whether the channel is the rate itself or nominal conditions more broadly.
The complete write-up, with methods, robustness checks and limitations, is in report/paper.md. Result tables are in report/tables and figures in report/figures.
Target. The 12-month change in the log of the raw (unsmoothed) Zillow index. Zillow's 2026 revision changed price levels by a median of 4% but left 12-month changes unchanged, one reason to model changes rather than levels. Metro-level changes correlate at 0.92 with the FHFA purchase-only index.
Real-time alignment. Every input carries its publication lag. CPI for a month enters after the middle of the following month; county income for a year enters from December of the following year. Annual county values older than two years are treated as missing rather than carried forward. Automated tests rebuild all features from data truncated at the forecast date and confirm they match. Two diagnostic runs confirm that shifting features forward 12 months raises skill sharply and that shuffling the targets reduces ranking skill to zero. One limitation remains: inputs are current revised series rather than first-published values, so the backtest is real-time in timing but not in vintage.
Inputs, added in stages. Price momentum and valuation; then national macro and credit conditions; then state and county conditions; then metro-level supply and rents (available from 2012). A final stage adds the realized macro path as an upper bound on the information macro inputs could contribute.
Models. Four benchmarks (no change, own momentum, long-run average, metro momentum), pooled linear regression, ridge regression, a fixed-effects panel regression, and LightGBM. LightGBM hyperparameters were tuned once on 2004 to 2009 and frozen, so the reported period was not used for tuning; each LightGBM refit trains on a random sample of 1.5 million rows. Two additional runs place the model families on equal inputs (LightGBM without state and metro identifiers; ridge with metro intercepts), and ablation runs remove blocks of inputs to identify which carry the signal.
Evaluation. Forecasts are produced monthly. Errors are decomposed into the national and within-origin components described above. Significance is assessed with the Diebold-Mariano test on the monthly series of error differences, adjusted for the overlap between consecutive 12-month forecasts.
Rate sensitivity. Estimated with local projections, which trace the effect of a change in mortgage rates over horizons of 3, 6, 12 and 24 months. Neighborhood and month fixed effects absorb everything common to a neighborhood over time and to all neighborhoods in a month, so identification comes only from differences in exposure across neighborhoods. The same specification is estimated with unemployment and inflation in place of the rate change as placebo tests.
uv sync --all-extras
make test # unit tests; leakage tests run once the data has been built
make all # download -> build -> features -> backtest -> analysisRequires Python 3.13 and uv. make all downloads about 400 MB of
public data into data/ (never committed) and runs for about 1.5 hours on an Apple Silicon
laptop, almost entirely in the backtests. Each stage is a separate Makefile target and can be run
independently.
src/hpa/ pipeline: loading, cleaning, geographic crosswalk, macro alignment,
features, backtest, models, evaluation, reports, figures, local projections
scripts/ download.py, with a manifest recording every source URL and file hash
tests/ unit tests and leakage tests
report/ paper.md, tables/, figures/
All sources are public: Zillow Research (home value and rent indices), FRED (interest rates,
prices, employment, housing supply, bank lending standards, state series), BEA (county personal
income), Census Bureau (county population, metro area definitions), Redfin Data Center (metro
inventory and sales) and FHFA (house price index, used for validation only). Source URLs are
listed in scripts/download.py.
This repository supersedes an earlier course project on the same question; the changes are
recorded in CHANGELOG.md.
Daniel Berhane Araya
MIT. See LICENSE.
