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 / 12
Simple interest
Before 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()
Compound interest
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()
Comparing the results
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%