← Back to articles
Housing

Anatomy of the NAI: Nine Metrics, Open Data, No MLS Required

Anatomy of the NAI: Nine Metrics, Open Data, No MLS Required

A Correction

In our earlier article, "Why We Decided to Build an AI-First Development Company," we wrote:

"Five of these metrics are available from free, public data sources. The other four require MLS access or proprietary data."

That was wrong.

All nine metrics in the Nimble Attainability Index run on free, public data. No MLS feed. No proprietary database. No data vendor subscriptions. The confusion arose because early metric descriptions — "days on market by price band," "absorption by product type," "ADU and infill permit share" — sounded like they required MLS-level granularity. In practice, Redfin's Data Center publishes property-type-level absorption, sale-to-list ratios, and price drop data. Census ACS provides rent. Census Building Permits Survey provides permits by unit type. All public. All free.

We built a system that tells us when our assumptions are wrong. We should apply that same standard to our claims about the system. This article is the correction — and the complete technical reference we should have published first.

The Five Data Sources

Every number in the NAI traces back to one of five public sources.

| Source | What It Provides | Update Frequency | Granularity | Cost | |--------|-----------------|------------------|-------------|------| | Census ACS | Household income, gross rent, housing unit counts | Annual (5-year estimates, 12-18 month lag) | Census tract | Free | | Redfin Data Center | Median sale price, DOM, inventory, homes sold, sale-to-list, price drops, property type breakdown | Weekly/monthly | City, ZIP, property type | Free (S3 download) | | FRED | 30-year fixed mortgage rate (MORTGAGE30US) | Weekly | National | Free API | | HUD | FHA loan limits by county | Annual | County | Free | | Census BPS | Building permits by unit type | Monthly | County | Free |

Each source has limitations we accept and design around. Census income lags 12-18 months. Redfin coverage thins in small markets. FRED rates are national, not local. HUD limits are county-wide, not city-specific. The scoring degrades gracefully when data is incomplete, falling back to calibrated defaults rather than producing false precision.

The Anchor Calculation: Affordable Price

Before the nine metrics, you need to understand the number that anchors the heaviest-weighted component. The "affordable price" is the maximum home a median-income household can purchase under FHA assumptions.

The formula:

  1. Monthly housing budget = (Annual income x 30%) / 12
  2. Subtract property tax + insurance (estimated at 2% of home value annually)
  3. Remaining budget services the mortgage (30-year fixed at current rate)
  4. Solve for maximum loan using standard amortization
  5. Maximum price = Loan / 0.965 (reflecting FHA's 3.5% minimum down payment)

Where the assumptions come from:

  • 30% of gross income: FHA qualifying standard for total housing cost
  • 2% tax + insurance: National average property tax (~1.1%) plus homeowner's insurance (~0.5%) plus PMI (~0.4%)
  • 3.5% down: FHA minimum for credit scores >= 580

Worked example — Patterson, CA ($85K income, 6.8% rate):

  • Monthly budget: ($85,000 x 0.30) / 12 = $2,125
  • Mortgage payment factor at 6.8% (30-year): 0.00652
  • After tax/insurance allocation: ~$1,790/mo available for principal + interest
  • Maximum loan: $1,790 / 0.00652 = $274,500
  • Maximum price (3.5% down): $274,500 / 0.965 = $284,500

If the median sale price in Patterson is $467,000, the gap is $182,500 — the typical household needs 64% more purchasing power than they have.

Same formula, different income — Stockton, CA ($65K income, 6.8% rate):

  • Monthly budget: $1,625
  • After tax/insurance: ~$1,370/mo for P&I
  • Maximum loan: ~$210,100
  • Maximum price: ~$217,700

At a $520K median in Stockton, the gap widens to $302,300. Same formula, same rate, dramatically different outcome driven by income alone. This is why Income-Price Gap carries the heaviest weight.

The Nine Metrics

Each component scores 0-100, where higher means more attainable — better conditions for buyers. The weighted sum produces the final NAI score.

1. Income-Price Gap — 20% weight | STATIC

What it measures: Can the median household afford the median home?

Formula:

  • If median price <= affordable price: 100 (homes are within reach)
  • If median price >= 2x affordable price: 0 (completely out of reach)
  • Between: Score = 100 x (1 - (median price - affordable) / affordable)

Breakpoint logic: The 2x threshold represents the affordability cliff — when a household would need to double their income to qualify. Linear scaling between means every 1% of price overshoot costs 1 point.

Data source: Census ACS (income) + Redfin (price) + FRED (mortgage rate)

Classification: STATIC. Median income shifts 2-3% per year. This metric is a structural snapshot — it tells you the current state of affordability but barely moves quarter to quarter.

Worked example: Patterson — affordable price $284,500, median price $467,000. Score = 100 x (1 - (467,000 - 284,500) / 284,500) = 100 x (1 - 0.641) = 35.9


2. Supply Pressure — 15% weight | DYNAMIC

What it measures: How much inventory exists relative to the sales pace?

Formula:

  • = 6 months of supply: 100 (buyer's market)

  • <= 1 month of supply: 0 (extreme seller's market)
  • Between: Score = (months - 1) x 20

Breakpoint logic: The 6-month threshold comes from NAR's widely-cited definition of a balanced market (4-6 months). Each additional month of inventory adds 20 points of buyer leverage.

Data source: Redfin (months of supply)

Classification: DYNAMIC. Can swing from 2 to 8 months in a single quarter as listings accumulate or get absorbed. This is the metric that most directly captures turning points.

Worked example: Patterson at 8.4 months = 100 (capped). Manteca at 2.6 months = (2.6 - 1) x 20 = 32.


3. FHA Headroom — 10% weight | SEMI-STATIC

What it measures: How far below the FHA loan limit is the median sale price?

Formula:

  • Headroom = FHA limit - median price
  • If headroom >= $100K: 100 (ample room)
  • If headroom <= -$100K: 0 (priced out of FHA)
  • Between: Score = 50 + (headroom / $100K) x 50

Breakpoint logic: The +/-$100K range reflects FHA's practical significance. A $100K buffer means most homes in the market qualify for 3.5% down financing. A $100K overshoot means FHA is effectively unavailable for the typical purchase.

Data source: HUD (FHA limits, annual) + Redfin (median sale price)

Classification: SEMI-STATIC. FHA limits adjust once per year. Prices adjust monthly. The score moves when prices move, but the ceiling is fixed for 12 months at a time.

Worked example: San Joaquin County FHA limit $678,500, Stockton median $520K. Headroom = $158,500. Score = 50 + (158,500 / 100,000) x 50 = 100 (capped — ample headroom).


4. Absorption Rate — 10% weight | DYNAMIC

What it measures: What fraction of listed inventory sells each period?

Formula:

  • Rate = homes sold / active inventory
  • If rate <= 0.15: 100 (sluggish market — buyer leverage)
  • If rate >= 0.50: 0 (hot market — seller leverage)
  • Between: Score = 100 x (0.50 - rate) / 0.35

Breakpoint logic: An absorption rate of 0.15 means inventory would take 6.7 months to clear at the current pace — a buyer's market. At 0.50, inventory turns in 2 months — a frantic seller's market. The 0.35 range between them covers the full spectrum of normal market conditions.

Data source: Redfin (homes sold, inventory — available by property type: SFR, condo, townhouse)

Classification: DYNAMIC. Changes monthly with transaction volume and listing activity.

Worked example: 200 active listings, 50 sales. Rate = 0.25. Score = 100 x (0.50 - 0.25) / 0.35 = 71.4

Note: This is one of the metrics we previously attributed to MLS access. Redfin provides homes sold and inventory broken down by property type in their public Data Center downloads.


5. Rent-to-Price Ratio — 10% weight | SEMI-STATIC

What it measures: Is buying significantly more expensive than renting? (Gross rental yield proxy)

Formula:

  • Ratio = (monthly rent x 12) / median sale price
  • If ratio >= 8%: 100 (strong buy-vs-rent economics)
  • If ratio <= 3%: 0 (renting is dramatically cheaper)
  • Between: Score = (ratio - 0.03) x 2,000

Breakpoint logic: The 8% threshold comes from real estate investment analysis conventions. The informal "1% rule" (monthly rent = 1% of price = 12% annual yield) represents an aggressive investor target. We set the ceiling at 8% — achievable in working-class markets, rare in coastal metros. The 3% floor reflects markets where the rent-vs-buy calculus heavily favors renting, which suppresses owner-occupant demand.

Data source: Census ACS (median gross rent) + Redfin (median sale price)

Classification: SEMI-STATIC. Rents adjust slowly (annual lease renewal cycles). Prices adjust faster. The ratio moves, but it's not a rapid-fire signal.

Worked example: Patterson rent $1,800/mo, median price $467K. Ratio = ($1,800 x 12) / $467,000 = 4.6%. Score = (0.046 - 0.03) x 2,000 = 32


6. FHA Utilization — 5% weight | SEMI-STATIC

What it measures: What share of the market could qualify for FHA financing?

Formula:

  • Ratio = median price / FHA limit
  • If ratio <= 0.60: 100 (most sales qualify)
  • If ratio >= 1.20: 0 (very few qualify)
  • Between: Score = 100 x (1.20 - ratio) / 0.60

Breakpoint logic: When the median sits at 60% or less of the FHA cap, the vast majority of transactions fall under the limit — FHA is a broadly available financing path. At 120%, the median exceeds the cap and FHA serves only the bottom tail of the distribution.

Data source: HUD (FHA limits) + Redfin (median sale price)

Classification: SEMI-STATIC. Same inputs as FHA Headroom, measuring a different dimension (percentage qualifying vs. absolute dollar gap).

Why the lowest weight (5%): FHA Utilization is partially redundant with FHA Headroom. It's kept as a separate component because it captures a distribution effect — "what percentage qualifies" tells a different story than "how much room is there at the median." But the redundancy justifies a lower weight.

Worked example: Stockton $520K / FHA limit $678.5K = 76.6%. Score = 100 x (1.20 - 0.766) / 0.60 = 72.3


7. Pipeline — 10% weight | STATIC

What it measures: Is new housing supply being added to the market?

Formula:

  • Rate = (building permits, trailing 12 months) / (total housing units) x 1,000
  • If rate >= 15 per 1,000: 100 (strong pipeline)
  • If rate <= 2 per 1,000: 0 (stalled pipeline)
  • Between: Score = (rate - 2) x (100 / 13)

Breakpoint logic: A rate of 15 permits per 1,000 existing units represents aggressive new construction — roughly 1.5% housing stock growth annually. Below 2 per 1,000 (0.2% growth), the pipeline is essentially frozen. The 13-point range between them captures the full spectrum of construction activity.

Data source: Census Building Permits Survey (permits by county) + Census ACS (total housing units)

Classification: STATIC. Permits are a leading indicator — they tell you what's coming 12-18 months before it reaches the market. The number shifts slowly and signals structural trends, not monthly market swings.

Worked example: Stanislaus County — ~2,400 permits, ~180,000 housing units. Rate = (2,400 / 180,000) x 1,000 = 13.3. Score = (13.3 - 2) x (100 / 13) = 86.9


8. Market Health — 10% weight | DYNAMIC

What it measures: Are market conditions shifting in buyers' favor?

Formula (composite of two sub-scores):

Sale-to-list sub-score:

  • <= 0.95 (homes sell 5%+ below asking): 100
  • = 1.05 (homes sell 5%+ above asking): 0

  • Between: Score = (1.05 - sale-to-list) x 1,000

Price drops sub-score:

  • = 30% of listings have price drops: 100

  • <= 10% of listings have price drops: 0
  • Between: Score = (price_drops% - 10) x 5

Market Health = average of both sub-scores.

Breakpoint logic: When sale-to-list drops below 0.95 and 30%+ of listings have cuts, sellers are capitulating. When it exceeds 1.05 with few reductions, buyers are competing. The 0.95-1.05 range represents the normal negotiation band; the 10-30% price drop range represents the normal correction range.

Data source: Redfin (sale-to-list ratio, percentage of listings with price reductions)

Classification: DYNAMIC. Both sub-components update monthly and respond immediately to market shifts.

Worked example: Sale-to-list 0.98: sub-score = (1.05 - 0.98) x 1,000 = 70. Price drops at 25%: sub-score = (25 - 10) x 5 = 75. Market Health = (70 + 75) / 2 = 72.5

Note: This is another metric we previously said required MLS access. Redfin publishes both sale-to-list ratios and price drop percentages in their public data.


9. Price Momentum — 10% weight | DYNAMIC

What it measures: Which direction are prices moving, and how fast?

Formula:

  • YoY change = (current median - 12-month-ago median) / 12-month-ago median
  • If YoY <= -10%: 100 (significant deflation — improving attainability)
  • If YoY >= +15%: 0 (rapid appreciation — worsening attainability)
  • Between: Score = 100 x (0.15 - YoY) / 0.25

Breakpoint logic: A 10% annual decline is a major correction — it meaningfully improves purchasing power. A 15% annual increase is a boom that outpaces income growth and pushes homes further out of reach. The asymmetric range (10% down vs 15% up) reflects that prices tend to decline faster than they appreciate in correction cycles.

Data source: Redfin (current vs. 12-month-ago median sale price)

Classification: DYNAMIC. Updates monthly. Captures the rate of change — the derivative of affordability — rather than the current level.

Worked example: Median price rose from $450K to $467K. YoY = +3.8%. Score = 100 x (0.15 - 0.038) / 0.25 = 44.8 (neutral — slight appreciation but not alarming).


Why These Weights

We want to be direct about this: these weights are informed heuristics, not the output of machine learning optimization. Each weight reflects a judgment about how much that signal contributes to the overall attainability picture.

Income-Price Gap at 20% carries the heaviest weight because it's the most direct answer to the core question: can people afford what's being sold? If the gap is zero, the market is attainable by definition, regardless of other factors. The 30% DTI standard, the FHA down payment assumption, and the amortization math are established lending conventions — not our invention.

Supply Pressure at 15% is second because inventory dynamics are the primary mechanism through which markets self-correct. Rising supply is the leading edge of improving attainability. NAR's "balanced market" definition of 4-6 months of supply is the most widely-cited threshold in the industry.

The 10% cluster — FHA Headroom, Absorption, Rent-to-Price, Pipeline, Market Health, and Price Momentum — each provides a distinct lens on attainability. No single one dominates, and we don't yet have enough validated evidence to justify ranking them against each other. Equal weighting reflects honest uncertainty.

FHA Utilization at 5% gets the lowest weight because it's partially redundant with FHA Headroom. It measures the same relationship (price vs. FHA limit) from a different angle (percentage qualifying vs. dollar gap). We kept it because the distribution view adds information, but the overlap doesn't justify equal weighting.

Where the threshold numbers come from:

  • "6 months balanced market" — NAR's definition, standard across the industry
  • "30% DTI" — FHA qualifying standard, codified in HUD guidelines
  • "8% rent-to-price" — Real estate investment convention (the "1% rule" monthly = ~12% annual; 8% is a moderate threshold)
  • "+/-$100K FHA headroom" — Practical significance in FHA-dominant markets where typical transactions cluster within $100K of the median
  • "0.15-0.50 absorption range" — Corresponds to 2-7 months of turnover, spanning buyer's to seller's market conditions

We built these weights to describe current attainability conditions. When we backtested them against 14 years of historical data to test their predictive power, the results were humbling — and illuminating. Read the full analysis in Backtesting the NAI.

Static vs. Dynamic: The Key Insight

Not all metrics move at the same speed, and that matters more than we initially understood.

| Metric | Classification | Update Cadence | Rate of Change | |--------|---------------|----------------|----------------| | Income-Price Gap | Static | Annual (Census lag) | Income shifts 2-3%/year | | Pipeline | Static | Monthly (but signals lag 12-18 months) | Structural trend | | Supply Pressure | Dynamic | Monthly | Can 2x in a single quarter | | Absorption | Dynamic | Monthly | Responds immediately to demand shifts | | Market Health | Dynamic | Monthly | Sale-to-list and price drops swing with sentiment | | Price Momentum | Dynamic | Monthly | Captures direction of change | | FHA Headroom | Semi-static | Annual limit, monthly price | Moves when prices move | | Rent-to-Price | Semi-static | Annual rent, monthly price | Rents adjust on lease cycles | | FHA Utilization | Semi-static | Same inputs as Headroom | Tied to price movement |

Why this matters: When we backtested the NAI against 14 years of Redfin data, we found that static variables dominate descriptive accuracy — they tell you the structural state of a market right now. Dynamic variables dominate predictive accuracy — they tell you where the market is heading.

The original weights (income_gap at 20%) produced a 3-month predictive correlation of just 0.053 — essentially noise. When a grid search optimized for prediction, income_gap dropped to 5% and supply_pressure doubled to 30%. The correlation jumped to 0.317 — moderate and useful.

The practical implication: The current default weights are designed for the descriptive question: "Is this market attainable?" That's the right question for a builder evaluating a metro area. If you're asking the predictive question — "Will this market become more attainable in the next quarter?" — the dynamic metrics should carry more weight. Both questions are valid. They just require different configurations.

The system supports configurable weight sets for exactly this reason. The default weights run the public calculator. The optimized weights run internal forecasting. Both use the same nine metrics and the same data.

What We Actually Use (No MLS Required)

Here's what our earlier article attributed to MLS access, and where the data actually comes from:

| Original Claim | Actual Source | Available? | |----------------|--------------|------------| | "Days on market by price band" | Redfin provides DOM by property type (SFR, condo, townhouse) at city and ZIP level | Free, public | | "Absorption rate by product type" | Redfin provides homes_sold and inventory by property type | Free, public | | "Sale-to-list ratio + price reductions" | Redfin publishes both in their Data Center downloads | Free, public | | "Rent-to-price ratio" | Census ACS median gross rent + Redfin median sale price | Free, public |

The ninth metric in the original list — "ADU and infill permit share" — was aspirational. The implemented version is simpler: total building permits per 1,000 housing units from Census BPS. We don't currently segment by ADU vs. standard permits because Census BPS categorizes by unit count (1-unit, 2-unit, 3-4 unit, 5+ unit), not by ADU designation. The pipeline metric works without that distinction.

What MLS access would actually add:

We don't want to pretend public data is perfect. MLS access would improve precision in specific ways:

  • True transaction-level data — individual closed sales with exact prices, not metro-level medians. This enables price band analysis (DOM for homes $300-400K vs. $500-600K) that Redfin's property-type breakdown only approximates.
  • Agent remarks and condition assessments — qualitative signals (e.g., "seller motivated," "estate sale," "as-is condition") that no public dataset captures.
  • Concessions and closing cost data — the effective sale price after seller credits, which sale-to-list ratios don't reflect.
  • True active vs. pending vs. withdrawn status — more precise inventory counts than Redfin's aggregated figures.

MLS would improve precision. It's not required for the model to function. The current system is sufficient for market-level scoring (city, ZIP). MLS would enable property-level scoring — a different and more granular use case we may pursue in the future.

Getting More Granular: What's Already Possible

The NAI doesn't just score at the city level. The infrastructure supports progressively finer resolution using the same public data.

ZIP-level scoring is already implemented. The engine computes NAI scores for individual ZIP codes using Redfin ZIP-level data and Census tract-to-ZIP crosswalks (via HUD's publicly available mapping files). Within a single city, ZIP scores can vary by 20-30 points — Patterson's core ZIP may score differently than a peripheral ZIP with different income profiles and housing stock.

Census tract-level income and rent is already loaded in our database via ACS 5-year estimates. The engine uses population-weighted tract aggregation for city-level income, but the underlying data supports tract-level drill-down. A city scoring 45 might contain tracts scoring 65 (concentrated demand, lower prices) and tracts scoring 25 (higher prices, newer construction).

Property type breakdown is available through Redfin. Single-family detached, condos, townhouses, and multi-family each have separate median prices, DOM, inventory, and absorption data. The current NAI uses aggregate "All Residential" for scoring, but the property-type data feeds detailed reports that help identify which product type has the best attainability profile in a given market.

The granularity hierarchy:

| Level | Available Now? | Data Sources | Limitation | |-------|---------------|-------------|------------| | County | Yes | All 5 sources | Too coarse for acquisition decisions | | City | Yes (default) | Redfin, Census ACS (aggregated), BPS, HUD | Primary scoring level | | ZIP | Yes | Redfin ZIP data, Census tract-to-ZIP crosswalk | Thinner data in small ZIPs | | Census Tract | Partial | Census ACS (income, rent, housing stock) | No Redfin data at tract level | | Property | No | Would require MLS | Not implemented |

Each step toward finer granularity adds precision but increases data complexity and maintenance cost. For market selection (which city to invest in), city-level NAI is sufficient. For site selection (which neighborhood within a city), ZIP-level and tract-level drill-downs provide the next layer of resolution.

Try It

The Nimble Housing Attainability Calculator runs the same nine-metric engine described in this article, drawing from the same free public data sources. Enter any of our tracked metro areas to see the current NAI score, component breakdown, and comparison to neighboring markets.

For builders, lenders, and housing authorities interested in NAI data for additional markets, custom weight configurations, or API access — get in touch.

This article was verified against live data and the production scoring engine as of March 2026. Market numbers shift with conditions; the methodology and data sources described here are stable.


Sources and References

Data Sources (All Free, All Public)

Benchmarks Referenced

  • NAR Balanced Market Definition — 4-6 months of supply
  • FHA Qualifying Standards — 30% debt-to-income ratio, 3.5% minimum down payment
  • Real Estate Investment Conventions — Rent-to-price thresholds, absorption rate ranges

Related Nimble Articles