Build a U.S. Housing Affordability Index in Python
Housing affordability can look simple at first. Compare a home price with household income and you have a quick ratio. Yet that misses one of the biggest costs a buyer faces: the mortgage rate. A home can become much…
Meta description: Build a U.S. housing affordability index in Python with Census and FRED data. Compare states, test mortgage rates, and create interactive Plotly charts.
Suggested slug:
us-housing-affordability-index-pythonArticle summary
Housing affordability can look simple at first. Compare a home price with household income and you have a quick ratio. Yet that misses one of the biggest costs a buyer faces: the mortgage rate. A home can become much harder to afford even when its price barely changes, simply because the monthly payment rises.
This guide shows how to build a housing affordability index Python workflow with public U.S. data. We combine Census income and housing values with FRED home price and mortgage rate series. Then we calculate a payment based score, compare states and Census regions, test different interest rates, and build interactive Plotly charts.
The goal is not to copy an official index. It is to build a clear research tool that you can inspect, change, and explain. A score of 100 means the median household income exactly meets the income needed under our assumptions. A score above 100 means the modeled home is easier to carry. A score below 100 means the modeled payment needs more income than the median household has.
What a Housing Affordability Index Measures
A useful affordability index should connect three things: the price of housing, the income available to pay for it, and the financing cost. A simple home price to income ratio covers the first two. A payment based index adds the mortgage rate, so it reacts when borrowing costs change.
For this article, the base case assumes a 20 percent down payment, a 30 year fixed mortgage, and a principal and interest payment limit equal to 25 percent of annual household income. Property taxes, insurance, maintenance, closing costs, credit scores, and other debts are not included in the core score. Those items matter in real life, so we treat the index as a research model rather than a loan approval tool.
The score has an easy reading. At 100, median income is exactly enough under the model. At 120, median income is about 20 percent above the qualifying level. At 80, median income is about 20 percent below that level. This makes the result easier to explain than a raw monthly payment alone.
The Data We Need from Census and FRED
The national trend uses three FRED series. MSPUS gives the median sales price of new houses sold in the United States. MORTGAGE30US gives the average 30 year fixed mortgage rate from Freddie Mac. MEHOINUSA646N gives median household income in current dollars from the U.S. Census Bureau.
The state comparison uses the 2024 American Community Survey 1 year estimates. Table B19013 provides median household income. Table B25077 provides the median value of owner occupied housing units. These variables let us compare income and housing value across all 50 states and the District of Columbia with one consistent ACS vintage.
There is an important data rule here. The national home price series measures new houses sold. The ACS state measure is the value of owner occupied homes. They are not the same housing concept. Use the national model to study the national trend. Use the ACS model to compare places in the same year. Do not treat the national score and a state score as if they came from one identical price measure.
When this article was prepared on August 20, 2026, FRED already had newer mortgage and home price observations. The income series used here ended in 2024. To avoid mixing incomplete years, the national analysis stops at 2024, which is the latest complete common year for all three inputs. The latest weekly mortgage observation visible at that time was 6.67 percent for August 13, 2026.
How the Affordability Formula Works
Start with the median home price. With a 20 percent down payment, the loan balance is 80 percent of that price. Next, calculate the monthly principal and interest payment for a 30 year mortgage at the chosen rate.
Turn that monthly payment into an annual payment by multiplying by 12. If principal and interest can use 25 percent of income, divide the annual payment by 0.25 to get the qualifying income. Finally, divide actual median household income by qualifying income and multiply by 100.
In plain form: Index = median household income ÷ qualifying income × 100. The model gets more affordable when income rises. It gets less affordable when home prices or mortgage rates rise. That direction is easy to test in Python.
Load and Clean the Data in Python
You only need a few common Python packages. Pandas handles time series and tables. NumPy helps with calculations. Requests is useful for the Census API. Plotly creates interactive charts that work well in a browser.
FRED provides simple CSV download links, so the national data can be loaded without a separate Python package. The Census API now requires an API key. The state code below leaves a clear placeholder for your own key.
Install the packages:
pip install pandas numpy requests plotly
Load the three FRED series:
import pandas as pd
def load_fred(series_id):
url = f"https://fred.stlouisfed.org/graph/fredgraph.csv?id={series_id}"
df = pd.read_csv(url)
df.columns = ["date", series_id]
df["date"] = pd.to_datetime(df["date"])
df[series_id] = pd.to_numeric(df[series_id], errors="coerce")
return df.set_index("date")
price = load_fred("MSPUS")
rate = load_fred("MORTGAGE30US")
income = load_fred("MEHOINUSA646N")
Define the mortgage payment and affordability functions:
def monthly_payment(home_price, annual_rate, down_payment=0.20, years=30):
loan = home_price * (1 - down_payment)
monthly_rate = annual_rate / 100 / 12
months = years * 12
return loan * monthly_rate * (1 + monthly_rate) ** months / ((1 + monthly_rate) ** months - 1)
def affordability_score(home_price, income, annual_rate, payment_share=0.25):
payment = monthly_payment(home_price, annual_rate)
annual_payment = payment * 12
qualifying_income = annual_payment / payment_share
return income / qualifying_income * 100
Align Income, Home Price, and Mortgage Rate Data
Frequency alignment matters. MSPUS is quarterly. MORTGAGE30US is weekly. Household income is annual. Comparing one random week with one annual income number would create noise that looks like insight.
A clean approach is to average the quarterly home price observations within each calendar year, average the weekly mortgage rates within each calendar year, and keep the annual income observation for that year. Then join the three annual series and remove years that are missing any input.
This is why the complete national table in this article covers 2020 through 2024. The method keeps every row on the same calendar scale before the affordability formula is applied.
price_annual = price.resample("YE").mean().rename(columns={"MSPUS":"home_price"})
rate_annual = rate.resample("YE").mean().rename(columns={"MORTGAGE30US":"mortgage_rate"})
income_annual = income.resample("YE").last().rename(columns={"MEHOINUSA646N":"income"})
annual = price_annual.join(rate_annual).join(income_annual).dropna()
annual["payment"] = annual.apply(
lambda row: monthly_payment(row.home_price, row.mortgage_rate), axis=1
)
annual["affordability_index"] = annual.apply(
lambda row: affordability_score(row.home_price, row.income, row.mortgage_rate), axis=1
)
Calculate the U.S. Housing Affordability Index
The model shows a sharp change after the very low mortgage rate period. The national score was 126.2 in 2020 and 114.7 in 2021. It then fell to 80.4 in 2022 and 75.4 in 2023. In 2024 it improved to 80.5, but it remained well below the 100 threshold.
The reason is visible in the inputs. The average new home price rose from about $328,150 in 2020 to about $432,950 in 2022. At the same time, the average mortgage rate moved from 3.11 percent in 2020 to 5.34 percent in 2022, then to 6.81 percent in 2023. Median household income rose too, but not enough to offset the higher modeled payment.
In 2024, the average new home price eased to about $418,975, the average mortgage rate eased to 6.72 percent, and median household income rose to $83,730. Those changes lifted the score from 75.4 to 80.5. It was an improvement, but the modeled payment was still heavy relative to income.
| Year | Median new home price | Median household income | Mortgage rate | Monthly principal and interest | Affordability index |
|---|---|---|---|---|---|
| 2020 | $328,150 | $68,010 | 3.11% | $1,122 | 126.2 |
| 2021 | $383,000 | $70,780 | 2.96% | $1,285 | 114.7 |
| 2022 | $432,950 | $74,580 | 5.34% | $1,932 | 80.4 |
| 2023 | $426,525 | $80,610 | 6.81% | $2,227 | 75.4 |
| 2024 | $418,975 | $83,730 | 6.72% | $2,167 | 80.5 |
Plot the Index and Read the Trend
The first chart is the core story. Add a horizontal reference at 100 so the reader can see when the model moves from affordable to less affordable under the chosen assumptions. Good hover text should show the year, score, home price, income, mortgage rate, and monthly principal and interest payment.
The animated chart adds another layer. It sets each 2020 input to 100, then moves year by year through 2024. That makes the rate shock easy to see. Home prices and income both rose, but the mortgage rate index rose much faster. At the same time, the affordability score moved in the opposite direction.
Animation should add information, not decoration. A reader should learn something by pressing play. The static document includes the 2024 frame, while the HTML file contains the live animation.
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=annual.index.year,
y=annual["affordability_index"],
mode="lines+markers",
name="Affordability index",
))
fig.add_hline(y=100, line_dash="dot", annotation_text="Score of 100")
fig.update_layout(
title="U.S. housing affordability index",
xaxis_title="Year",
yaxis_title="Index",
)
fig.show()
Interactive chart. Hover over each point to inspect the home price, income, mortgage rate, payment, and index.
Animated chart. Press play to move from 2020 through 2024. Each component starts at 100 in 2020.
Compare Housing Affordability by State
The state view uses 2024 ACS income and owner occupied home value data with one national mortgage rate assumption of 6.72 percent. That common rate helps isolate the effect of income and housing value across places. It does not claim that every borrower in every state received the same rate.
West Virginia has the highest modeled score at 143.4. Iowa follows at 133.8, then Mississippi at 127.7 and Kansas at 127.4. At the other end, Hawaii scores 46.3 and California scores 53.1. The District of Columbia scores 60.2, followed by Washington at 66.5 and Colorado at 68.1.
A high score does not mean every household in a state can easily buy a home. It means the statewide median income looks stronger relative to the modeled payment on the statewide median owner occupied value. Local markets can be very different inside the same state. A metro area, county, or neighborhood analysis can show a much wider spread.
Fetch 2024 ACS state data with your Census API key:
import requests
CENSUS_KEY = "YOUR_KEY"
url = "https://api.census.gov/data/2024/acs/acs1"
params = {
"get": "NAME,B19013_001E,B25077_001E",
"for": "state:*",
"key": CENSUS_KEY,
}
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
rows = response.json()
states = pd.DataFrame(rows[1:], columns=rows[0])
states = states.rename(columns={
"NAME": "state_name",
"B19013_001E": "median_household_income",
"B25077_001E": "median_home_value",
})
for col in ["median_household_income", "median_home_value"]:
states[col] = pd.to_numeric(states[col], errors="coerce")
assumed_rate = 6.72
states["payment"] = states["median_home_value"].apply(
lambda value: monthly_payment(value, assumed_rate)
)
states["affordability_index"] = states.apply(
lambda row: affordability_score(
row.median_home_value, row.median_household_income, assumed_rate
),
axis=1,
)
states = states.sort_values("affordability_index", ascending=False)
| Rank | State | Median household income | Median home value | Assumed mortgage rate | Estimated monthly payment | Affordability index |
|---|---|---|---|---|---|---|
| 1 | West Virginia | $60,798 | $170,800 | 6.72% | $884 | 143.4 |
| 2 | Iowa | $75,501 | $227,300 | 6.72% | $1,176 | 133.8 |
| 3 | Mississippi | $59,127 | $186,500 | 6.72% | $965 | 127.7 |
| 4 | Kansas | $75,514 | $238,700 | 6.72% | $1,235 | 127.4 |
| 5 | Ohio | $72,212 | $239,800 | 6.72% | $1,240 | 121.3 |
| 6 | Oklahoma | $66,148 | $222,100 | 6.72% | $1,149 | 119.9 |
| 7 | Illinois | $83,211 | $280,700 | 6.72% | $1,452 | 119.4 |
| 8 | Indiana | $71,959 | $243,500 | 6.72% | $1,260 | 119.0 |
| 9 | North Dakota | $77,871 | $266,100 | 6.72% | $1,376 | 117.9 |
| 10 | Nebraska | $76,376 | $263,100 | 6.72% | $1,361 | 116.9 |
| 42 | Nevada | $81,134 | $455,500 | 6.72% | $2,356 | 71.7 |
| 43 | Utah | $96,658 | $545,200 | 6.72% | $2,820 | 71.4 |
| 44 | Montana | $75,340 | $425,400 | 6.72% | $2,201 | 71.3 |
| 45 | Massachusetts | $104,828 | $607,400 | 6.72% | $3,142 | 69.5 |
| 46 | Oregon | $85,220 | $497,500 | 6.72% | $2,573 | 69.0 |
| 47 | Colorado | $97,113 | $574,600 | 6.72% | $2,972 | 68.1 |
| 48 | Washington | $99,389 | $602,200 | 6.72% | $3,115 | 66.5 |
| 49 | District of Columbia | $109,707 | $733,400 | 6.72% | $3,794 | 60.2 |
| 50 | California | $100,149 | $759,500 | 6.72% | $3,929 | 53.1 |
| 51 | Hawaii | $100,745 | $875,900 | 6.72% | $4,531 | 46.3 |
What the U.S. Regions Show
The regional pattern is one of the strongest findings in the 2024 state data. The Midwest has a median state score of 117.4. All 12 Midwest states in this model score at or above 100. The South has a median of 97.3, with 8 of 17 state and District of Columbia scores at or above 100.
The Northeast has a median state score of 87.6, with only one of its nine states at or above 100. The West has the lowest regional median at 71.4. Only one of its 13 states reaches 100 in this model.
This gap mainly reflects the large difference in home values relative to household income. Regional supply limits, land costs, local demand, construction patterns, taxes, and job markets can all shape those values. The index does not tell us which factor caused the gap. It tells us where the payment pressure looks higher under a common set of financing assumptions.
| Region | Median state score | Scores at or above 100 | Jurisdictions |
|---|---|---|---|
| Midwest | 117.4 | 12 | 12 |
| Northeast | 87.6 | 1 | 9 |
| South | 97.3 | 8 | 17 |
| West | 71.4 | 1 | 13 |
What Changes Housing Affordability the Most
Home Prices
A higher home price increases the loan balance. That pushes up the monthly payment even when the mortgage rate stays fixed. In markets where home values move faster than household income, the affordability score usually falls.
This is why the state table is useful. It shows that a high income does not always create a high score. California and Hawaii have household incomes above many states, but their home values are so high that the modeled payment still dominates the result.
Household Income
Income works in the other direction. When median household income rises while the modeled payment stays stable, the score improves. The national result in 2024 is a good example. Income rose, while the average new home price and mortgage rate both eased a little, so the score recovered from its 2023 low.
Income also helps explain why two states with similar home values can have different scores. A place with stronger median income can support the same modeled payment with less strain.
Mortgage Rates
Mortgage rates can change affordability quickly because they affect the payment on the full loan balance. In the 2024 national sensitivity test, a 3 percent rate produces a score of 123.4. At 5 percent, the score falls to 97.0. At 7 percent, it falls to 78.2. At 8 percent, it reaches 70.9.
This is a key reason a price to income ratio is not enough for a buyer focused analysis. The home price and income can stay exactly the same while the monthly payment changes by hundreds of dollars as the rate moves.
| Mortgage rate | Monthly payment | Affordability index |
|---|---|---|
| 3% | $1,413 | 123.4 |
| 4% | $1,600 | 109.0 |
| 5% | $1,799 | 96.9 |
| 6% | $2,010 | 86.8 |
| 7% | $2,230 | 78.2 |
| 8% | $2,459 | 70.9 |
Regional Housing Supply and Local Conditions
Housing supply changes how quickly prices respond to demand. Places with tight land rules, expensive construction, limited buildable land, or strong population and job growth may see more price pressure. Other markets may have more room to add homes or may face weaker demand.
A national index cannot capture every local rule or constraint. A state index is better, but it is still broad. The best extension is to repeat the same method for metro areas or counties, then add local variables such as permits, rent, property taxes, insurance costs, and employment growth.
Economic Effects of Low Housing Affordability
Low housing affordability can affect more than home buyers. When a larger share of income is needed for housing, households may have less room for saving, travel, education, child care, or other spending. That can change local consumer demand.
High housing costs can also shape where people live and work. Workers may move farther from job centers, delay a move, share housing, or stay in a smaller home. Employers in expensive markets can face pressure to raise pay or expand remote work options. These are possible channels, not automatic outcomes in every market.
Affordability can also affect construction and policy choices. Strong prices may support new building, but high financing and construction costs can make projects harder to complete. Local governments may respond with zoning changes, infrastructure investment, tax programs, or housing subsidies. The right policy depends on the local cause of the problem, which is why the index should be treated as a starting signal rather than a final diagnosis.
Limits of This Index
Every affordability index hides choices. This model assumes a 20 percent down payment, a 30 year mortgage, and a principal and interest limit of 25 percent of income. A buyer with a smaller down payment will borrow more. A buyer with a different loan term or rate will get a different payment.
The model also leaves out property taxes, homeowners insurance, mortgage insurance, maintenance, closing costs, homeowner association fees, credit access, household debt, household size, and local differences inside each state. In some markets, taxes or insurance can change the total monthly cost by a large amount.
There is also a data concept limit. The national price series covers new houses sold, while the ACS state series measures owner occupied home values. That is why the two outputs should be used for different questions. Finally, the index is custom research code. It is not an official U.S. government housing affordability index and it should not be used as underwriting advice.
- Down payment choice
- Property taxes and insurance
- Maintenance and closing costs
- Credit access and other debts
- Household size
- Local variation inside states
- Different national and state housing price concepts
How to Extend the Model
The next step is to make the assumptions more realistic for your question. Add property taxes and insurance for a total housing payment. Test a 10 percent down payment. Change the payment threshold from 25 percent to 30 percent. Add rent data to compare buying and renting. You can also bring in permits or housing inventory to study supply.
For regional work, fetch several ACS years and calculate state scores for each year with the mortgage rate for that same year. Then build a Plotly animation with year as the frame. If a state moves sharply, inspect the income, home value, and rate inputs before writing a story about the cause.
For a more advanced real estate affordability analysis Python project, use metro area data, add confidence intervals where available, and keep nominal and inflation adjusted series separate. The model becomes more valuable when every transformation is visible and reproducible.
Simple validation checks:
assert monthly_payment(300000, 7) > monthly_payment(300000, 4)
assert affordability_score(300000, 6, 90000) > affordability_score(300000, 6, 70000)
assert affordability_score(400000, 6, 80000) < affordability_score(300000, 6, 80000)
Frequently Asked Questions
What does a housing affordability index score of 100 mean?
In this custom model, 100 means median household income exactly equals the qualifying income needed for the modeled principal and interest payment. Above 100 is more affordable under the assumptions. Below 100 is less affordable.
Is this the official U.S. housing affordability index?
No. This is a custom educational and research index built from public Census and FRED data. Other organizations use different formulas, income measures, home prices, taxes, and qualifying rules.
Why use FRED housing data Python code instead of manual downloads?
Code makes the workflow repeatable. You can refresh the series, align dates, test assumptions, and rebuild charts with fewer manual steps. It also makes your methods easier to review.
Can I use Census housing data Python code for every state?
Yes. The ACS 1 year API supports state geography for the variables used here. The Census Data API now requires an API key, so the example includes a key placeholder. You can also adapt the function to other supported geographies.
Why do mortgage rates matter so much for affordability?
A mortgage rate changes the monthly cost of financing the loan balance. Even if price and income do not change, a higher rate can raise the payment enough to push the affordability score down.
Full 2024 State and District of Columbia Ranking
The full ranking below is searchable and sortable. Click a column header to sort. The score is a model output under the shared 2024 assumptions.
| Rank | State | Region | Median household income | Median home value | Estimated monthly payment | Affordability index |
|---|---|---|---|---|---|---|
| 1 | West Virginia | South | $60,798 | $170,800 | $884 | 143.4 |
| 2 | Iowa | Midwest | $75,501 | $227,300 | $1,176 | 133.8 |
| 3 | Mississippi | South | $59,127 | $186,500 | $965 | 127.7 |
| 4 | Kansas | Midwest | $75,514 | $238,700 | $1,235 | 127.4 |
| 5 | Ohio | Midwest | $72,212 | $239,800 | $1,240 | 121.3 |
| 6 | Oklahoma | South | $66,148 | $222,100 | $1,149 | 119.9 |
| 7 | Illinois | Midwest | $83,211 | $280,700 | $1,452 | 119.4 |
| 8 | Indiana | Midwest | $71,959 | $243,500 | $1,260 | 119.0 |
| 9 | North Dakota | Midwest | $77,871 | $266,100 | $1,376 | 117.9 |
| 10 | Nebraska | Midwest | $76,376 | $263,100 | $1,361 | 116.9 |
| 11 | Arkansas | South | $62,106 | $215,600 | $1,115 | 116.0 |
| 12 | Alabama | South | $66,659 | $233,300 | $1,207 | 115.1 |
| 13 | Kentucky | South | $64,526 | $226,000 | $1,169 | 115.0 |
| 14 | Michigan | Midwest | $72,389 | $254,200 | $1,315 | 114.7 |
| 15 | Missouri | Midwest | $71,589 | $254,400 | $1,316 | 113.3 |
| 16 | Pennsylvania | Northeast | $77,545 | $277,600 | $1,436 | 112.5 |
| 17 | Louisiana | South | $60,986 | $223,200 | $1,155 | 110.0 |
| 18 | South Dakota | Midwest | $76,881 | $289,600 | $1,498 | 106.9 |
| 19 | Wisconsin | Midwest | $77,488 | $294,700 | $1,524 | 105.9 |
| 20 | Texas | South | $79,721 | $313,200 | $1,620 | 102.5 |
| 21 | Alaska | West | $95,665 | $376,500 | $1,948 | 102.3 |
| 22 | Minnesota | Midwest | $87,117 | $344,600 | $1,783 | 101.8 |
| 23 | New Mexico | West | $67,816 | $279,900 | $1,448 | 97.6 |
| 24 | Connecticut | Northeast | $96,049 | $396,900 | $2,053 | 97.5 |
| 25 | South Carolina | South | $72,350 | $299,500 | $1,549 | 97.3 |
| 26 | Maryland | South | $102,905 | $436,300 | $2,257 | 95.0 |
| 27 | Delaware | South | $87,534 | $371,600 | $1,922 | 94.9 |
| 28 | Vermont | Northeast | $82,730 | $352,800 | $1,825 | 94.4 |
| 29 | Georgia | South | $79,991 | $343,300 | $1,776 | 93.8 |
| 30 | Virginia | South | $92,090 | $403,500 | $2,087 | 91.9 |
| 31 | Maine | Northeast | $76,442 | $341,900 | $1,769 | 90.0 |
| 32 | Wyoming | West | $75,532 | $339,500 | $1,756 | 89.6 |
| 33 | North Carolina | South | $73,958 | $333,000 | $1,723 | 89.4 |
| 34 | New Hampshire | Northeast | $99,782 | $458,800 | $2,373 | 87.6 |
| 35 | Tennessee | South | $71,997 | $332,600 | $1,720 | 87.2 |
| 36 | New Jersey | Northeast | $104,294 | $496,000 | $2,566 | 84.7 |
| 37 | Florida | South | $77,735 | $396,900 | $2,053 | 78.9 |
| 38 | Arizona | West | $81,486 | $426,000 | $2,204 | 77.0 |
| 39 | New York | Northeast | $85,820 | $449,800 | $2,327 | 76.8 |
| 40 | Rhode Island | Northeast | $83,504 | $455,700 | $2,357 | 73.8 |
| 41 | Idaho | West | $81,166 | $446,400 | $2,309 | 73.2 |
| 42 | Nevada | West | $81,134 | $455,500 | $2,356 | 71.7 |
| 43 | Utah | West | $96,658 | $545,200 | $2,820 | 71.4 |
| 44 | Montana | West | $75,340 | $425,400 | $2,201 | 71.3 |
| 45 | Massachusetts | Northeast | $104,828 | $607,400 | $3,142 | 69.5 |
| 46 | Oregon | West | $85,220 | $497,500 | $2,573 | 69.0 |
| 47 | Colorado | West | $97,113 | $574,600 | $2,972 | 68.1 |
| 48 | Washington | West | $99,389 | $602,200 | $3,115 | 66.5 |
| 49 | District of Columbia | South | $109,707 | $733,400 | $3,794 | 60.2 |
| 50 | California | West | $100,149 | $759,500 | $3,929 | 53.1 |
| 51 | Hawaii | West | $100,745 | $875,900 | $4,531 | 46.3 |
Conclusion
A housing affordability index is most useful when the reader can see how it was built. Prices tell part of the story. Income adds another part. Mortgage rates connect those two numbers to the payment a buyer may actually face.
This housing affordability index Python project shows why the national picture changed so sharply after 2021 and why U.S. regions look so different in the 2024 state data. The Midwest has the strongest median state score in this model, while the West has the weakest. Rate sensitivity also shows that financing costs can move the result even when price and income stay fixed.
Keep the model transparent. State every assumption. Match the time periods. Separate different housing concepts. Then use the index as a tool for questions, not as a claim that one number explains the whole housing market.
Suggested Internal Links
- How to use the FRED API with Python
- How to query the Census API with Python
- How to compare regional economic data in Python
Methodology Note
National results use annual averages of quarterly FRED MSPUS observations and weekly FRED MORTGAGE30US observations, joined to annual MEHOINUSA646N income data for 2020 through 2024. State results use 2024 ACS 1 year B19013 median household income and B25077 median owner occupied home value. The base model assumes 20 percent down, a 30 year fixed mortgage, a 25 percent principal and interest payment threshold, and a 6.72 percent mortgage rate for the 2024 state comparison. Figures are rounded for display. The index is a custom research measure, not an official government index.
Sources and Retrieval Date
Official sources below were checked on August 20, 2026. State table values use the 2024 ACS 1 year vintage.
- FRED, Median Sales Price of Houses Sold for the United States, MSPUS
- FRED, 30 Year Fixed Rate Mortgage Average in the United States, MORTGAGE30US
- FRED, Median Household Income in the United States, MEHOINUSA646N
- U.S. Census Bureau, 2024 ACS 1 year data release
- U.S. Census Bureau, ACS table B19013
- U.S. Census Bureau, ACS table B25077
- U.S. Census Bureau, Census Data API 2023 ACS examples and API key notice
Downloads
Files attached to this article for your reference.
