Investing for a recession-proof, typical income retirement. Part 4: Tools to aid your planning

George McKee
9 min readJul 23, 2020

--

Tools used in the previous parts of this series

Introduction

Uncountable numbers of retirement planning articles promise to tell you how much investment assets you’ll need for your retirement. If there’s a single one that actually delivers on that promise, I haven’t found it. So I decided to write it myself. I even had to build a couple of simple tools to do the math that nobody else bothers with. It turned out to be a longer article than I expected, so I split it into more readable chunks. This is Part 4.

Part 1: the median income lifetime investment goal
Part 2: options if you can’t meet the goal
Part 3: some ways to beat the goal
Part 4: tools to do your own planning

This part is concerned with tools for computing your retirement income. There’s not much new information here. If you understand what’s been discussed in the other parts, and don’t need to try out other combinations of factors, you don’t really need to read it. Or if you are having trouble believing its conclusions, you can check my work yourself using the tools listed here. Where I’ve created my own tools, I’ve listed the source code of the programs I used, so that you can recreate the computations yourself. I might have made an error somewhere, and I apologize if I did.

Get the facts

When you dive into the details of inflation, you find that the textbook definition incorporates many assumptions that need to be filled in if you want to actually identify a value for it.at any particular time and economic unit. I’ve used the US national value, which is assembled by the Bureau of Labor Statistics, a unit of the Department of Labor, and called the Consumer Price Index.

If you want to see the trends for many economic indexes, the Federal Reserve Bank of St. Louis provides a tool called FRED, with data in standardized formats about more aspects of the US economy than you are likely to be able to imagine, compiled from official sources. FRED includes powerful charting capabilities, or you can download the raw data and make your own charts if you choose. FRED is a valuable resource for both professionals and individuals.

Tools from other sites

Compound interest is an example of an exponential growth process that derives from the feedback of interest back into the principal for the next time period. These kinds of processes behave very differently from simple arithmetic growth and geometric growth processes, and developing good intuitions about them is not easy. Many popular discussions try to sound sophisticated and sloppily use the word “exponential” to mean anything that grows “really really fast”. Moneychimp’s compound interest calculator includes a chart that will help you understand how its results make sense.

The Required Minimum Distributions from tax-deferred retirement accounts aren’t specified by any simple rule, and the percentage to be distributed changes year by year depending on your age. Fold in the amount remaining in the account after each annual withdrawal, and you have income and balance trajectories that nobody is able to estimate in their head. You could spend hours with the IRS tables and a calculator, or you could use Charles Schwab’s RMD Calculators to see how your investments will fare as you make the distributions.

DIY calculations

There are no web-based investment calculators that I know of that incorporate the MIFT correction, returns Minus Inflation Fees and Taxes, so you need to do these yourself. Incorporating MIFT is tedious, but not hard to do with a calculator and paper and pencil.

If you know how to use a spreadsheet, such as LibreOffice Calc, Microsoft Excel, or Google Sheets, you should have no trouble building one that computes interest MIFT, or computes required portfolio sizes MIFT. Unfortunately the popular spreadsheets don’t provide any ways to export and import spreadsheets as text files that can be included in a document such as this one. They can load data in CSV comma separated value format, but there’s no equivalent format for the computational part of spreadsheet cells. Creating an account on GitHub or SourceForge seems like overkill for a small binary spreadsheet file.

That leaves us with old-fashioned text based programming languages. I like Julia, but Python has a larger community of users. The standard method to run the scripts below is to obtain a python language processor from the official site for Python, python.org, or if you’re using a phone or tablet, to obtain one from the app store. If you’re not ready to burden your device with its own python processor, you can use one of several websites that provide cloud-based implementations. The scripts below have been tested on the python environment at repl.it. You can use this system for quick testing without even creating an account.

There are two major questions you’ll want to investigate for the effects of MIFT. What is the size of portfolio that you’ll need in order to obtain the median per capita income? The script retirement-investments.py will help you understand that.

And, if you have some other income goal than the median, what size post-MIFT portfolio will you need to get it? That’s what the script income-investment-MIFT.py is for.

Take each script below, copy it and paste it into the python environment you’ve selected, then run it. You may have to edit out some extraneous line breaks. If you have questions that it doesn’t answer, you can modify the code to do whatever you want.

retirement-investments.py

#!python3
#
# compute the size of a portfolio needed to obtain an income equal to
# the U.S. median per capital income, when given the portfolio's unadjusted
# total return, then adjusting for inflation, management fees, and taxes
# Originally written by George McKee, August 2019
# This computation works much better as a spreadsheet, but is provided as a
# program so that it can be included in a text-only document
# To run it without installing Python, visit https://repl.it/languages
# This is just a handy calculation, so we do not do input validation,
# nor do we try too hard to make the output look pretty
# If an output value is negative, that means that all the capital investment
# in the world won't provide a positive amount of ongoing income.
# median per capita income from https://www.ssa.gov/OACT/COLA/central.html
medIncome = 31561
# median annual social security benefit from http://www.pensionrights.org/publications/statistic/income-social-security
ssBenefit = 14977
# just FYI...
# 2018-2019 Federal Poverty Level - 1 person = $12,140
# according to https://aspe.hhs.gov/poverty-guidelines
# ------ Set default values and interactively adjust them ---------------# inflation rate
# Federal Reserve target rate = 2%, according to https://www.federalreserve.gov/faqs/economy_14400.htm
# median CPI for 10 years preceding 2019 = 1.66%
inflation = input("Inflation rate %, blank=2.0 > ")
if inflation == "":
inflation = 2.0
inflation = float(inflation)/100.0
# using Betterment for a typical bond fund, https://www.betterment.com/resources/research/ultra-low-risk-portfolios/
bondYield = input("Bond yield %, blank=2.40 > ")
# U.S. 10-year bond fluctuated between 2.42% and 1.76% while this program
# was being developed
if bondYield == "":
bondYield = 2.40
bondYield = float(bondYield)/100.0
# example stock fund VTI - Vanguard Total Stock Market Index
# Oct 2007 - Dec 2007 VTI yield = 0.16
stockYield = input("Stock yield %, blank=16 > ")
if stockYield == "":
stockYield = 16.0
stockYield = float(stockYield)/100.0
# investment management fees
# old-school management firms charge 5% of the portfolio annually (billed quarterly)
# Betterment's management fee for a basic account is 0.25%
# A stock broker such as TDAmeritrade charges nothing to hold your account,
# so you can buy an index ETF such as SPY, which charges 0.0945%
# Another SP500 index fund ETF is VOO, which charges 0.04%
fee = input("Management fee %, blank=0.25 > ")
if fee == "":
fee = 0.25
fee = float(fee)/100.0
# The US income tax bracket for an income of medIncome is 22% before deductions
# and exemptions. We assume that the ssBenfit consumes effectively all the
# standard deduction, so any investment income is fully taxable.
# We live outside of a city in a state with no income tax (Texas) so that's
# all the taxes we need to deal with.
tax = input("Income Tax bracket %, blank=22 > ")
if tax == "":
tax = 22.0
tax = float(tax)/100.0
# FYI, the capital gains tax for income in the medIncome range,
# i.e less than $39,000, is 0%
# accrding to https://www.nerdwallet.com/blog/taxes/capital-gains-tax-rates/
# so we omit capital gains tax calculations
# ------ Compute and output results ------print()
infBondYield = bondYield - inflation
print("Inflation-adjusted bond yield : ", infBondYield)
infStockYield = stockYield - inflation
print("Inflation-adjusted stock yield: ", infStockYield)
print()
infFeeBondYield = bondYield - inflation - fee
print("Inflation & fees adjusted bond yield : ", infFeeBondYield)
print()
postTaxIncome = medIncome - ssBenefit
print("Investment income needed - after taxes : ", int(postTaxIncome))
invIncome = (medIncome-ssBenefit)/(1.0-tax)
print("Investment income needed - before taxes : ", int(invIncome))
print()
bondAssetsForPostTax = int(postTaxIncome / infBondYield)
print("100% bond assets needed - 0 tax : ", bondAssetsForPostTax)
bondAssetsPostFeePreTax = int(postTaxIncome / infFeeBondYield)
print("100% bond assets needed - after fees : ", bondAssetsPostFeePreTax)
bondAssetsPostFeePostTax = int(invIncome / infFeeBondYield)
print("100% bond assets needed - after fees & taxes : ", bondAssetsPostFeePostTax)
print()
print("100% stock assets needed : ", int(invIncome / infStockYield))
# this value really should include taxes & fees, but it's so much smaller than
# the bond assets require that we don't bother.
# This income is from capital gains: 10x better yield needs 10x less assets

income-investment-MIFT.py

#!python3
#
# compute the size of a portfolio needed to obtain a given income,
# when given the portfolio's unadjusted total return,
# then adjusting for inflation, management fees, and taxes
# Originally written by George McKee, June 2020
# This computation works much better as a spreadsheet, but is provided as a
# program so that it can be included in a text-only document
# To run it without installing Python, visit https://repl.it/languages
# This is just a handy calculation, so we do not do input validation,
# nor do we try too hard to make the output look pretty
# If an output value is negative, that means that all the capital investment
# in the world won't provide a positive amount of ongoing income.
# ------ Set default values and interactively adjust them ---------------income = input("Desired income? > ")
ma = ""
while (ma != "m") and (ma != "a"):
ma = input("is this monthly(m) or annually(a)? ")
if ma == "m":
ma = 12.0
else:
ma = 1.0
income = float(income) * ma
# using Betterment for a typical bond fund,
# https://www.betterment.com/resources/research/ultra-low-risk-portfolios/
bondYield = input("Bond yield %, blank=2.40 > ")
# U.S. 10-year bond fluctuated between 2.42% and 1.76% while this program
# was being developed
if bondYield == "":
bondYield = 2.40
bondYield = float(bondYield)/100.0
# inflation rate
# Federal Reserve target rate = 2%, according to
# https://www.federalreserve.gov/faqs/economy_14400.htm
# median CPI for 10 years preceding 2019 = 1.66%
inflation = input("Inflation rate %, blank=2.0 > ")
if inflation == "":
inflation = 2.0
inflation = float(inflation)/100.0
# investment management fees
# old-school management firms charge 5% of the portfolio annually (billed quarterly)
# Betterment's management fee for a basic account is 0.25%
# A stock broker such as TDAmeritrade charges nothing to hold your account,
# so you can buy an index ETF such as SPY, which charges 0.0945%
# Another SP500 index fund ETF is VOO, which charges 0.04%
fee = input("Management fee %, blank=0.25 > ")
if fee == "":
fee = 0.25
fee = float(fee)/100.0
# The US income tax bracket for an income of medIncome is 22% before deductions
# and exemptions. We assume that the ssBenfit consumes effectively all the
# standard deduction, so any investment income is fully taxable.
# We live outside of a city in a state with no income tax (Texas) so that's
# all the taxes we need to deal with.
tax = input("Income Tax bracket %, blank=22 > ")
if tax == "":
tax = 22.0
tax = float(tax)/100.0
# FYI, the capital gains tax for income in the medIncome range,
# i.e less than $39,000, is 0%
# accrding to https://www.nerdwallet.com/blog/taxes/capital-gains-tax-rates/
# so we omit capital gains tax calculations
# ------ Compute and output results ------print()
infBondYield = bondYield - inflation
print("Inflation-adjusted bond yield %: ", infBondYield*100.0)
print()
infFeeBondYield = bondYield - inflation - fee
print("Inflation & fees adjusted bond yield %: ", infFeeBondYield*100.0)
print()
bondAssetsForPostTax = int(income / infBondYield)
print("100% bond assets needed - 0 tax : ", bondAssetsForPostTax)
bondAssetsPostFeePreTax = int(income / infFeeBondYield)
print("100% bond assets needed - after fees : ", bondAssetsPostFeePreTax)
bondAssetsPostFeePostTax = int((income / infFeeBondYield)/(1.0-tax))
print("100% bond assets needed - after fees & taxes : ", bondAssetsPostFeePostTax)

Happy planning! I hope you’ve found these discussions helpful.

--

--

George McKee

Working on projects in cyber security strategy and computational neurophilosophy. Formerly worked at HP Inc. Twitter:@GMcKCypress