16  Major Purchases


Houses, cars, and weddings are where most people accidentally undo years of saving. The mechanics aren’t complicated; the discipline is.

16.1 Owning vs. Renting: The Most Debated Question

This is where Ben Felix’s research is genuinely groundbreaking. 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.

%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "fontSize":"16px"}}}%%

flowchart TD
    HomeCosts[True Cost<br>of Ownership] --> Mortgage[Mortgage<br>Interest]
    HomeCosts --> PropTax[Property Taxes<br>1-2% annually]
    HomeCosts --> Maintenance[Maintenance<br>~1% annually]
    HomeCosts --> Insurance[Insurance]
    HomeCosts --> Closing[Closing<br>Costs 3-5%]
    HomeCosts --> Opportunity2[Down Payment<br>Opportunity Cost]

    Mortgage --> UnrecovCost[Unrecoverable Costs<br>~5% of home<br>value per year]
    PropTax --> UnrecovCost
    Maintenance --> UnrecovCost
    Insurance --> 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

Home Ownership

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 (property tax ~1%, maintenance ~1%, cost of capital ~3%).

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.

Example: $500,000 home × 5% = $25,000/year = ~$2,080/month. If you can rent the same place for less, renting wins financially.

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 (closing costs need time to amortize)
  • You have a stable income and adequate emergency fund
  • You value the autonomy, stability, and control
  • The local rent-to-price ratio favors buying
  • You won’t be “house poor” (housing costs should stay under 28-30% of gross income)

When Renting Makes Sense

  • You may move within 5-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.

The Rent vs. Buy Calculation (Felix’s 5% Rule)

This deserves its own line because it’s the most consequential housing decision most people make.

The 5% Rule (Ben Felix’s framework):

Annual unrecoverable cost of owning ≈ Home Value × 5%

Broken down:

  • Property tax: ~1%
  • Maintenance: ~1%
  • Cost of capital (opportunity cost of down payment + mortgage interest): ~3%

Decision math:

Monthly equivalent rent threshold = (Home Value × 0.05) ÷ 12

Example: $600,000 home → (600,000 × 0.05) ÷ 12 = $2,500/month

If you can rent the equivalent home for less than $2,500/month, renting is financially favorable (when you invest the difference). If rent exceeds that, buying tips ahead.

Mortgage Amortization: The Front-Loaded Interest Reality

Mortgages are structured so you pay mostly interest in early years. Understanding this changes how you think about moving and refinancing.

Key insight: On a 30-year mortgage at 6%, roughly 75% of your first year’s payments go to interest, not principal.

Rough breakdown of where payments go:

Years Approx. % to Interest Approx. % to Principal
1-5 70-80% 20-30%
6-15 50-70% 30-50%
16-25 25-50% 50-75%
26-30 5-25% 75-95%

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

Felix’s rule estimates the annual unrecoverable cost of owning as about 5% of the home’s value, then compares the monthly equivalent to your rent.

Formula: Monthly cost of owning ≈ (Home Value × 0.05) ÷ 12

Example: a $600,000 home → (600,000 × 0.05) ÷ 12 = $2,500/month. Rent below that, and renting-and-investing-the-difference tends to win.

show/hide
rent_buy_threshold <- function(home_value, unrecoverable_rate = 0.05) {
  (home_value * unrecoverable_rate) / 12
}

# $600,000 home at the standard 5% unrecoverable rate
rent_buy_threshold(home_value = 600000)
#> [1] 2500
show/hide
def rent_buy_threshold(home_value, unrecoverable_rate=0.05):
    return (home_value * unrecoverable_rate) / 12

# $600,000 home at the standard 5% unrecoverable rate
rent_buy_threshold(home_value=600000)
#> 2500.0

The Monthly Mortgage Payment

This is the standard amortization formula behind every mortgage calculator.

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 → ~$2,878/month.

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.843
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.8425207332334

Where the First Year’s Payments Go

The front-loaded-interest reality, in numbers: in month one your interest is simply the balance times the monthly rate, and only the rest reduces the principal.

Formula:

  • First-month interest = Principal × (annual rate ÷ 12)
  • First-month principal = Monthly Payment − First-month interest

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.

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.4
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}