%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
HomeCosts("True Cost<br>of Ownership") --> Mortgage("Mortgage<br>Interest")
HomeCosts --> PropTax("Property Taxes<br>1% to 2% a year")
HomeCosts --> Maintenance("Maintenance<br>about 1% a year")
HomeCosts --> Insurance("Insurance")
HomeCosts --> Closing("Closing<br>Costs 3% to 5%")
HomeCosts --> Opportunity2("Return Given Up<br>on the Down Payment")
Mortgage --> UnrecovCost("Unrecoverable Costs<br>about 5% of home<br>value per year")
PropTax --> UnrecovCost
Maintenance --> UnrecovCost
Insurance --> UnrecovCost
Closing --> UnrecovCost
Opportunity2 --> UnrecovCost
style HomeCosts fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Mortgage fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style PropTax fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Maintenance fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Insurance fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Closing fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Opportunity2 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style UnrecovCost fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
16 Major Purchases
A house is where most people accidentally undo years of saving. The mechanics aren’t complicated; the discipline is.
If you just moved out, buying a home is probably years away: the typical first-time buyer in 2025 was 40 years old (NAR). The examples below use home prices common in many U.S. cities. Read this chapter now so you know what the decision involves, and so the next person who tells you renting is throwing money away doesn’t rush you. This chapter covers:
- Renting vs. buying
- The true cost of owning (the sticker price is the smallest piece)
- Monthly mortgage payments and how interest is front-loaded
16.1 Owning vs. Renting: The Most Debated Question
This is where Ben Felix’s research is especially useful. The conventional wisdom (“renting is throwing money away”) is one of the most persistent myths in personal finance.
The Real Math
Felix has produced extensive analysis showing that renting and investing the difference often matches or beats homeownership, once you account for the full cost of owning.
Felix’s “5% Rule”
A simplified version of Felix’s framework: the unrecoverable costs of owning are roughly 5% of the home’s value per year. Unrecoverable costs are money you spend and never get back, the same way rent is. They are property tax (about 1%), maintenance (about 1%), and the cost of capital (about 3%, which is the mortgage interest you pay plus the investment return you give up on the money tied up in the house). The math section below walks through the formula and the code.
Rule of thumb: Multiply the home’s value by 5% and divide by 12. If you can rent an equivalent property for less than that, renting and investing the difference is likely the better financial choice.
When Buying Makes Sense
Buying isn’t bad, but it should be a lifestyle decision more than a financial one. Buy when:
- You’re confident you’ll stay 7 years or more (it takes that long for the one-time costs of buying and selling to be spread thin)
- You have a stable income and adequate emergency fund
- You value the autonomy, stability, and control
- Homes near you are cheap compared to rents (the 5% rule below is a quick check)
- You won’t be “house poor” (housing costs should stay under 28% to 30% of gross income)
When Renting Makes Sense
- You may move within 5 to 7 years
- Your career requires geographic flexibility
- Local home prices are stretched relative to rents
- You’d rather invest the difference in a diversified portfolio
- You value flexibility, lower maintenance burden, and predictable costs
The key insight from Felix: renting is not “throwing money away” any more than buying groceries is throwing money away. You’re paying for shelter either way. The question is which form of shelter delivers better financial and lifestyle outcomes for your situation.
Putting the pieces together, here is how I’d walk through the decision:
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
Start(["Rent or buy?"]) --> Stay{"Will you stay<br>7 years or more?"}
Stay -->|"No"| RentFlex("Rent and keep<br>your flexibility")
Stay -->|"Yes"| Rule{"Is rent below the<br>5% rule figure?"}
Rule -->|"Yes"| RentInvest("Rent and invest<br>the difference")
Rule -->|"No"| Ready{"Stable income and<br>an emergency fund?"}
Ready -->|"Yes"| Buy("Buying can make<br>financial sense")
Ready -->|"No"| Build("Build your<br>cushion first")
style Start fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Stay fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Rule fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Ready fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style RentFlex fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style RentInvest fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Buy fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Build fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
Mortgage Amortization: The Front-Loaded Interest Reality
Mortgages are structured so you pay mostly interest in early years. This is called amortization: every payment is the same size, but the split between interest and principal (paying down the loan itself) shifts over time. Understanding this changes how you think about moving and refinancing (replacing your loan with a new one).
Key insight: On a 30-year mortgage at 6%, more than 80% of your first year’s payments go to interest, not principal.
Where payments go on a 30-year mortgage at 6%:
| Years | % to Interest | % to Principal |
|---|---|---|
| 1 to 5 | 78% to 83% | 17% to 22% |
| 6 to 15 | 59% to 78% | 22% to 41% |
| 16 to 25 | 26% to 59% | 41% to 74% |
| 26 to 30 | under 1% to 26% | 74% to almost 100% |
This is why moving every 5 years is so financially destructive: you’re essentially renting from the bank while paying ownership costs on top.
16.2 Math for Major Purchases
Big purchases are where small percentage differences turn into tens of thousands of dollars. Each calculation below is written as an R and Python function, following the same pattern introduced in the Budgeting chapter.
The Rent-vs-Buy 5% Rule
The 5% rule isn’t magic, it’s just the sum of three real costs that every homeowner pays whether they realize it or not. The chart splits those costs for a $500,000 home, about what a starter home costs in many U.S. cities.
Add the three percentage slices together and you get 5% of home value per year; divide by 12 to get the monthly ownership cost threshold.
Formula: Monthly cost of owning ≈ (Home Value × 0.05) ÷ 12
- Where: Home Value = what the home is worth, 0.05 = the 5% of that value you lose each year to property tax, maintenance, and the cost of capital, and 12 turns the yearly cost into a monthly one.
Example: a $500,000 home → (500,000 × 0.05) ÷ 12 = $2,083/month. If you can rent a similar place for less than $2,083/month, then you should choose to rent and invest the difference.
Check: add the three slices from the chart: $5,000 + $5,000 + $15,000 = $25,000 a year, and $25,000 ÷ 12 ≈ $2,083.
Assuming the home value is in A2 and the unrecoverable rate (0.05) is in B2:
=(A2*B2)/12The Python version of rent_buy_threshold() works the same way:
show/hide
def rent_buy_threshold(home_value, unrecoverable_rate=0.05):
return (home_value * unrecoverable_rate) / 12
# $500,000 home at the standard 5% unrecoverable rate
rent_buy_threshold(home_value=500000)
#> 2083.3333333333335In R, rent_buy_threshold() turns the 5% rule into a monthly rent figure.
show/hide
rent_buy_threshold <- function(home_value, unrecoverable_rate = 0.05) {
(home_value * unrecoverable_rate) / 12
}
# $500,000 home at the standard 5% unrecoverable rate
rent_buy_threshold(home_value = 500000)
#> [1] 2083.333The Monthly Mortgage Payment
This is the standard formula behind every mortgage calculator. The same loan produces very different monthly payments depending on how many months you spread it over.
The formula spreads the principal plus all future interest into equal monthly payments; shorter terms mean higher bars because more of the loan has to be paid off each month.
Formula: M = P × [ r(1 + r)^n ] ÷ [ (1 + r)^n − 1 ]
- Where: P = the loan principal, r = the monthly interest rate (annual ÷ 12), n = the total number of payments (years × 12).
Example: a $480,000 loan (a $600,000 home with 20% down) at 6% for 30 years → about $2,878/month.
Check: the payment must cover the first month’s interest, $480,000 × 0.005 = $2,400, and stay below $2,400 + ($480,000 ÷ 360) ≈ $3,733. $2,878 sits between the two.
Assuming the loan amount is in A2, the annual rate is in B2 (as a decimal), and the years are in C2:
=A2*((B2/12)*(1+B2/12)^(C2*12))/((1+B2/12)^(C2*12)-1)Excel’s built-in PMT() function does the same job (it returns a negative number because it treats the payment as money going out, so we flip the sign):
=-PMT(B2/12, C2*12, A2)The Python version of mortgage_payment() works the same way:
show/hide
def mortgage_payment(principal, annual_rate, years):
r = annual_rate / 12
n = years * 12
return principal * (r * (1 + r) ** n) / ((1 + r) ** n - 1)
# $480,000 loan at 6% over 30 years
mortgage_payment(principal=480000, annual_rate=0.06, years=30)
#> 2877.8425207332334In R, mortgage_payment() implements the amortization formula.
show/hide
mortgage_payment <- function(principal, annual_rate, years) {
r <- annual_rate / 12
n <- years * 12
principal * (r * (1 + r)^n) / ((1 + r)^n - 1)
}
# $480,000 loan at 6% over 30 years
mortgage_payment(principal = 480000, annual_rate = 0.06, years = 30)
#> [1] 2877.843Where the First Year’s Payments Go
Here is what front-loaded interest looks like in numbers: in month one your interest is simply the balance times the monthly rate, and only the rest reduces the principal. Early mortgage payments are mostly interest, which is why moving after a few years means you’ve barely touched the principal.
Each month’s interest is just the outstanding balance times the monthly rate; the principal is what’s left over after interest is paid.
Formula:
- First-month interest = Principal × (annual rate ÷ 12)
- First-month principal = Monthly Payment − First-month interest
- Where: Principal = the amount you still owe, annual rate ÷ 12 = the monthly interest rate, and Monthly Payment = the fixed payment from the formula above.
Example: on that $480,000 loan, month-one interest is $2,400 of the $2,878 payment, about 83% interest, leaving only $478 toward principal.
Check: add the two parts back together: $2,400 + $478 = $2,878, the full payment.
Assuming the loan amount is in A2, the annual rate is in B2, and the years are in C2, the monthly payment goes in D2:
=-PMT(B2/12, C2*12, A2)The first month’s interest goes in E2:
=A2*B2/12The principal portion goes in F2:
=D2-E2And the percent of the payment that is interest goes in G2 (format the cell as a Percentage):
=E2/D2The Python version of first_payment_split() works the same way:
show/hide
def first_payment_split(principal, annual_rate, years):
payment = mortgage_payment(principal, annual_rate, years)
interest = principal * (annual_rate / 12)
return {
"payment": payment,
"interest": interest,
"principal": payment - interest,
"pct_interest": (interest / payment) * 100,
}
# first payment on a $480,000 loan at 6% over 30 years
first_payment_split(principal=480000, annual_rate=0.06, years=30)
#> {'payment': 2877.8425207332334, 'interest': 2400.0, 'principal': 477.8425207332334, 'pct_interest': 83.39580719616701}In R, first_payment_split() shows how much of the first payment is interest and how much is principal.
show/hide
first_payment_split <- function(principal, annual_rate, years) {
payment <- mortgage_payment(principal, annual_rate, years)
interest <- principal * (annual_rate / 12)
data.frame(
payment = payment,
interest = interest,
principal = payment - interest,
pct_interest = (interest / payment) * 100
)
}
# first payment on a $480,000 loan at 6% over 30 years
first_payment_split(principal = 480000, annual_rate = 0.06, years = 30)
#> # A tibble: 1 × 4
#> payment interest principal pct_interest
#> <dbl> <dbl> <dbl> <dbl>
#> 1 2878. 2400 478. 83.416.3 Recap
- Renting isn’t throwing money away. You pay for shelter either way. The real question is which option leaves you better off for your situation.
- Use the 5% rule as a quick test. Multiply the home’s value by 5% and divide by 12. On a $500,000 home that’s about $2,083 a month. If you can rent a comparable place for less, renting and investing the difference usually wins.
- Owning costs more than the mortgage. Property tax, maintenance, and the return you give up on your down payment add up to roughly 5% of the home’s value each year.
- Early mortgage payments are mostly interest. In the first year, more than 80% of each payment goes to interest, which is why moving after a few years leaves you with barely any principal paid down.
- Buy for lifestyle reasons, not just math. Buy when you plan to stay 7 or more years, your income is stable, you have an emergency fund, and your housing costs stay under 28 to 30% of your gross income.
A house is the biggest purchase most people ever make, so run the numbers before you fall in love with a floor plan.





