Gentrification signals are a lagging indicator of home prices, not a leading one
Fort Greene's ZIP 11205 went from 31% below the New York metro's median home value in 2000 to 86% above it in 2018. Its coffee-shop count did not move until 2012. I ran nine signals people use to call the next Fort Greene through the same test, on 782 ZIPs and 26 years of Zillow data. One of them works, for one year.
The theory everyone in Brooklyn repeats: once asking prices pass what residents can pay, richer people replace them, the shops change to serve them, and prices outrun the city for years. If so, Fort Greene should have been easy to forecast: watch for the tipping point, buy, wait a decade.
Fort Greene repriced first
The median home in 11205 was worth $161,000 in January 2000, 31% below the metro median. It reached the metro median in 2003 and was 23% above it by 2010. The Census counted 4 to 8 coffee shops there every year through 2010, then 11 in 2012 and 28 in 2020.
The relative price peaked in 2018 at 86% above the metro and is 45% above today. Fort Greene has trailed the metro for eight years while shops kept opening and the white non-Hispanic share rose from 39% in 2011 to 52% in 2024.
Across the metro, coffee shops trail prices by about four years
One ZIP is an anecdote. I took Census counts of coffee shops in every New York metro ZIP and correlated each ZIP's five-year change in shops with its five-year relative price change, sliding the price window back and forward in time.
Shops opening in 2015 to 2020 line up with the price change of 2011 to 2016. As a forecast, the same feature predicts the next five years at -0.05. Gyms, bars and pet groomers behave the same. Payday lenders and laundromats closing ran backwards: ZIPs where they opened beat the metro over five years in 12 of 15 start years, the years cheap ZIPs won.
The 2005-2015 winners were the 2015-2025 losers
Prospect Heights (11238) beat the metro by 63 log points (near percentage points, for small moves) from 2005 to 2015, and trailed it by 74 over the next ten. Harlem's 10027 went +104 then -82. Irvington, New Jersey went -73 then +76.
Reversal is not a law; the 2000-2010 winners persisted mildly into 2010-2020, at +0.22. It depends on where in the cycle you start, as does the simplest rule, buy the cheap ZIP.
Cheap ZIPs won 2001 to 2006, lost 2007 to 2014, won 2015 to 2024: two cycles in 26 years. A model fit on realized ten-year outcomes is fit on the previous phase, so every ten-year model I trained scored below zero on unseen years.
Nine signals, one test
Rank correlations between a signal at the start of a year and the ZIP's later growth relative to the metro, averaged over start years. Racial composition was checked as description and stays out of any model, under the Fair Housing Act.
| Signal | Result, 782 ZIPs |
|---|---|
| Last year's relative growth | +0.39 one year ahead, positive in 15 of 16 years |
| Price below the metro median | +0.14 at five years for the cheap side; sign flips every 6 to 8 years |
| Last decade's relative growth | -0.62 for 2005-15 vs 2015-25; +0.22 for 2000-10 vs 2010-20 |
| Crossed the metro median in the past 5 years | Won in 11 of 17 start years; every win before 2014, every loss after |
| 5-year rise in income and college share | -0.18, negative in all 4 start years available |
| 5-year rise in coffee shops, gyms, bars | -0.05 at five years; tracks the price change four years earlier |
| 5-year fall in payday lenders, laundromats | Backwards: openings went with outperformance in 12 of 15 start years |
| 5-year change in white share | -0.06; description only |
| Beta: ZIP move per 1% metro move, past 10 years | Wins in 17 of 20 rising years, loses in 18 of 19 falling years |
What a model adds at one year
A gradient-boosted model on 54 features, trained on every US metro because New York alone has too few years, and scored on New York, ranks next year's ZIPs at +0.44 across 16 held-out years. Sorting by last year's relative growth scores +0.39. The gap has a 90% block-bootstrap interval of +0.01 to +0.09, so it is real and small, and nearly all of it comes from Zillow's listing files: price cuts, inventory, days to pending. The model's top fifth beat its bottom fifth by 5.6 percentage points a year; the sort gets 5.0.
At two and three years the model ties the sort. At five and ten years it scores -0.00 and -0.23. It agrees with Zillow's twelve-month forecast at +0.59. The current top and bottom 15 are in RESULTS.md, dated for grading next year: New Jersey and Westchester commuter suburbs at the top, Manhattan condo ZIPs and Newark at the bottom.
Objections I expect
- Two cycles is not a sample. The -0.62 is one reversal, not a rate, and that is the argument against any ten-year ZIP forecast.
- I train on today's revised Zillow series, which flatters every backtest here a little, the model most.
- The Census business counts come out two years after the year they describe. The lag chart uses the year they describe; a live signal would see the shops two years later still.
- A rank correlation this size explains about a fifth of the variance. Plenty of the top 15 will trail the metro.
What I take from it
The gentrification story is accurate as history and useless as a forecast, because the market reprices a neighborhood years before a census or a storefront shows it. For next year, sort by last year's relative growth and break ties with the listing data. For ten years out, anyone with a confident ZIP list is describing the last cycle. I still do not know what moved Fort Greene's price between 2000 and 2003, and none of the features I built would have caught it.
At a glance
- Data
- Zillow ZHVI, ZORI, inventory, days to pending and price cuts by ZIP; ACS 5-year; Census County Business Patterns; FRED mortgage rates
- Target
- A ZIP's log price change minus its metro's, one to ten years ahead
- Test
- Train on years whose outcome was known before year t, score year t, for t from 2010 to 2025
- ZIPs
- 21,556 nationally; 772 to 831 in the New York metro depending on year
- Code
- Python, pandas, scikit-learn; runs end to end with uv
- Cost
- $0 in data; a free Census API key