Table of contents
It is very common to hear about how the US stock market, particularly the S&P 500 index [↗], has returned an average of 10% annually. What is even crazier is that some people base their early retirement plans on this number.
Like most statistical values, this figure is accurate depending on how you interpret it. Yes, the average annual return of the S&P 500 is around 10%, but in reality, the market doesn’t consistently return 10% every single year. This fact changes everything when it comes to financial planning.
A look at varying growth
Instead of explaining too much upfront, let's look at a simple simulation of returns.
Sim 1 (Smooth Returns)
In this example (our control), we have a portfolio starting with $200,000
, which grows by 10% every year for five years.
Year | Return | Balance |
---|---|---|
1 | 10.0% | 220,000.0 |
2 | 10.0% | 242,000.0 |
3 | 10.0% | 266,200.0 |
4 | 10.0% | 292,820.0 |
5 | 10.0% | 322,102.0 |
Average Arithmetic Return: | 10.0% |
Sim 2 (Uneven Returns)
In our second simulation, we will use the same starting portfolio balance of $200,000
. However, this time, the returns will vary each year. Despite these fluctuations, the average return will still be 10% over the entire period.
Year | Return | Balance |
---|---|---|
1 | 28.93% | 257,860.0 |
2 | 30.83% | 337,358.24 |
3 | 26.33% | 426,184.66 |
4 | -38.38% | 262,614.99 |
5 | 2.3% | 268,655.13 |
Average Arithmetic Return: | 10.0% |
In Conclusion...
Our portfolio with a consistent 10% return each year ends up with a balance of $322,102.0, while the second portfolio, which started with the same amount, finishes the fifth year with a lower balance of $268,655.13.
Both have the same arithmetic average return, yet this simple simulation shows how misleading that number can be when actually using returns in your calculations.
This difference is due to sequence risk [↗], the order in which returns occur can significantly impact the final portfolio value, lower or negative returns reduces the base on which future gains compound.
The gap gets even bigger if you factor in withdrawals, and even run out of money in some cases
Sim Code Used
01: portfolio_balance = 200_000
02: # annual_returns = [10.0, 10.0, 10.0, 10.0, 10.0] # even growth
03: annual_returns = [28.93, 30.83, 26.33, -38.38, 2.3] # uneven growth
04: for year, growth in enumerate(annual_returns):
05: portfolio_balance += round((growth/100)*portfolio_balance, 2)
06: print(f"Year: {year+1}, Return: {growth}%, Balance: {format(portfolio_balance, ',')}")
07:
08: avg_return = sum(annual_returns) / len(annual_returns)
09: print(f"Average Arithmetic Return: {round(avg_return, 2)}")
Arithmetic Average vs. Geometric Average
Now, let us look at why the arithmetic average [↗] isn't as useful as the geometric average [↗].
The arithmetic average simply adds up all the returns and divides by the number of years:
01: avg_ret = (ret_1 + ret_2 + ... + ret_n) / n
In plain English: "If I earned different amounts each year and wanted to estimate what I made per year, I would take the total and split it evenly across the years."
The geometric mean, on the other hand, accounts for the compounding effect:
01: geo_ret = ((1 + ret_1) * (1 + ret_2) * ... * (1 + ret_n))^(1/n) - 1
In plain English: "My money grew at different rates each year, but what steady growth rate would have given me the same final balance?"
Here's my Python function to compute the geometric mean. If it breaks, let me know. :)
01: import math
02:
03: def geometric_mean(returns_list):
04: percentage_values = [(1 + num/100) for num in returns_list]
05: list_size = len(returns_list)
06: list_product = math.prod(percentage_values)
07: geo_mean = (list_product**(1/list_size))
08: return (geo_mean - 1) * 100
Wrapping Up
Next time you Google the returns of a stock or ETF [↗] you want to invest in, do not forget to look for the geometric mean and use that for your projected returns, unless you know exactly what you're doing. In that case, why did you read this all the way to the end? :).
Oh, one last thing… I should also mention that while understanding and using the geometric mean brings you closer to a more accurate projection, it does not account for the effects of sequence of returns risk. Incorporating a Monte Carlo [↗] simulation alongside historical data can further improve accuracy.
Here is another article you might like 😊 How To Get A List Of Your Stock Options Using IBKR API