Major Purchases

TipHow these exercises work

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

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

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

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

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

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 / 12

This 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

Monthly payment on a $480,000 loan at 6% across three terms

Monthly payment on a $480,000 loan at 6% across three terms

Monthly payment on a $480,000 loan at 6% across three terms

Monthly payment on a $480,000 loan at 6% across three terms

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_15

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_15

3.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

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

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

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

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

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 - B2

Interest 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 - interest

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 - interest

4.2 Level 2: Practice

What percent of that first payment is interest?

Find the share in D2.

=B2 / A2 * 100

This returns 83.4.

Interest divided by the payment, times 100.

payment = mortgage_payment(480000, 0.06, 30)
interest = 480000 * (0.06 / 12)
interest / payment * 100

Interest divided by the payment, times 100.

payment <- mortgage_payment(480000, 0.06, 30)
interest <- 480000 * (0.06 / 12)
interest / payment * 100

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

for (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