How I narrow 22,000 ZIP codes down to five worth actually researching
I've been researching markets far outside my own backyard for a few years, and the hardest part isn't finding deals. It's deciding which markets deserve an evening of attention in the first place. There are about 22,000 ZIP codes in the country with enough data to evaluate. You can properly research maybe five at a time.
So here's the exact funnel I ran last week, every threshold, every source, all of it free and public. 21,879 ZIPs in, five out. Steal it, change the numbers to fit your strategy, and you can replicate the whole thing in a spreadsheet over a weekend.
Screen 1: markets I can actually read from a distance
Rule: population at least 10,000, median home price between $80K and $250K.
The price band is my budget talking. The population floor is the out-of-state part: a tiny market doesn't produce enough sales to tell you what's happening in it, and remote investing runs entirely on numbers you can trust. If a ZIP only trades a handful of houses a year, every number is noise.
21,879 becomes 2,229. The first screen alone removes about ninety percent.
Screen 2: the yield floor
Rule: gross yield at least 8%. Annual rent divided by price, so $1,200 rent on a $150K house is 9.6%.
Nothing fancy. This is the only screen most people run, which is exactly the problem, and the next screen is why.
2,229 becomes 785.
Screen 3: cheap, or declining?
Rule: prices up over three years, and not down more than 2% over one.
A high yield can mean an underpriced market or a dying one, and the arithmetic looks identical. I tolerate mild recent softness, down 2% on the year happens in perfectly fine markets, but not a market that's been falling for years. Cheap and declining produce the same yield number and completely different outcomes.
785 becomes 439.
Screen 4: is anyone actually there
Rule: vacancy at or under 10%, population growth at or above zero.
This looks like a formality. It removed 83% of what was left, the quiet killer of the whole funnel. High vacancy over a shrinking population is the signature of a market where the yield exists because nobody wants to hold the asset.
439 becomes 73.
The last cut: sort by growth, not yield
From the 73 survivors, I take the five with the strongest three-year appreciation.
That's deliberate. The screens already guaranteed every survivor clears my yield bar, so sorting the finish line by yield again would just crown the cheapest house. Sorting by growth picks the strongest market among the yields I already accepted. Screen for income, sort for fundamentals.
And to be honest about what the sort is doing: it's choosing 5 from 73, not 5 from 22,000. The screens did the work.
The whole waterfall: 21,879 → 2,229 → 785 → 439 → 73 → 5.
The five, as of June 2026 data
| ZIP | City | Price | Rent | Yield | 1-yr | 3-yr | Vacancy |
|---|---|---|---|---|---|---|---|
| 17103 | Harrisburg, PA | $149,363 | $1,104/mo | 8.9% | +7.8% | +34.8% | 8.7% |
| 17401 | York, PA | $151,229 | $1,207/mo | 9.6% | +5.0% | +33.1% | 9.8% |
| 19604 | Reading, PA | $175,300 | $1,489/mo | 10.2% | +3.0% | +31.2% | 5.5% |
| 61111 | Loves Park, IL | $208,005 | $1,630/mo | 9.4% | +7.5% | +27.2% | 3.5% |
| 44483 | Warren, OH | $141,902 | $1,100/mo | 9.3% | +8.4% | +26.2% | 6.4% |
Things worth noticing before anyone gets excited.
Three of the five are the same central Pennsylvania corridor: Harrisburg, York, and Reading, all within about 50 miles of each other. That's not a glitch, it's a signal. The corridor pairs sub-$180K prices with 30%+ three-year runs, and when a mechanical screen clusters like that, the cluster is the finding.
Harrisburg 17103 is the one I'd inspect hardest. Lowest income of the five at about $39.8K, vacancy at 8.7% within sight of my own cut, and it's exactly the kind of urban-core ZIP where the block matters more than the ZIP. That's the biggest blind spot of any ZIP-level screen, and it's doubly true from out of state.
York squeaks under the vacancy bar at 9.8%. Worth knowing how close some cuts run.
One data honesty note: all five of these rents are observed listing rents, not census estimates. In smaller markets, listing-rent coverage thins out and estimated rents can drift from reality. If you replicate this, check which kind your rent number is before you trust a yield built on it.
Where every number comes from, free
Prices and appreciation: Zillow Research home values (ZHVI) at ZIP level. The file is Zip_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv on their data page; the latest column is the price, and comparing it to 12 and 36 months back gives you the appreciation figures.
Rents: same page, the observed rent index (ZORI), Zip_zori_uc_sfrcondomfr_sm_month.csv.
Yield: ZORI times 12, divided by ZHVI.
Vacancy: Census ACS 5-year, table B25002, vacant units divided by total units, ZCTA geography on data.census.gov.
Population and growth: ACS table B01003, current vintage against the prior one.
Income: ACS table B19013.
An afternoon with those files and a pivot table replicates everything above.
What "worth researching" actually means
These five earned an evening each, not an offer. The next steps are the ones no screen can do: call two property managers in each market and ask which blocks they won't take, what actually rents and how fast, and what taxes and insurance really run. That last-mile work is the point. The funnel's only job is making sure that when you spend those evenings, you spend them on markets whose fundamentals deserve it.
The thresholds are mine, tuned for cash flow with a safety bias. If you're growth-first, flip screen 2 and the final sort and you'll get a different five. The data is June 2026 and all of this re-ranks as new months land, so the five will drift. The method doesn't.
If you want, drop a budget and a yield floor in the replies and I'll run the same funnel with your numbers. Or name a ZIP and I'll tell you where it dies in the funnel.