Compare the people relocating to Raleigh versus Durham. What are the key differences in age, income, industry focus, and lifestyle? Which market represents better investment potential? Show me all the data and trends
Good, both are separate CBSAs (Raleigh-Cary and Durham-Chapel Hill). Now pull migration, demographics, employment, income, education, and rent/supply data for both.
cat << 'EOF' > /vercel/sandbox/calc.py
raleigh = {
"hhi_median":116039,"hhi_owner_median":141296,"hhi_renter_median":71105,
"pop":1562009,"pop_growth_1y":0.035,"pop_growth_5y":0.1724,
"job_growth_1y":0.0443,"job_growth_5y":0.2099,
"housing_supply_growth_1y":0.0307,"housing_supply_growth_5y":0.2311,
"households":623704,
"net_migration":5728,"net_pct":0.006028,
"age_in_avg":50.2,"age_out_avg":46.2,"age_in_med":46,"age_out_med":43,
"inc_in_med":133284,"inc_out_med":134718,
"nw_in":4.9,"nw_out":6.2,
"asking_rent":1674.40,"in_place_rent":1541.36,
"rent_to_income":0.2479,
"occ_latest":0.9279,"occ_12mo_ago":0.9485,
"vacancy":0.095,
"under_construction":7342,"permits_t12":6857,"permits_t13_24":6246,
"tradeout_pct":0.0005,
}
durham = {
"hhi_median":90831,"hhi_owner_median":125071,"hhi_renter_median":59266,
"pop":620522,"pop_growth_1y":0.0191,"pop_growth_5y":-0.0099,
"job_growth_1y":-0.0047,"job_growth_5y":0.0121,
"housing_supply_growth_1y":0.0239,"housing_supply_growth_5y":0.0493,
"households":257745,
"net_migration":-230,"net_pct":-0.000627,
"age_in_avg":49.1,"age_out_avg":44.7,"age_in_med":45,"age_out_med":38,
"inc_in_med":122941,"inc_out_med":114160,
"nw_in":5.0,"nw_out":5.8,
"asking_rent":1715.99,"in_place_rent":1560.06,
"rent_to_income":0.2991,
"occ_latest":0.9112,"occ_12mo_ago":0.9598,
"vacancy":0.12,
"under_construction":4282,"permits_t12":2724,"permits_t13_24":1919,
"tradeout_pct":-0.0073,
}
def pct(x): return f"{x*100:.1f}%"
print("=== Income gap ===")
print("Raleigh vs Durham median HHI gap:", raleigh["hhi_median"]-durham["hhi_median"], pct((raleigh["hhi_median"]-durham["hhi_median"])/durham["hhi_median"]))
print("=== Migration cohort delta (in - out) ===")
print("Raleigh income diff (in-out):", raleigh["inc_in_med"]-raleigh["inc_out_med"])
print("Durham income diff (in-out):", durham["inc_in_med"]-durham["inc_out_med"])
print("Raleigh net worth diff (in-out):", raleigh["nw_in"]-raleigh["nw_out"])
print("Durham net worth diff (in-out):", durham["nw_in"]-durham["nw_out"])
print("Raleigh age diff (in-out) avg:", raleigh["age_in_avg"]-raleigh["age_out_avg"])
print("Durham age diff (in-out) avg:", durham["age_in_avg"]-durham["age_out_avg"])
print("=== Supply pipeline as % of existing MF-relevant household base (proxy) ===")
print("Raleigh UC units as % of households:", pct(raleigh["under_construction"]/raleigh["households"]))
print("Durham UC units as % of households:", pct(durham["under_construction"]/durham["households"]))
print("Raleigh permits t12 vs t13-24 chg:", pct((raleigh["permits_t12"]-raleigh["permits_t13_24"])/raleigh["permits_t13_24"]))
print("Durham permits t12 vs t13-24 chg:", pct((durham["permits_t12"]-durham["permits_t13_24"])/durham["permits_t13_24"]))
print("=== Occupancy decline over 12mo ===")
print("Raleigh occ chg (pts):", (raleigh["occ_latest"]-raleigh["occ_12mo_ago"])*100)
print("Durham occ chg (pts):", (durham["occ_latest"]-durham["occ_12mo_ago"])*100)
print("=== Rent vs income cross-check ===")
print("Raleigh rent-to-income:", pct(raleigh["rent_to_income"]))
print("Durham rent-to-income:", pct(durham["rent_to_income"]))
print("Durham asking rent is higher than Raleigh despite lower income:", durham["asking_rent"]-raleigh["asking_rent"])
print("=== Population & job growth gap ===")
print("Raleigh 5yr pop growth vs Durham:", pct(raleigh["pop_growth_5y"]), pct(durham["pop_growth_5y"]))
print("Raleigh 5yr job growth vs Durham:", pct(raleigh["job_growth_5y"]), pct(durham["job_growth_5y"]))
EOF
python3 /vercel/sandbox/calc.pyGood, I have a clean 13-month occupancy series for both markets. Now drafting the response with tables/charts.
cat << 'EOF' > /vercel/sandbox/verdict.py
# Investment posture cross-check: job growth, migration, rent burden, occupancy trend, supply pipeline
raleigh = dict(job_growth_5y=0.2099, pop_growth_5y=0.1724, net_migration_pct=0.006028,
rent_to_income=0.2479, occ_chg_12mo=-2.06, vacancy=0.095, uc_pct_hh=1.2,
permit_accel=9.8, cap_rate=0.0507, noi_margin=0.5306)
durham = dict(job_growth_5y=0.0121, pop_growth_5y=-0.0099, net_migration_pct=-0.000627,
rent_to_income=0.2991, occ_chg_12mo=-4.86, vacancy=0.12, uc_pct_hh=1.7,
permit_accel=41.9, cap_rate=None, noi_margin=0.5193)
score_r, score_d = 0,0
for k in ["job_growth_5y","pop_growth_5y","net_migration_pct","noi_margin"]:
if raleigh[k] > durham[k]: score_r+=1
else: score_d+=1
for k in ["rent_to_income","vacancy","uc_pct_hh","permit_accel"]: # lower is better
if raleigh[k] < durham[k]: score_r+=1
else: score_d+=1
print("Raleigh favorable count:", score_r, "/8; Durham favorable count:", score_d, "/8")
EOF
python3 /vercel/sandbox/verdict.pyRaleigh is out-executing Durham on every growth and supply-absorption metric — the two Triangle markets are not the same investment story, even though they sit 25 miles apart.
Raleigh is recruiting a much bigger, faster-growing population on the back of real job creation (5-yr job growth +21.0% vs. Durham's +1.2%), while Durham's net migration has actually turned slightly negative (-230 people, or -0.06% of population) even as the quality of who's trading in is improving. Durham is the "smaller, richer, older-professional" market; Raleigh is the "bigger, faster, more middle-market" one. On investment potential, Raleigh wins clearly — Durham's combination of higher rent burden, faster-decaying occupancy, and an accelerating permit pipeline against flat job growth is a softening market, not a value story.
| Metric | ||
|---|---|---|
| Population | 1.56M | 620K |
| Population growth (5yr) | +17.2% | -1.0% |
| Job growth (5yr) | +21.0% | +1.2% |
| Job growth (1yr) | +4.4% | -0.5% |
| Net migration (people) | +5,728 | -230 |
| Net migration (% of population) | +0.60% | -0.06% |
| Median household income | $116,039 | $90,831 |
| Renter median income | $71,105 | $59,266 |
| Education (bachelor's+) | 68.5% | 69.8% |
| Asking rent (avg) | $1,674 | $1,716 |
| Rent-to-income ratio | 24.8%1 | 29.9%2 |
| Occupancy (latest) | 92.8% | 91.1% |
| Occupancy (12-mo change) | -2.1 pts | -4.9 pts |
| MF vacancy rate | 9.5% | 12.0% |
| Units under construction | 7,342 | 4,282 |
| MF permits growth (T12 vs. T13-24) | +9.8% | +41.9%3 |
| NOI margin (% of EGI) | 53.1% | 51.9% |
| Top industry (share of employment) | Healthcare 22.0%4 | Healthcare 35.3%5 |
Who's relocating — age, income, wealth
The most counterintuitive read in the data: in-migrants to both markets are notably older than the people leaving — Raleigh's inbound cohort averages 50.2 years vs. 46.2 for outbound, Durham's is 49.1 vs. 44.7. Neither market is a 20-something tech-migration story; both are pulling established professionals and retirees while younger, more mobile residents cycle out (consistent with Raleigh's move-out top destinations skewing to bigger coastal/mountain metros).
Where the two diverge sharply is cohort income quality. Durham's in-migrants earn a median $122,941 vs. $114,160 for those leaving — a $8,781 trade-up, and Durham ranks in the 70th percentile nationally for migration income upgrade. Raleigh's in-migrants actually earn less than its out-migrants ($133,284 vs. $134,718, a -$1,434 gap, 21st percentile nationally) — Raleigh is losing some of its wealthiest residents even as it gains far more people overall. Net worth tells the same story in both markets (outbound wealthier than inbound), but the gap is wider in Raleigh (-1.3 tiers) than Durham (-0.8 tiers). Read together: Raleigh is winning on volume, Durham is winning on selectivity — but Durham's selectivity isn't enough to offset a marginally negative net flow.
Industry focus
Durham is a healthcare/eds-and-meds monoculture — 35.3% of workers sit in healthcare and social assistance (Duke Health, UNC Health, the biotech cluster in Research Triangle Park), more than double any other sector. Raleigh is meaningfully more diversified: healthcare (22.0%) and admin/support services (20.0%) lead, but finance (7.8%), manufacturing (9.3%), and retail (9.0%) all carry real weight — a base that includes the state government function of being the capital plus a broader corporate and light-industrial mix. That concentration difference matters for demand durability: Durham's demand is tied tightly to hospital system and university employment cycles, while Raleigh's is spread across more independent economic drivers.
Lifestyle
The consumer-behavior signatures split along a predictable academic-vs-commercial line. Durham skews progressive-intellectual: plant-based diets, art-house films, museum memberships, public transit use, donations to Democratic causes, student loans, and Greek/Middle Eastern dining — the Duke/UNC/NC Central research-and-biotech cohort. Raleigh skews aspirational-mainstream: healthy-diet framing over plant-based, podcasts over art films, 401(k) contributions over "become an investor," luxury car purchases, beach vacations, home-buying intent, and voting early rather than cause-donating — a wealthier, more suburban-family-oriented profile. Both index high on prestige purchases and LinkedIn use, consistent with the shared professional-class base, but Raleigh's tenant is closer to a homeownership-track family; Durham's is closer to a renter-by-institution academic/medical professional.
Rent trend and occupancy — the real tell
Durham's occupancy has fallen nearly 5 points over the trailing year (95.98% → 91.12%) versus Raleigh's 2.1-point slide (94.85% → 92.79%) — Durham entered this cycle tighter and has lost ground twice as fast. That's landing on a smaller, already higher-vacancy base: Durham's MF vacancy sits at 12.0% vs. Raleigh's 9.5%, and Durham's tradeouts have gone negative (-0.7% on new leases) while Raleigh's are flat-to-slightly-positive (+0.05% average, and trending up on 3/6/12-month change) — the classic softening-market signature of landlords conceding to fill units. Layer on the supply side: Durham's MF permits accelerated 41.9% from the prior 12-month window into the trailing 12 months, versus Raleigh's more modest 9.8% acceleration — Durham is adding supply faster into a market with weaker job growth and negative net migration. Raleigh's pipeline is larger in absolute terms (7,342 units under construction vs. Durham's 4,282), but it's landing into a market gaining 5,728 net movers a year and 4.4% job growth — genuine absorption capacity Durham doesn't currently have.
Bottom line on investment potential
Raleigh is the stronger market on every dimension that drives multifamily performance: population and job growth, net migration, rent-to-income headroom (24.8% vs. Durham's 29.9%, which is pushing into moderate-burden territory), occupancy resilience, and NOI margin (53.1% vs. 51.9% of EGI). Durham's institutional anchor (Duke, UNC, RTP biotech) gives it wage-quality upside and a genuinely differentiated, higher-income in-migrant cohort — but that's a thesis for a specific submarket play near the medical/research campuses, not a market-wide allocation, given the broader vacancy and occupancy trend. Cap rate data confirms the market's institutional standing for Raleigh at 5.07% (2Q26); Durham's cap rate wasn't populated in this pull, itself a proxy for a thinner institutional transaction set.
Act on this: underwrite Raleigh market-wide, and if pursuing Durham, narrow to submarkets tied directly to Duke/UNC/RTP employment rather than the metro average. What would flip this: if Durham's job growth reaccelerates (it's been flat for a year) while its permit pipeline still has 41.9% more supply queued than absorption can currently support, the softening becomes structural rather than cyclical — that combination is the one to watch.
Happy to go deeper on submarket-level detail within either metro, or run the forward rent/occupancy forecast for both.
This is a read-only snapshot of a RealAI analysis.