Compound interest is keeping the earned interest in the same account that earns interest. Instead of earning interest and moving it to another account to be used, compound interest is re-investing the interest.
YEARLY_INTEREST = 14 / 100 # 14%
STARTING_BALANCE = 50_000
MONTHS = 48
MONTHLY_INTEREST = YEARLY_INTEREST / 12Before we explain compound interest, let’s first talk about non-compound or simple interest. Simple interest is calculated using the starting balance. Any interest earnings do not contribute to future earnings. This makes it easy to calculate and reason about. Let’s draw a plot of our earnings per month.
graph = []
for _ in range(MONTHS):
gain = STARTING_BALANCE * MONTHLY_INTEREST
graph.append(gain)
plt.xlabel('Month')
plt.ylabel('Monthly gain ($)')
plt.plot(graph)
plt.show()As expected, our earnings are constant every month. If we plot our total earnings, we should see a linear plot.
graph = []
totalGain = 0
for _ in range(MONTHS):
totalGain += STARTING_BALANCE * MONTHLY_INTEREST
graph.append(totalGain)
plt.xlabel('Month')
plt.ylabel('Total gain ($)')
plt.plot(graph)
plt.show()Let’s do the same calculations for compount interest. Instead of calculating the gain from the starting balance, we will use the current balance with all the earnings so far.
balance = STARTING_BALANCE
graph = []
for _ in range(MONTHS):
gain = balance * MONTHLY_INTEREST
balance += gain
graph.append(gain)
plt.plot(graph)
plt.xlabel('Month')
plt.ylabel('Monthly gain ($)')
plt.show()balance = STARTING_BALANCE
graph = []
for _ in range(MONTHS):
balance += balance * MONTHLY_INTEREST
graph.append(balance - STARTING_BALANCE)
plt.plot(graph)
plt.xlabel('Month')
plt.ylabel('Total gain ($)')
plt.show()Let’s make a single graph that compares the total gain over time for the two types of interest we just talked about.
# Simple
graph = []
totalGain = 0
for _ in range(MONTHS):
totalGain += STARTING_BALANCE * MONTHLY_INTEREST
graph.append(totalGain)
plt.plot(graph, label="Simple")
# Compound
balance = STARTING_BALANCE
graph = []
for _ in range(MONTHS):
balance += balance * MONTHLY_INTEREST
graph.append(balance - STARTING_BALANCE)
plt.plot(graph, label='Compound')
# Draw
plt.legend()
plt.xlabel('Month')
plt.ylabel('Total gain ($)')
plt.show()As we can see, our balance ends up being higher if we compound our interest. Let’s see how just how much money we’re leaving on the table.
print("Month\tNon-compound\tCompound\tDifference")
noncomp = STARTING_BALANCE
comp = STARTING_BALANCE
for month in range(1, MONTHS + 1):
comp += comp * MONTHLY_INTEREST
noncomp += STARTING_BALANCE * MONTHLY_INTEREST
difference = (comp - noncomp) / noncomp * 100
print(f"{month}\t{noncomp:.2f}\t{comp:.2f}\t{difference:.2f}%")Month Non-compound Compound Difference 1 50583.33 50583.33 0.00% 2 51166.67 51173.47 0.01% 3 51750.00 51770.50 0.04% 4 52333.33 52374.49 0.08% 5 52916.67 52985.52 0.13% 6 53500.00 53603.69 0.19% 7 54083.33 54229.06 0.27% 8 54666.67 54861.73 0.36% 9 55250.00 55501.79 0.46% 10 55833.33 56149.31 0.57% 11 56416.67 56804.38 0.69% 12 57000.00 57467.10 0.82% 13 57583.33 58137.55 0.96% 14 58166.67 58815.82 1.12% 15 58750.00 59502.01 1.28% 16 59333.33 60196.20 1.45% 17 59916.67 60898.49 1.64% 18 60500.00 61608.97 1.83% 19 61083.33 62327.74 2.04% 20 61666.67 63054.90 2.25% 21 62250.00 63790.54 2.47% 22 62833.33 64534.76 2.71% 23 63416.67 65287.67 2.95% 24 64000.00 66049.36 3.20% 25 64583.33 66819.93 3.46% 26 65166.67 67599.50 3.73% 27 65750.00 68388.16 4.01% 28 66333.33 69186.02 4.30% 29 66916.67 69993.19 4.60% 30 67500.00 70809.78 4.90% 31 68083.33 71635.89 5.22% 32 68666.67 72471.64 5.54% 33 69250.00 73317.15 5.87% 34 69833.33 74172.51 6.21% 35 70416.67 75037.86 6.56% 36 71000.00 75913.30 6.92% 37 71583.33 76798.95 7.29% 38 72166.67 77694.94 7.66% 39 72750.00 78601.38 8.04% 40 73333.33 79518.40 8.43% 41 73916.67 80446.11 8.83% 42 74500.00 81384.65 9.24% 43 75083.33 82334.14 9.66% 44 75666.67 83294.71 10.08% 45 76250.00 84266.48 10.51% 46 76833.33 85249.59 10.95% 47 77416.67 86244.16 11.40% 48 78000.00 87250.35 11.86%