Improvements
Notes
Roth 401k vs. savings account:
- Roth: don't pay taxes on any dividends or gains
- Savings account: pay yearly taxes on dividends and pay taxes on gains when withdraw
In [5]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from collections import defaultdict
%matplotlib inline
In [29]:
starting_balance = 0
max_contrib_401k = 19000
roth_fraction = 1
annual_401k_fee = .007
tax_rate_now = .3
tax_rate_old = .2
annual_roi = .06
annual_dividend = .02
inflation = .03
In [40]:
# Compute balance over time for roth 401k
balance_dict = defaultdict(list)
N_years = 30
for y in np.arange(N_years+1):
if y == 0:
money_added, gains_savings, gains_401k, new_balance_savings, new_balance_401k, fees, dividend_tax = 0, 0, 0, 0, 0, 0, 0
else:
if y <= 2:
money_added = max_contrib_401k
else:
money_added = 0
gains_savings = balance_dict['y_balance_savings'][-1] * annual_roi
dividend_tax = balance_dict['y_balance_savings'][-1] * annual_dividend * tax_rate_now
new_balance_savings = balance_dict['y_balance_savings'][-1] + gains_savings + money_added - dividend_tax
gains_401k = balance_dict['y_balance_401k'][-1] * annual_roi
new_balance_401k = balance_dict['y_balance_401k'][-1] + gains_401k + money_added
fees = new_balance_401k * annual_401k_fee
balance_dict['y_added'].append(money_added)
balance_dict['y_gains_savings'].append(gains_savings)
balance_dict['y_gains_401k'].append(gains_401k)
balance_dict['y_balance_savings'].append(new_balance_savings)
balance_dict['y_balance_401k'].append(new_balance_401k - fees)
balance_dict['y_fees'].append(fees)
balance_dict['y_dividend_tax'].append(dividend_tax)
balance_dict['years'].append(y)
df = pd.DataFrame(balance_dict)
In [41]:
df
Out[41]:
In [42]:
# TODO: Compute tax on gains at end of period
final_balance_savings = df['y_balance_savings'].values[-1]
final_balance_401k = df['y_balance_401k'].values[-1]
money_input = df['y_added'].sum()
dividends_earned = df['y_dividend_tax'].sum() / tax_rate_now
balance_tax_paid = final_balance - money_input - dividends_earned
tax_owed_on = final_balance - balance_tax_paid
tax_owed = tax_owed_on * tax_rate_old
print('tax owed:', tax_owed)
print('difference between fees and dividends paid:', final_balance_savings - final_balance_401k)
In [ ]:
# TODO: incorporate tax on dividends into savings