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
show/hide
rent_buy_threshold <- function(home_value, unrecoverable_rate = 0.05) {
(home_value * unrecoverable_rate) / 12
}
rent_buy_threshold(home_value = 600000)
#> [1] 2500show/hide
def rent_buy_threshold(home_value, unrecoverable_rate=0.05):
return (home_value * unrecoverable_rate) / 12
rent_buy_threshold(home_value=600000)
#> 2500.0With home value in A2:
=(A2*0.05)/123 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]
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.843show/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.8425207332334Use the built-in PMT() function: PMT(rate, nper, pv)
rate: monthly =6%/12nper: months =30*12pv: 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()`).
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.4show/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)

