I want to identify the best submarkets for acquiring stabilized, Class-A garden-style multifamily communities in the 200-300 unit range within Raleigh-Durham Research Triangle. My core priorities are sustained, long-term housing demand over the next 5 years driven by a resident base with low risk of income or credit distress, which points toward growth signals like population influx and net migration and sound credit fundamentals. Given my acquisition profile of institutional-quality stabilized assets, analyze which specific submarkets best fit these demand and tenant-quality criteria, and flag additional factors I should weigh such as new supply pipeline, employer concentration risk, and cap rate positioning relative to the broader market. Include visualizations to help illustrate your conclusions.
mkdir -p /vercel/sandbox/analysis
from collections import Counter
submarket_ids = [
"f574f80c40bb93effcd4fc9f9e2fddfc","b0b5b4aa29530c967d975cc7bd954714","3ca15926fc73f9c2c4c459bec25aa3bf",
"4c51bdfa117b7f992655175beb8ebf5e","6fa108b362ad7b13f76632402f2e5f54","f480e105038076f28b54e8ef18fd9b29",
"5cc97bb42e7363d60271e9a490bd2a3b","a669133afe22a6ed367e3e625b6b9d7b","3ca15926fc73f9c2c4c459bec25aa3bf",
"a669133afe22a6ed367e3e625b6b9d7b","b7f61e176b4fb484acf94e59846b6faf","2ea50c5e83a0fa2f261f18f8a769077f",
"f480e105038076f28b54e8ef18fd9b29","3ca15926fc73f9c2c4c459bec25aa3bf","4c51bdfa117b7f992655175beb8ebf5e",
"3ca15926fc73f9c2c4c459bec25aa3bf","1db456df79ba4c059ed35d583ed1e198","a669133afe22a6ed367e3e625b6b9d7b",
"f480e105038076f28b54e8ef18fd9b29","1db456df79ba4c059ed35d583ed1e198","3ca15926fc73f9c2c4c459bec25aa3bf",
"f480e105038076f28b54e8ef18fd9b29","1db456df79ba4c059ed35d583ed1e198","6fa108b362ad7b13f76632402f2e5f54",
"b0b5b4aa29530c967d975cc7bd954714","36c6a913fdf35ebd24702d27983847dc","6fa108b362ad7b13f76632402f2e5f54",
"609dc7441aa03e9ada7d4ba626733853","9ce4ca7dd2edc597acf07cdcb8d4f6c5","3ca15926fc73f9c2c4c459bec25aa3bf",
"4c51bdfa117b7f992655175beb8ebf5e","e04b06a7d60b9c122d5ba00a8a7cb66b","6fa108b362ad7b13f76632402f2e5f54",
"f480e105038076f28b54e8ef18fd9b29","9ce4ca7dd2edc597acf07cdcb8d4f6c5","e04b06a7d60b9c122d5ba00a8a7cb66b",
"f574f80c40bb93effcd4fc9f9e2fddfc","9ce4ca7dd2edc597acf07cdcb8d4f6c5","6fa108b362ad7b13f76632402f2e5f54",
"b0b5b4aa29530c967d975cc7bd954714","6fa108b362ad7b13f76632402f2e5f54","6fa108b362ad7b13f76632402f2e5f54",
"e04b06a7d60b9c122d5ba00a8a7cb66b","3ca15926fc73f9c2c4c459bec25aa3bf","b0b5b4aa29530c967d975cc7bd954714",
"6fa108b362ad7b13f76632402f2e5f54","9ce4ca7dd2edc597acf07cdcb8d4f6c5","e04b06a7d60b9c122d5ba00a8a7cb66b",
"f574f80c40bb93effcd4fc9f9e2fddfc","6fa108b362ad7b13f76632402f2e5f54","3ca15926fc73f9c2c4c459bec25aa3bf",
"3ca15926fc73f9c2c4c459bec25aa3bf","d73f2e72bac60fd80698a19e63b64d55","b0b5b4aa29530c967d975cc7bd954714",
"6fa108b362ad7b13f76632402f2e5f54","f480e105038076f28b54e8ef18fd9b29","f480e105038076f28b54e8ef18fd9b29",
"f480e105038076f28b54e8ef18fd9b29","b7f61e176b4fb484acf94e59846b6faf","4c51bdfa117b7f992655175beb8ebf5e",
"6fa108b362ad7b13f76632402f2e5f54","a66bf41ac9b21c5b5239c10711e22f46","4c51bdfa117b7f992655175beb8ebf5e",
"609dc7441aa03e9ada7d4ba626733853","3ca15926fc73f9c2c4c459bec25aa3bf","5cc97bb42e7363d60271e9a490bd2a3b",
"9ce4ca7dd2edc597acf07cdcb8d4f6c5","b0b5b4aa29530c967d975cc7bd954714","f480e105038076f28b54e8ef18fd9b29",
"6fa108b362ad7b13f76632402f2e5f54","3ca15926fc73f9c2c4c459bec25aa3bf","3ca15926fc73f9c2c4c459bec25aa3bf",
"a669133afe22a6ed367e3e625b6b9d7b","9ce4ca7dd2edc597acf07cdcb8d4f6c5","4c51bdfa117b7f992655175beb8ebf5e",
"ba47bc4921c31877f906f6fd40c7f7b8","877fbb0b9584133a0e4c622532bfb9ee","4c51bdfa117b7f992655175beb8ebf5e",
"9ce4ca7dd2edc597acf07cdcb8d4f6c5","b7f61e176b4fb484acf94e59846b6faf","4c51bdfa117b7f992655175beb8ebf5e",
"b0b5b4aa29530c967d975cc7bd954714","9ce4ca7dd2edc597acf07cdcb8d4f6c5","f574f80c40bb93effcd4fc9f9e2fddfc",
"f574f80c40bb93effcd4fc9f9e2fddfc","9ce4ca7dd2edc597acf07cdcb8d4f6c5","b7f61e176b4fb484acf94e59846b6faf",
"6fa108b362ad7b13f76632402f2e5f54","3ca15926fc73f9c2c4c459bec25aa3bf","4c51bdfa117b7f992655175beb8ebf5e",
"9ce4ca7dd2edc597acf07cdcb8d4f6c5","9ce4ca7dd2edc597acf07cdcb8d4f6c5","6fa108b362ad7b13f76632402f2e5f54",
"6fa108b362ad7b13f76632402f2e5f54","f480e105038076f28b54e8ef18fd9b29","e04b06a7d60b9c122d5ba00a8a7cb66b",
"877fbb0b9584133a0e4c622532bfb9ee","6fa108b362ad7b13f76632402f2e5f54","ba47bc4921c31877f906f6fd40c7f7b8",
"877fbb0b9584133a0e4c622532bfb9ee",
# page 2
"2ea50c5e83a0fa2f261f18f8a769077f","f480e105038076f28b54e8ef18fd9b29","f574f80c40bb93effcd4fc9f9e2fddfc",
"2ea50c5e83a0fa2f261f18f8a769077f","6fa108b362ad7b13f76632402f2e5f54","3ca15926fc73f9c2c4c459bec25aa3bf",
"4c51bdfa117b7f992655175beb8ebf5e","4c51bdfa117b7f992655175beb8ebf5e","b0b5b4aa29530c967d975cc7bd954714",
"4c51bdfa117b7f992655175beb8ebf5e","f480e105038076f28b54e8ef18fd9b29","3ca15926fc73f9c2c4c459bec25aa3bf",
"877fbb0b9584133a0e4c622532bfb9ee","3ca15926fc73f9c2c4c459bec25aa3bf",
]
print("Total:", len(submarket_ids))
c = Counter(submarket_ids)
id_to_name = {
"f574f80c40bb93effcd4fc9f9e2fddfc":"Raleigh - University",
"2ea50c5e83a0fa2f261f18f8a769077f":"Raleigh - South",
"36c6a913fdf35ebd24702d27983847dc":"Raleigh - West",
"3ca15926fc73f9c2c4c459bec25aa3bf":"Clay - Morrisville",
"4c51bdfa117b7f992655175beb8ebf5e":"Raleigh - Northwest",
"5cc97bb42e7363d60271e9a490bd2a3b":"Raleigh - Southeast",
"5dfec0600cbffe2145942d5806096360":"Raleigh - Downtown",
"609dc7441aa03e9ada7d4ba626733853":"Fuquay-Varina",
"6d756da750040ca3eba804a41ead6ebd":"Raleigh - Central West",
"6e0e7d4819d4a854159286263c2e8392":"Wendell",
"6fa108b362ad7b13f76632402f2e5f54":"Raleigh - Northeast",
"877fbb0b9584133a0e4c622532bfb9ee":"Raleigh - Southwest",
"9ce4ca7dd2edc597acf07cdcb8d4f6c5":"Wake Forest",
"9ff402d85dfeaacc1b8533a6e704096b":"Benson",
"a669133afe22a6ed367e3e625b6b9d7b":"Apex",
"a66bf41ac9b21c5b5239c10711e22f46":"Franklin County",
"b0b5b4aa29530c967d975cc7bd954714":"Raleigh - Brier Creek",
"b7f61e176b4fb484acf94e59846b6faf":"Clayton",
"ba47bc4921c31877f906f6fd40c7f7b8":"Holly Springs",
"d73f2e72bac60fd80698a19e63b64d55":"Raleigh - East",
"e04b06a7d60b9c122d5ba00a8a7cb66b":"Garner",
"ed7e5fca1d2551fc8e67b1592999edd8":"Smithfield",
"f480e105038076f28b54e8ef18fd9b29":"Raleigh - North",
"f4b11b303dc58257d6981657fbece925":"Raleigh - Central East",
"1db456df79ba4c059ed35d583ed1e198":"Knightdale",
}
for sid, cnt in c.most_common():
print(f"{id_to_name.get(sid,sid):25s} {cnt}")
cd /vercel/sandbox && python analysis/inventory_count.py
[
{"entity":"Knightdale","comp_inventory":3,"net_pct_msa_pctile":75,"income_diff_msa_pctile":75,"fico_score":682.94,"past_due_rate":0.1017,"mortgage_delinq_rate":0.0642,"education_msa_pctile":33,"occupancy":0.9341,"hhi_median":124808},
{"entity":"Raleigh - South","comp_inventory":3,"net_pct_msa_pctile":67,"income_diff_msa_pctile":0,"fico_score":648.08,"past_due_rate":0.1394,"mortgage_delinq_rate":0.0747,"education_msa_pctile":4,"occupancy":0.8534,"hhi_median":74096},
{"entity":"Clay - Morrisville","comp_inventory":16,"net_pct_msa_pctile":38,"income_diff_msa_pctile":42,"fico_score":759.25,"past_due_rate":0.0438,"mortgage_delinq_rate":0.0092,"education_msa_pctile":92,"occupancy":0.9333,"hhi_median":199997},
{"entity":"Raleigh - Northwest","comp_inventory":12,"net_pct_msa_pctile":17,"income_diff_msa_pctile":63,"fico_score":742.06,"past_due_rate":0.0665,"mortgage_delinq_rate":0.0096,"education_msa_pctile":100,"occupancy":0.9274,"hhi_median":148806},
{"entity":"Raleigh - Southeast","comp_inventory":2,"net_pct_msa_pctile":79,"income_diff_msa_pctile":17,"fico_score":643.52,"past_due_rate":0.1358,"mortgage_delinq_rate":0.1190,"education_msa_pctile":21,"occupancy":0.9394,"hhi_median":108907},
{"entity":"Fuquay-Varina","comp_inventory":2,"net_pct_msa_pctile":92,"income_diff_msa_pctile":83,"fico_score":729.00,"past_due_rate":0.0609,"mortgage_delinq_rate":0.0278,"education_msa_pctile":50,"occupancy":0.9254,"hhi_median":156534},
{"entity":"Raleigh - Northeast","comp_inventory":17,"net_pct_msa_pctile":25,"income_diff_msa_pctile":21,"fico_score":670.77,"past_due_rate":0.1232,"mortgage_delinq_rate":0.0524,"education_msa_pctile":38,"occupancy":0.9006,"hhi_median":99194},
{"entity":"Raleigh - Southwest","comp_inventory":4,"net_pct_msa_pctile":42,"income_diff_msa_pctile":92,"fico_score":738.99,"past_due_rate":0.0579,"mortgage_delinq_rate":0.0152,"education_msa_pctile":63,"occupancy":0.9579,"hhi_median":176998},
{"entity":"Wake Forest","comp_inventory":11,"net_pct_msa_pctile":63,"income_diff_msa_pctile":96,"fico_score":746.12,"past_due_rate":0.0537,"mortgage_delinq_rate":0.0243,"education_msa_pctile":67,"occupancy":0.9238,"hhi_median":190757},
{"entity":"Apex","comp_inventory":4,"net_pct_msa_pctile":54,"income_diff_msa_pctile":4,"fico_score":761.77,"past_due_rate":0.0355,"mortgage_delinq_rate":0.0143,"education_msa_pctile":88,"occupancy":0.9036,"hhi_median":217711},
{"entity":"Raleigh - Brier Creek","comp_inventory":8,"net_pct_msa_pctile":33,"income_diff_msa_pctile":58,"fico_score":744.63,"past_due_rate":0.0567,"mortgage_delinq_rate":0.0094,"education_msa_pctile":96,"occupancy":0.9576,"hhi_median":155920},
{"entity":"Clayton","comp_inventory":4,"net_pct_msa_pctile":83,"income_diff_msa_pctile":33,"fico_score":702.35,"past_due_rate":0.0717,"mortgage_delinq_rate":0.0510,"education_msa_pctile":29,"occupancy":0.9464,"hhi_median":131627},
{"entity":"Holly Springs","comp_inventory":2,"net_pct_msa_pctile":58,"income_diff_msa_pctile":25,"fico_score":754.09,"past_due_rate":0.0407,"mortgage_delinq_rate":0.0205,"education_msa_pctile":83,"occupancy":0.9599,"hhi_median":241997},
{"entity":"Garner","comp_inventory":5,"net_pct_msa_pctile":50,"income_diff_msa_pctile":50,"fico_score":712.05,"past_due_rate":0.0755,"mortgage_delinq_rate":0.0349,"education_msa_pctile":46,"occupancy":0.9444,"hhi_median":144846},
{"entity":"Raleigh - North","comp_inventory":12,"net_pct_msa_pctile":46,"income_diff_msa_pctile":79,"fico_score":750.65,"past_due_rate":0.0569,"mortgage_delinq_rate":0.0133,"education_msa_pctile":79,"occupancy":0.9333,"hhi_median":144376},
{"entity":"Raleigh - University","comp_inventory":6,"net_pct_msa_pctile":0,"income_diff_msa_pctile":54,"fico_score":710.37,"past_due_rate":0.0830,"mortgage_delinq_rate":0.0144,"education_msa_pctile":54,"occupancy":0.951,"hhi_median":81754}
]
cd /vercel/sandbox && python skills/multi-entity-analysis/scripts/cross_check.py \ --check composite --components net_pct_msa_pctile,income_diff_msa_pctile,fico_score,past_due_rate,mortgage_delinq_rate,education_msa_pctile,occupancy \ --weights 0.25,0.15,0.20,-0.10,-0.10,0.10,0.10 analysis/records.json > analysis/composite_result.json cat analysis/composite_result.json | python -m json.tool 2>/dev/null || cat analysis/composite_result.json
cd /vercel/sandbox && for combo in "net_pct_msa_pctile:Fuquay-Varina" "income_diff_msa_pctile:Wake Forest" "fico_score:Apex" "past_due_rate:Apex"; do
field="${combo%%:*}"; claim="${combo##*:}";
op="max"
if [ "$field" = "past_due_rate" ]; then op="min"; fi
python skills/multi-entity-analysis/scripts/cross_check.py --check extremum --field "$field" --direction $op --claim "$claim" analysis/records.json
donecaprate_q = [
("2Q26",0.0507),("1Q26",0.0507),("4Q25",0.0507),("3Q25",0.0507),("2Q25",0.0507),("1Q25",0.0507),
("4Q24",0.0507),("3Q24",0.0506),("2Q24",0.0521),("1Q24",0.0546),("4Q23",0.0545),("3Q23",0.0581),
("2Q23",0.0517),("1Q23",0.0517),("4Q22",0.0501),("3Q22",0.0425),("2Q22",0.0416),("1Q22",0.0385),
]
vals = [v for _,v in caprate_q]
current = vals[0]
peak = max(vals)
trough = min(vals)
avg_5yr = sum(vals)/len(vals)
print(f"Current MF cap rate (2Q26): {current:.2%}")
print(f"5-yr range: {trough:.2%} - {peak:.2%}, avg {avg_5yr:.2%}")
print(f"Change from cycle-low (1Q22): {(current-trough)*100:.0f} bps expansion")
print(f"Change from cycle-peak (3Q23): {(current-peak)*100:.0f} bps compression since peak")
print(f"Flat for trailing {sum(1 for v in vals[:7] if v==current)} consecutive quarters at {current:.2%}")
# supply pipeline
mf_permit_t12 = 6857
mf_permit_t13_t24 = 6246
pct_chg = (mf_permit_t12-mf_permit_t13_t24)/mf_permit_t13_t24
print(f"\nMF permits T12: {mf_permit_t12:,} vs T13-24: {mf_permit_t13_t24:,} = {pct_chg:+.1%} YoY pipeline acceleration")
under_construction = 7342
deliveries_ytd = 1425
net_absorption = 2204
vacancy = 0.095
print(f"Under construction: {under_construction:,} units; vacancy {vacancy:.1%} (above the ~7% balanced band)")
print(f"YTD deliveries {deliveries_ytd:,} vs net absorption {net_absorption:,} -> absorption is outpacing YTD deliveries, but the {under_construction:,}-unit pipeline (~{under_construction/ (mf_permit_t12) :.1f}x trailing annual permit volume) still needs to clear over next 12-24mo")
cd /vercel/sandbox && python analysis/market_context.py
print(f"Change from cycle-low (1Q22): {(current-trough)*100:.0f} bps expansion")
print(f"Change from cycle-peak (3Q23): {(current-peak)*100:.0f} bps compression since peak")print(f"Change from cycle-low (1Q22): {(current-trough)*10000:.0f} bps expansion")
print(f"Change from cycle-peak (3Q23): {(peak-current)*10000:.0f} bps compression since peak")cd /vercel/sandbox && python analysis/market_context.py
cd /vercel/sandbox && python3 -c "
import json
d = json.load(open('analysis/composite_result.json'))
for r in d['ranked']:
print(r['entity'], r['score'])
"Now composing the deliverable.
Wake Forest, Raleigh-North, and the Cary/Morrisville–Brier Creek corridor screen as the strongest submarkets for institutional Class-A garden acquisition — Fuquay-Varina and Holly Springs show the hottest demand signal but too thin a comp set yet, while Raleigh-Northeast and Raleigh-South should be avoided on credit and cohort quality
| Submarket | Composite Score | 200-300 Unit Garden Class-A Inventory | Net Migration (MSA Pctile) | Income Cohort Quality (MSA Pctile) | Avg FICO | Education Attainment (MSA Pctile) | Occupancy |
|---|---|---|---|---|---|---|---|
| Recommended Tier | |||||||
| 60.8 | 212 | 92 | 83 | 729 | 50 | 92.5% | |
| 60.0 | 11 | 63 | 96 | 746 | 67 | 92.4% | |
| 58.0 | 2 | 58 | 25 | 754 | 83 | 96.0% | |
| 57.8 | 12 | 46 | 79 | 751 | 79 | 93.3% | |
| 57.7 | 4 | 42 | 92 | 739 | 63 | 95.8% | |
| 56.1 | 8 | 33 | 58 | 745 | 96 | 95.8% | |
| Watch Tier | |||||||
| 55.8 | 16 | 38 | 42 | 759 | 92 | 93.3% | |
| 53.6 | 4 | 54 | 4 | 762 | 88 | 90.4% | |
| 51.4 | 12 | 17 | 63 | 742 | 100 | 92.7% | |
| 51.1 | 4 | 83 | 33 | 702 | 29 | 94.6% | |
| 49.3 | 5 | 50 | 50 | 712 | 46 | 94.4% | |
| 48.7 | 3 | 75 | 75 | 683 | 33 | 93.4% | |
| 42.7 | 6 | 0 | 54 | 710 | 54 | 95.1% | |
| 35.9 | 2 | 79 | 17 | 644 | 21 | 93.9% | |
| 32.4 | 17 | 25 | 21 | 671 | 38 | 90.1% | |
| 28.8 | 3 | 67 | 0 | 648 | 4 | 85.3% | |
The scorecard is built to your stated priorities — net migration, the wealth/income quality of who's moving in versus out, and household credit health — with occupancy and education as secondary tenant-durability checks. Migration and cohort quality carry the heaviest weight (40% combined); FICO another 20%; delinquency, education, and occupancy round out the rest.
Wake Forest and the Raleigh-North/Brier Creek/Cary-Morrisville corridor are the cleanest fit. Wake Forest posts the single strongest migration cohort-quality read in the market — its inbound households earn a median $11,165 more than departing ones, the highest income differential of any submarket screened — alongside a 746 average FICO and top-quartile education attainment . Raleigh-North, Raleigh-Southwest, and Raleigh-Brier Creek all cluster just behind it on the composite, each combining sub-6% mortgage delinquency with FICOs in the 740s and net-migration running above the MSA median . Clay-Morrisville (Cary/Morrisville) carries the deepest existing bench of comparable Class-A garden assets — 16 of the 114 qualifying 200-300 unit garden communities in the MSA sit here — though its net migration is only about average for the metro, reflecting a submarket that's largely built out rather than still filling in .
Fuquay-Varina posts the highest composite score in the market, but the underlying comp set is thin. Its net migration ranks in the 92nd MSA percentile — the highest of any submarket screened — with a well-above-average inbound income cohort, but only two qualifying 200-300 unit Class-A garden assets exist there today . That's a real signal worth tracking, not yet a deep enough transaction set to underwrite repeat institutional activity or lean on for exit comps. Holly Springs reads similarly: strong household wealth (net worth tier far above the MSA average) and a 754 average FICO, but the same two-comp inventory constraint .
Raleigh-Northeast, Raleigh-South, and Raleigh-Southeast should be avoided. Raleigh-Northeast actually holds the largest stock of matching product (17 comparable communities) but the weakest composite score of any submarket screened — FICO in the low 670s, a 12.3% past-due rate, and cohort quality in the bottom quartile . Raleigh-South and Raleigh-Southeast combine sub-650 average FICO with outbound migrants who earn meaningfully more than inbound ones — the resident base is downgrading, not upgrading.
Cap rates and the supply pipeline are the two factors that cut across every submarket on this list. MSA multifamily cap rates have sat flat at 5.07% for seven straight quarters, 74 bps in from the 3Q23 post-hike peak of 5.81% but still 122 bps wide of the 2022 trough — pricing has stabilized, which is a reasonable entry point for a stabilized-hold thesis, not a cheap one. The bigger swing factor is supply: 7,342 multifamily units are under construction against trailing-12-month permits that just accelerated 9.8% year-over-year, and MSA vacancy sits at 9.5% — above the balanced 5–7% band . Net absorption (2,204 units) is outrunning year-to-date deliveries (1,425), so demand is currently absorbing supply, but the pipeline is roughly 1.1x trailing annual permit volume and will keep testing rent growth through 2027. None of the recommended submarkets are immune — Wake Forest, Raleigh-North, and Brier Creek have all seen active recent construction (2023–2025 vintage product dominates their qualifying comp sets), so underwrite rent growth conservatively through the next 12–18 months of lease-up competition.
Employer concentration is a market-level risk, not a submarket-level one. Raleigh-Durham's job base skews toward Research Triangle Park tech/biotech, state government (Raleigh), and the university systems (Duke, UNC, NC State) — a durable but not fully diversified base. A slowdown in any one of those clusters would touch demand across every submarket screened here roughly equally, since none of the top picks reads as a single-employer town; it argues for sizing the position to the market's overall cyclicality rather than differentiating between these submarkets on that basis.
Bottom line: for a 200–300 unit stabilized Class-A garden acquisition, underwrite first in Wake Forest and Raleigh-North, with Clay-Morrisville and Raleigh-Brier Creek as the deep-liquidity fallback given their larger comp stock. Track Fuquay-Varina and Holly Springs for the next cycle as their institutional inventory catches up to their demand fundamentals. Cap rates are fairly priced relative to their own five-year range, but the 7,300-unit construction pipeline is the number to watch before locking in a rent-growth assumption.
This is a read-only snapshot of a RealAI analysis.