Beware Misguided Advice for Ordinary Investors

Introduction

Most often when I find slightly misguided blog posts / informative articles for savvy investors, I keep it to myself. Why? Because financial markets are complex, and drawing steadfast conclusions about historical observation that will unquestionably hold water in the future are very, very difficult to make. So frequently investor-centric websites will make a set of simplifying assumptions and then show how things are true when those assumptions hold. If the overall moral of the story is a positive one, then I don’t take too much issue with the “gory details” or slight innacuracies — a greater good attempting to benefit investors is being achieved and the inconsistencies are more of an “academic debate,” and really meant for mainstream blogs.

A Tale too Egregious

I stumbled upon a post entitled “How Did This Girl Retire on $16,000?”, and unfortunately could let neither the egreious misrepresentation of the impact of capital market fluctuation, nor the incorrect and misguided moral lesson of the story, go unchallenged. The basic premise of the post I mention is as follows:

  1. Assume we have two people, Amanda & Fabian, who are the same age
  2. Savvy Amanda begins saving $2,000 per year at the ripe of 19, and then stops saving at 26 (investing a total of $16,000 we’ll call her the “early investor”)
  3. Silly Fabian doesn’t save money until he reaches the put-me-out-to-pasture age of 27, whereupon he invests $2,000 every year until the age of 65 (investing a total of $78,000, we’ll call him the “consistent investor” hereto)
  4. Assuming Amanda & Fabian are able to garner a 9% return per annum, at the age of 65 Amanda’s account value is $692,796, and Fabian’s account value is $673,765 (see the table values below).
  5. Therefore, the moral of the story is that Savvy Amanda has ended up with almost $20,000 more in her account at the end of the day, for no other reason than the “Magical Power of Compounding,” and the lesson goes, invest early… or just shoot yourself.

Table Values for Fabian & Amanda

Age Amanda Investment Fabian Investment EOY Amanda Account Value EOY Fabian Account Value
19 $2,000 $0 $2,180.00 $0
20 $2,000 $0 $4,556.20 $0
27 $0 $2,000 $26,205.86 $2,180.00
28 $0 $2,000 $28,564.39 $4,556.20
64 $0 $2,000 $635,592.60 $616,132.93
65 $0 $2,000 $692,795.93 $673,764.89

Not Real, Not Right, and Not Reasonable

Of course it’s easy to look at this post and say, “The writer is attempting to encourage early investment, what’s so wrong with that, B?” The answer is that early investment is encouraged in place of consistent investment, and consistent investment is the single most valuable principle that can be instilled in individual investors, period. And for that, I shall expose the fruad-ery.

Compound Growth Rates — A Place & Time

Assuming “the market grows at x%” is an highly valuable practice in financial planning to project the future value of accounts, estates, and estimates of wealth. However, it can be very misleading, and should never be used to illustrate:

  1. Distribution of Income
  2. Timing of Investment

For instance, as an ex-financial planner, I used to see projections of life insurance cash value based on “compound growth estimates” to illustrate how someone could use life insurance as an income distribution tool for retirement. Nuh-uh, not right, not ever. Shhhhh. Never. That’s right.

Approaching the Problem Correctly

Financial markets and their respective annual return rates are anything but consistent. However, if we’re assuming that an investor makes contributions every single year (without fail), then a valuable exercise to understand future wealth might be projecting account values using a constant compound growth rate. However, if we’re specifically attempting to explain something about the “timing of an investment,” then… and this is going to sound absolutely outlandish… we might want to effectively model the impacts of the “timing of the investment,” and not just smooth over that part.

The Right Way to Analyze this Problem

So how can we approach this problem correctly, instead of simply growing the money by 9% per year? In a situation like this, Monte Carlo Simulation is going to be most effective. Here’s the basic process that I followed (with all of my Python code available at the end of the post):

  1. Assume that financial markets have an annual rate of return of 9% with a volatility of 10%
  2. Create “random market outcomes” for Amanda & Fabian (where they invest in the same asset, i.e. get the same return), but keep their investment schedule consistent
  3. Look at their final wealth at the age of 65, and see who has more money

I repeated the aforementioned process 100,000 times so we could get a look at 100,000 different scenarios, and how what the potential outcomes for “final wealth” might be.

fv

At first blush, it’s not entirely clear what’s going on… the consistent investor is clearly “tighter around the median” (which we’ll go into later), but which strategy, on average, has higher future wealth? Which strategy has less likelihood of falling below a given threshold? These questions, and others, I address below…

Highest Final Wealth, More than 50% of Outcomes

First, let’s look at “which strategy achieves higher future wealth.” The article from the half-wit would have you think the “early investment strategy” most often wins out… nope.

The bar chart below shows, out of the 100,000 simulations, how frequently Fabian (the late, but consistent investor) had greater final wealth and how frequently Amanda (the early investor), had greater final wealth. Note that Fabian has higher wealth more than half of the time… oops.

img

Expectations of Shortfall

There is another, equally important aspect of final wealth that we should investigate here as insightful, investors: how varied are our outcomes for each of the scenarios? If investing is the exposure of allocated capital towards financial risks we perceive to be in alignment with our future objectives, then “appropriately estimating risks” is one of our primary functions as investors. We’ve already evaluated “which of the two scenarios is a more likely outcome,” and determined that the way of the consistent investor, Fabian was in fact more likely. What about from a perspective of not achieving a specific financial goal?

Let’s look at different thresholds of final wealth, and see how many of the 100,000 simulations fell below a given threshold. We could then determine a likelihood, given our market assumptions, of not reaching our minimum threshold.

Threshold Achieved Using Each Method:

Threshold (Final Wealth) Num Below Fabian (Consistent Inv) As % Num Below Amanda (Early Investor) As %
50,000 1 0.00% 0 0.00%
60,000 8 0.01% 0 0.00%
70,000 30 0.03% 0 0.00%
80,000 67 0.07% 0 0.00%
90,000 108 0.11% 0 0.00%
100,000 173 0.17% 0 0.00%
110,000 266 0.27% 3 0.00%
120,000 412 0.41% 9 0.01%
130,000 596 0.60% 24 0.02%
140,000 829 0.83% 46 0.05%
150,000 1,114 1.11% 71 0.07%
160,000 1,466 1.47% 110 0.11%
170,000 1,852 1.85% 175 0.18%
180,000 2,303 2.30% 252 0.25%
190,000 2,798 2.80% 356 0.36%
200,000 3,344 3.34% 534 0.53%

We can see significantly lower chances of having our future nest egg eroded by fluctuations in the market when consistent investing is our mantra instead of “invest early and wait.” In fact. If we look at the threshold table provided above in the form of bar chart, the orders of magnitude communicating “how likely is it to fall below a given threshold?”

img

Conclusions

Beware some of the articles you read online, and the advice their columns may seem to imply. The article I stumbled upon from Riskology.co couldn’t be further from good advice. Invest young is better than investing consistently? Wrong. Remember, how I said you should never make categorical imperatives about investing because it’s too complicated? Yeah, I just did. Consistent investing is always better than “betting and stopping when you’re young.” For every one time that’s worked for someone, there’s one thousand examples of when it didn’t. I could have obviously changed parameters about the simulation, etc. but I thought it would be most effective to keep it simple.

The takeaway I’ve shown you above are twofold:

  1. If you’re looking at distribution planning or timing of investment, never, ever, ever, use a constant compound rate of return. Did you say something? I didn’t think… good Shhh.

  2. As an in investor, think more cohesively about risk. Someone’s always going to try to show you a “slight-of-hand” to make investing seem easier than it really is. The bird-brain neophyte who wrote the article I mentioned basically tried to tell us that the only risk is the loss of time you could have been compounding money. I hope I showed you some other, simple ways to think about risks that could have larger impacts on your nest egg, especially as it relates to the timing of investment planning.

Python Code to Create Your Own

import argparse
import pandas
import numpy
import matplotlib.pyplot as plt
def gen_gbm_price_series(num_years, N, price_0, vol, drift):
"""
Return a price series generated using GBM

INPUTS:
-------
num_years: number of years (if 20 trading days, then 20/252)
N: number of total periods
price_0: starting price for the security
vol: the volatility of the security
return: the expected return of the security

RETURNS:
--------
Pandas.Series of length n of the simulated price series

"""
dt = num_years/float(N)
e1 = (drift - 0.5*vol**2)*dt
e2 = (vol*numpy.sqrt(dt))
cum_shocks = numpy.cumsum(numpy.random.randn(N,))
cum_drift = numpy.arange(1, N + 1)
return pandas.Series(numpy.append(price_0, price_0*numpy.exp(cum_drift*e1 + cum_shocks*e2)[:-1]))
def compare_final_values(ret_series):
"""
Compare the final values between Fabian & Amanda
"""
am_invest = pandas.Series(numpy.tile(2000, [8,]), index = numpy.arange(0, 8) )
am_invest = am_invest.append(pandas.Series(numpy.zeros(39), index = numpy.arange(8, 47)) )
fb_invest = pandas.Series(numpy.tile(2000, [39,]), index = numpy.arange(8, 47))
fb_invest = pandas.Series(numpy.zeros(8), index = numpy.arange(0, 8)).append(fb_invest)
return pandas.DataFrame({'amanda_account':account_value(ret_series, am_invest),
'fabian_account':account_value(ret_series, fb_invest)})

def account_value(ret_series, agg_invest):
"""
Given a contribution series and a return series, calculate future wealth
"""
account_value = pandas.Series(numpy.zeros(agg_invest.shape[0]), name = 'account_value')
account_value[0] = agg_invest[0]*(1 + ret_series[0])

for i in numpy.arange(1, len(ret_series)):
account_value[i] = (account_value[i - 1] + agg_invest[i])*(1 + ret_series[i])
return account_value

def run_analysis():
#Construct the Analysis
d = {}
for i numpy.arange(100000):
d['sim '+str(i)] = gen_gbm_price_series(48, 48, 1000., .1, .09)
mkt_prices = pandas.DataFrame(d)
lin_returns = mkt_prices.div(mkt_prices.shift(1)) - 1
lin_return.dropna(inplace = True)
d = {}
for i in numpy.arange(lin_returns.shape[1]):
d[lin_returns.columns[i]] = compare_final_values(lin_returns.iloc[:, i]).iloc[-1, :]
final_values = pandas.DataFrame(d)
diff = final_values.fabian_account - final_values.amanda_account

#Generate the Visualizations
fig = plt.figure()
ax = plt.subplot2grid((1,4), (0,0), colspan = 2)
ax.bar(0, diff[diff > 0.].shape[0]/float(diff.shape[0]), color = '#7195a3', alpha = .7, label = 'Fabian Had More')
ax.bar(1, diff[diff < 0.].shape[0]/float(diff.shape[0]), color = '#ff9934', alpha = .7, label = 'Amanda Had More')
ax.set_xticklabels([])
ax.legend(frameon = False)
plt.title("Greater Final Value: Fabian vs. Amanda")

ax2 = plt.subplot2grid((1,4), (0,2), colspan = 2)
ax2.bar(0, diff[diff > 0.].shape[0]/float(diff.shape[0]), color = '#7195a3', alpha = .7, label = 'Fabian Had More')
ax2.bar(1, diff[diff < 0.].shape[0]/float(diff.shape[0]), color = '#ff9934', alpha = .7, label = 'Amanda Had More')
ax2.set_xticklabels([0])
ax2.set_ylim(0.45, 0.55)
ax2.axhline(0.5, color = '#ff3200', ls = '--', lw = 2., label = 'exactly half')
plt.title("Greater Final Value: Zoomed to 50%")
ax2.legend(frameon = False)

#Show Final Wealth Histograms
fig = plt.figure()
ax = plt.subplot2grid((1,4), (0,0), colspan = 2)
ax.hist(final_values.amanda_account, bins = 50, color = '#ff9934', histtype = 'stepfilled', alpha = .7, label = 'Amanda (early) Final Value')
ax.hist(final_values.fabian_account, bins = 50, color = '#7195a3', histtype = 'stepfilled', alpha = .7, label = 'Fabian (consistent) Final Value')
plt.legend(frameon = False)
plt.title("Distribution of Final Wealth", fontsize = 16)

ax = plt.subplot2grid((1,4), (0, 2), colspan = 2)
ax.hist(final_values.amanda_account, bins = 50, color = '#ff9934', histtype = 'stepfilled', alpha = .7, label = 'Amanda (early) Final Value')
ax.hist(final_values.fabian_account, bins = 50, color = '#7195a3', histtype = 'stepfilled', alpha = .7, label = 'Fabian (consistent) Final Value')
ax.set_xlim(0, 200000)
plt.legend(frameon = False)
plt.title("Final Wealth Below $200,000", fontsize = 16)

#Plot the Thresholds
mins = numpy.arange(0, 210000, step = 10000)
d = {'amanda_below':[], 'fabian_below':[]}
for min in mins:
d['amanda_below'].append(final_values.amanda_account[final_values.amanda_account < min].shape[0])
d['fabian_below'].append(final_values.fabian_account[final_values.fabian_account < min].shape[0])

threshold_df = pandas.DataFrame(d)
fig = plt.figure()
threshold_df.plot(kind = 'bar', color = ('#ff9934', '#7195a3'), alpha = .7)
plt.legend(frameon = False)
plt.title('Falling Below a Given Threshold', fontsize = 16)
plt.ylabel('Number of Sims Below a Given Threshold')
plt.xlabel('Final Value Threshold')
plt.show()

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.