Financial Goals

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

  • Short, medium, and long goals: when you need the money decides where it lives; under 3 years in high yield savings, 3 to 10 years in savings or a bond and stock mix, over 10 years in index funds inside retirement accounts
  • Wish vs. goal: a goal has a number, a date, and a monthly amount; give each goal its own named savings account and automate the transfer on payday
  • Do you need a goal to save?: Sethi and Preston give planned expenses their own step; Housel says savings with no goal attached buys flexibility; most people do best with both
  • How much to save: Sethi (about 10% of take home pay for investing plus 5% to 10% for goals), The Money Guy Show (25% of gross), 15% for retirement as a starting point; start with what you can and raise it with every raise
  • Sequencing goals: finish the Financial Order of Operations first, then fund goals one at a time or all at once; the last goal finishes on the same day either way
  • Tracking progress: check transfers monthly, compare balances every few months, add up net worth once a year, and notice when you hit a goal

2 Saving for a Goal with Interest

Interest does part of the work, so you can save a little less each month than goal ÷ months. This formula works backward from the future value of a monthly deposit.

Formula: Monthly amount = Goal × r ÷ ((1 + r)^n − 1), where r = yearly rate ÷ 12 and n = number of months

A $15,000 goal in 5 years at 4%: your deposits plus interest

A $15,000 goal in 5 years at 4%: your deposits plus interest

A $15,000 goal in 5 years at 4%: your deposits plus interest

A $15,000 goal in 5 years at 4%: your deposits plus interest

Example: a $15,000 down payment in 5 years at 4% takes about $226 a month, $24 less than the $250 you’d need with no interest. Over five years, interest adds about $1,425.

How to read this result: the monthly amount is your payday transfer. If it doesn’t fit your budget, push the date out before you lower the goal; an extra two years cuts the monthly amount by about 30%.

2.1 Level 1: Guided

Fill in the blanks to finish monthly_for_goal(), then find the monthly deposit for a $15,000 down payment in 5 years at 4%.

Put the goal in A2 (15000), the rate in B2 (0.04), and months in C2 (60). Find the monthly deposit in D2.

=PMT(B2/12, C2, 0, -A2)

This returns $226.25.

Use a monthly rate, and compound once for every month.

def monthly_for_goal(goal, annual_rate, months):
    r = annual_rate / 12
    if r == 0:
        return goal / months
    return goal * r / ((1 + r) ** months - 1)

monthly_for_goal(15000, 0.04, 60)

Use a monthly rate, and compound once for every month.

monthly_for_goal <- function(goal, annual_rate, months) {
  r <- annual_rate / 12
  if (r == 0) return(goal / months)
  goal * r / ((1 + r)^months - 1)
}
monthly_for_goal(15000, 0.04, 60)

2.2 Level 2: Practice

How much of the $15,000 comes from interest rather than your deposits?

Find the interest in E2.

=A2 - D2*C2

This returns $1,425.13.

Your deposits are the payment times 60. Interest is the rest of the goal.

pmt = monthly_for_goal(15000, 0.04, 60)
15000 - pmt * 60

Your deposits are the payment times 60. Interest is the rest of the goal.

pmt <- monthly_for_goal(15000, 0.04, 60)
15000 - pmt * 60

2.3 Level 3: Challenge

Your budget allows $200 a month at most. At 4%, what is the shortest deadline in whole years (1 to 10) that keeps the deposit at or under $200?

Put years 1 to 10 in A2:A11, the monthly deposit in B, and find the shortest deadline at or under $200.

In B2, filled down: =PMT(4%/12, A2*12, 0, -15000). Then:

=MINIFS(A2:A11, B2:B11, "<=200")

The answer is 6 years ($184.68 a month).

Use min(y for y in years if monthly_for_goal(15000, 0.04, y * 12) <= 200).

years = range(1, 11)
min(y for y in years if monthly_for_goal(15000, 0.04, y * 12) <= 200)

monthly_for_goal() has an if, so give it one deadline at a time: sapply(years * 12, monthly_for_goal, goal = 15000, annual_rate = 0.04). Then min(years[...]).

years <- 1:10
deposit <- sapply(years * 12, monthly_for_goal, goal = 15000, annual_rate = 0.04)
min(years[deposit <= 200])

3 One Goal at a Time vs. All at Once

When several goals share one monthly savings amount, the order changes when the first goal finishes. It never changes when the last one finishes.

Formula: Months to finish all goals = Total of all goals ÷ Monthly savings; Months to finish the first goal = First goal ÷ Amount going to it each month

Two goals funded with $600/month: one at a time vs. split evenly

Two goals funded with $600/month: one at a time vs. split evenly

Two goals funded with $600/month: one at a time vs. split evenly

Two goals funded with $600/month: one at a time vs. split evenly

Example: with $600 a month for a $3,000 trip and a $9,000 car, both goals are done in ($3,000 + $9,000) ÷ $600 = 20 months either way. The trip takes 5 months one at a time, or 10 months split evenly.

How to read this result: the order is a choice about which goal you want first, not about saving time overall. Put a fixed date goal (a wedding, a car on its last legs) first, or give it the bigger share.

3.1 Level 1: Guided

Fill in the blanks to finish months_to_fund(), then find how many months a $3,000 trip takes at $600 a month.

Put the goal in A2 (3000) and the monthly amount in B2 (600). Find the whole months in C2.

=ROUNDUP(A2 / B2, 0)

This returns 5.

A goal isn’t done until the last dollar is in, so always round up.

import math
def months_to_fund(goal, monthly):
    return math.ceil(goal / monthly)

months_to_fund(3000, 600)

A goal isn’t done until the last dollar is in, so always round up.

months_to_fund <- function(goal, monthly) {
  ceiling(goal / monthly)
}
months_to_fund(3000, 600)

3.2 Level 2: Practice

Instead of one goal at a time, you split the $600 evenly between the trip and a $9,000 car. When is the trip funded now?

Change B2 to 300.

The same formula returns 10 months: twice as long, though everything is still done at month 20.

The trip now gets half of $600.

months_to_fund(3000, 300)

The trip now gets half of $600.

months_to_fund(3000, 300)

3.3 Level 3: Challenge

Three goals, funded one at a time in this order with $700 a month: a $2,000 emergency starter, a $3,000 trip, and a $9,000 car. In which month is each goal finished?

Put the goals in A2:A4. Find the running total in B and the finishing month in C.

In B2: =SUM($A$2:A2), filled down. In C2: =ROUNDUP(B2/700, 0), filled down. The months are 3, 8, and 20.

Each goal finishes when the running total of goals so far is funded. itertools.accumulate(goals) gives the running totals.

from itertools import accumulate
goals = [2000, 3000, 9000]
[months_to_fund(total, 700) for total in accumulate(goals)]

Each goal finishes when the running total of goals so far is funded. cumsum(goals) gives the running totals.

goals <- c(2000, 3000, 9000)
months_to_fund(cumsum(goals), 700)