Major Purchases
Each topic starts with a real scenario and a bar model, then three levels of exercises. Level 1 (Guided) fills in the blanks of a finished function. Level 2 (Practice) applies it to new numbers. Level 3 (Challenge) asks a new question with little scaffolding. The R and Python exercises run in your browser: click Run Code to try, Submit Answer to check, and use the hint or solution if you get stuck. Excel exercises have a solution you can reveal.
1 Book Topics
- Renting vs. buying: “renting is throwing money away” is a myth; you pay for shelter either way, and Ben Felix’s research shows renting and investing the difference often matches or beats owning
- True cost of owning: mortgage interest, property tax (1% to 2%), maintenance (about 1%), insurance, closing costs (3% to 5%), and the opportunity cost of the down payment
- Felix’s 5% rule: unrecoverable costs run about 5% of home value per year (property tax ~1% + maintenance ~1% + cost of capital ~3%); divide by 12 and compare to rent
- When to buy or rent: buy if you’ll stay 7+ years, have stable income and an emergency fund, and keep housing under 28% to 30% of gross income; rent if you may move within 5 to 7 years or need flexibility; a decision flowchart ties it together
- Front loaded interest: on a 30 year mortgage at 6%, more than 80% of the first year’s payments go to interest, so moving every 5 years means barely touching principal
2 The Rent-vs-Buy 5% Rule
The 5% rule adds up three costs every owner pays and never gets back. Divide by 12 and you have a monthly rent to compare against.
Formula: Monthly cost of owning ≈ (Home Value × 0.05) ÷ 12
Example: a $500,000 home → (500,000 × 0.05) ÷ 12 = $2,083 a month. Rent below that, and renting and investing the difference tends to win.
How to read this result: the threshold is the rent at which renting and owning cost about the same. It’s a quick filter, not a final answer; your plans to stay and your local rents still matter.
2.1 Level 1: Guided
Fill in the blanks to finish rent_buy_threshold(), then find the 5% rule’s monthly cost of owning a $500,000 home.
Put the home value in A2 (500000) and the rate in B2 (0.05). Find the monthly threshold in C2.
=A2 * B2 / 12This returns $2,083.33.
5% of the home’s value is lost each year; divide by 12 for a month.
def rent_buy_threshold(home_value, unrecoverable_rate=0.05):
return (home_value * unrecoverable_rate) / 12
rent_buy_threshold(500000)5% of the home’s value is lost each year; divide by 12 for a month.
rent_buy_threshold <- function(home_value, unrecoverable_rate = 0.05) {
(home_value * unrecoverable_rate) / 12
}
rent_buy_threshold(500000)2.2 Level 2: Practice
In a low-rate era, 4% may fit better than 5%. What is the threshold for a $600,000 home at 4%?
Change A2 to 600000 and B2 to 0.04.
The same formula returns $2,000.
Pass the home value and unrecoverable_rate=0.04.
rent_buy_threshold(600000, unrecoverable_rate=0.04)Pass the home value and unrecoverable_rate = 0.04.
rent_buy_threshold(600000, unrecoverable_rate = 0.04)2.3 Level 3: Challenge
You can rent a place for $2,000 a month. Comparing homes worth $300,000, $400,000, $500,000, and $600,000 at the 5% rule, for how many is renting and investing the better deal (rent below the threshold)?
Put the home values in A2:A5, the threshold in B, and count where 2,000 is below it.
In B2, filled down: =A2*0.05/12. Then =COUNTIF(B2:B5, ">2000") returns 2 (the $500,000 and $600,000 homes).
homes["threshold"] = rent_buy_threshold(homes["home_value"]), then (homes["threshold"] > 2000).sum().
homes["threshold"] = rent_buy_threshold(homes["home_value"])
(homes["threshold"] > 2000).sum()mutate(threshold = rent_buy_threshold(home_value)), then filter(2000 < threshold) and nrow().
homes |>
mutate(threshold = rent_buy_threshold(home_value)) |>
filter(2000 < threshold) |>
nrow()3 The Monthly Mortgage Payment
The standard amortization formula spreads the loan plus all future interest into equal monthly payments. Shorter terms mean higher payments but far less total interest.
Formula: M = P × [r(1 + r)^n] ÷ [(1 + r)^n − 1], where P = loan principal, r = annual rate ÷ 12, n = years × 12
Example: a $480,000 loan (a $600,000 home with 20% down) at 6% for 30 years → about $2,878 a month.
How to read this result: the monthly payment is only part of the cost. Before choosing a term, check that the payment plus property tax and insurance stays under 28% to 30% of gross income.
3.1 Level 1: Guided
Fill in the blanks to finish mortgage_payment(), then find the monthly payment on a $480,000 loan at 6% for 30 years.
Find the payment in one formula.
=PMT(6%/12, 360, -480000)This returns $2,877.84.
Mortgages are paid monthly: a monthly rate and a number of months.
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(480000, 0.06, 30)Mortgages are paid monthly: a monthly rate and a number of months.
mortgage_payment <- function(principal, annual_rate, years) {
r <- annual_rate / 12
n <- years * 12
principal * (r * (1 + r)^n) / ((1 + r)^n - 1)
}
mortgage_payment(480000, 0.06, 30)3.2 Level 2: Practice
A 15-year loan has a bigger payment but far less interest. How much total interest does the 15-year loan save compared with the 30-year loan on the same $480,000 at 6%?
Find each loan’s total interest (payment × months − principal), then the difference.
=(PMT(6%/12,360,-480000)*360 - 480000) - (PMT(6%/12,180,-480000)*180 - 480000)This returns $306,931.01.
The 15-year loan has 180 payments.
interest_30 = mortgage_payment(480000, 0.06, 30) * 360 - 480000
interest_15 = mortgage_payment(480000, 0.06, 15) * 180 - 480000
interest_30 - interest_15The 15-year loan has 180 payments.
interest_30 <- mortgage_payment(480000, 0.06, 30) * 360 - 480000
interest_15 <- mortgage_payment(480000, 0.06, 15) * 180 - 480000
interest_30 - interest_153.3 Level 3: Challenge
Flip the question: your budget allows a $2,500 monthly payment. At 6% for 30 years, what is the largest loan you can take?
Find the loan in one formula.
=PV(6%/12, 360, -2500)This returns $416,979.04.
mortgage_payment(1, 0.06, 30) is the payment per dollar. Divide $2,500 by it.
2500 / mortgage_payment(1, 0.06, 30)mortgage_payment(1, 0.06, 30) is the payment per dollar. Divide $2,500 by it.
2500 / mortgage_payment(1, 0.06, 30)4 Where the First Year’s Payments Go
In month one, interest is the balance times the monthly rate. Only what’s left over 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 about $478 toward principal.
How to read this result: early on, your payment mostly rents money from the bank. Equity builds slowly at first and quickly at the end, so selling within a few years leaves little principal paid down.
4.1 Level 1: Guided
In month one of the $480,000 loan at 6%, interest is the balance × (6% ÷ 12). Fill in the blanks to find how much of the $2,877.84 payment actually pays down the loan.
With the payment in A2, find month one’s interest in B2 and principal in C2.
=480000 * 6%/12
=A2 - B2Interest is $2,400, so only $477.84 goes to principal.
The monthly rate is 0.06 / 12. Principal is whatever is left of the payment after interest.
payment = mortgage_payment(480000, 0.06, 30)
interest = 480000 * (0.06 / 12)
payment - interestThe monthly rate is 0.06 / 12. Principal is whatever is left of the payment after interest.
payment <- mortgage_payment(480000, 0.06, 30)
interest <- 480000 * (0.06 / 12)
payment - interest4.2 Level 2: Practice
What percent of that first payment is interest?
Find the share in D2.
=B2 / A2 * 100This returns 83.4.
Interest divided by the payment, times 100.
payment = mortgage_payment(480000, 0.06, 30)
interest = 480000 * (0.06 / 12)
interest / payment * 100Interest divided by the payment, times 100.
payment <- mortgage_payment(480000, 0.06, 30)
interest <- 480000 * (0.06 / 12)
interest / payment * 1004.3 Level 3: Challenge
Walk the loan forward 60 months. Each month, interest is the balance × 0.005 and the rest of the payment lowers the balance. How much principal have you paid off after 5 years?
Build a 60-row schedule with month, starting balance, interest, principal, and ending balance, then total the principal.
Or skip the table: =-CUMPRINC(6%/12, 360, 480000, 1, 60, 0) returns $33,339.09, about 7% of the loan.
for month in range(60): subtract payment - balance * 0.005 from balance. Then return 480000 - balance.
payment = mortgage_payment(480000, 0.06, 30)
balance = 480000
for month in range(60):
balance -= payment - balance * 0.005
480000 - balancefor (month in 1:60) set balance <- balance - (payment - balance * 0.005). Then return 480000 - balance.
payment <- mortgage_payment(480000, 0.06, 30)
balance <- 480000
for (month in 1:60) {
balance <- balance - (payment - balance * 0.005)
}
480000 - balance




