Major Purchases

1 Book Topics

  • Renting vs. buying: “renting is throwing money away” is a myth; unrecoverable costs of owning run ~5% of home value per year (Felix’s 5% Rule)
  • 5% Rule components: property tax (~1%) + maintenance (~1%) + cost of capital (~3%) = ~5%/year; divide by 12 to get monthly equivalent
  • When to buy: plan to stay 7+ years; stable income; won’t be “house poor” (housing <28–30% of gross income)
  • Mortgage amortization: early payments are mostly interest (~75–80% in year 1 on a 30-year loan); moving every 5 years means you’ve barely touched principal
  • Cars: depreciating assets; 20/4/10 rule (20% down, ≤4-year term, ≤10% gross income on transportation); buy used 2–4 years old

2 Rent vs. Buy Threshold (Felix’s 5% Rule)

Multiply home value by 5%, divide by 12. If you can rent an equivalent home for less, renting and investing the difference is likely the better financial choice.

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

The three components of the 5% rule on a $500,000 home

The three components of the 5% rule on a $500,000 home
show/hide
rent_buy_threshold <- function(home_value, unrecoverable_rate = 0.05) {
  (home_value * unrecoverable_rate) / 12
}

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

rent_buy_threshold(home_value=600000)
#> 2500.0

With home value in A2:

=(A2*0.05)/12

3 Monthly Mortgage Payment

The standard amortization formula; shorter terms mean higher payments but much less total interest.

Formula: M = P × [r(1 + r)^n] ÷ [(1 + r)^n − 1]

Monthly payment on a $400,000 loan at 6.5% across three terms

Monthly payment on a $400,000 loan at 6.5% across three terms
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)

mortgage_payment(principal=480000, annual_rate=0.06, years=30)
#> 2877.8425207332334

Use the built-in PMT() function: PMT(rate, nper, pv)

  • rate: monthly = 6%/12
  • nper: months = 30*12
  • pv: loan amount as negative = -480000
=PMT(6%/12, 30*12, -480000)

4 First-Month Interest vs. Principal Split

Early mortgage payments are mostly interest; only the remainder reduces the balance.

Formulas:

  • First-month interest = Principal × (annual rate ÷ 12)
  • First-month principal = Monthly Payment − First-month interest
#> Warning: Removed 2 rows containing missing values or values outside
#> the scale range (`geom_col()`).
#> Warning: Removed 1 row containing missing values or values outside
#> the scale range (`geom_text()`).

Interest vs. principal split at three points on a $400,000 / 6.5% / 30-yr mortgage

Interest vs. principal split at three points on a $400,000 / 6.5% / 30-yr mortgage
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      = round(payment, 2),
    interest     = round(interest, 2),
    principal    = round(payment - interest, 2),
    pct_interest = round((interest / payment) * 100, 1)
  )
}

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":      round(payment, 2),
        "interest":     round(interest, 2),
        "principal":    round(payment - interest, 2),
        "pct_interest": round((interest / payment) * 100, 1),
    }

first_payment_split(principal=480000, annual_rate=0.06, years=30)
#> {'payment': 2877.84, 'interest': 2400.0, 'principal': 477.84, 'pct_interest': 83.4}

With loan amount in A2, annual rate in B2, and monthly payment (from PMT()) in C2:

First-month interest:

=A2*(B2/12)

First-month principal:

=C2-A2*(B2/12)