Last Updated: March 7, 2023
This week I’ve been implementing an idea I’ve had to further enhance the Tax and Penalty Minimization (TPM) withdrawal method, which I’ve been mentioning in previous posts for a while now.
But so far I’m not seeing very good results…
In the current version of the TPM method, when all the tax- and penalty-free withdrawal sources are depleted (e.g. original Roth contributions) and more cash for expenses is still needed, it employs a numerical integration approach that works by finding the lowest tax+penalty set of withdrawals each year of the simulation. And it always starts from the current totals for standard income and LT cap gains.
But one thing always nagged at me in the back of my mind: what if, instead of facing these taxes/penalties to get the cash we need, we could reduce standard income in the form of reduced pre-tax account withdrawals (usually set to the standard deduction) and increase LT cap gains in the form of increased post-tax account withdrawals?
In that case, the reduced standard income offsets the higher long term capital gains.
Why would that give us more cash without the same taxes though? Well, 100% of the pre-tax withdrawal is taxable standard income (beyond the standard deduction), but only a fraction of the post-tax lots are capital gains.
In other words, if we withdraw $100 from a pre-tax account (so $100 in standard income), we have $100 in cash. But if we withdraw enough from our post-tax account to face $100 in capital gains, we’ll get MORE than $100 in cash – sometimes much more, depending on what fraction of the post-tax lot is capital gains.
Thus I hoped that if I could put off taxes/penalties for a bit longer via this approach, that would lead to better overall end results – because the longer you put off that tax/penalty drag, the better (in general).
To implement this idea, I employed a numerical integration method similar to the method mentioned above, once again due to the considerable number of factors involved.
Eventually I might provide the code on github (assuming I eventually get better results than I’m seeing now), but for now I’ll give a broad description of the algorithm.
All the operations below are for each year in the simulation.
First I check to see if any pre-tax withdrawals (including 457(b)) happened that year, and that the post-tax account is not empty – otherwise there’s no reason to do this at all.
Then I start a while loop, which will loop until either a) enough cash has been generated, b) all the pre-tax withdrawals have been reversed, or c) the post-tax account is empty.
For each iteration of the while loop, I first attempt to withdraw enough post-tax funds to achieve $100 in capital gains. To do that, I sort the post-tax lots by capital gains percentage, and loop through them from the lowest percentage to highest percentage – thus hopefully maximizing the odds that enough cash will be generated. I keep looping through them until I have the $100 in capital gains (or until the post-tax account is empty).
Then I determine what the new tax bill is – if it hasn’t changed with this additional $100 in long term capital gains, there’s no reason to reduce the standard income (well, unless you need to keep your total income the same for ACA subsidies – see Future Work below).
If it is higher, then next we need to reduce the pre-tax withdrawal(s) by $100. If the withdrawal is not a 457(b) withdrawal and the simulated person is under 59.5, then we also need to undo the Roth conversion.
After that, we see how much cash we still need, and repeat the loop if needed.
Results So Far: Not Great
After coding up the new method and doing a variety of unit tests, I eagerly ran it for the first time in a full length simulation. And…. the results were not good.
“Must be a bug”, I thought. You nearly always have a good number of bugs the first time you build a new method, even with testing.
So I dove back into the code, looking for problems. And I did find some minor issues. But the results were never better than before – at best, they were equivalent to what I had before.
In fact, I had to search quite a bit to even find a scenario where this new code was even run – because most of the time when the tax and penalty free withdrawals ran out and more cash was needed, one of the following was true:
- the post-tax account was empty
- additional post-tax withdrawals did not produce higher taxes (because still within the 0% LT cap gains bracket)
So after trying a variety of changes to different scenarios to get this new code consistently running, I ended up starting with the Betty single-filer scenario that has a quite strenuous $69K of annual expenses, and increased the capital gains for each of the eight $50K post-tax lots from $15K to $40K.
Then to further simplify the scenario and make comparisons easier, I also shifted the $100K in Betty’s 457(b) account to her traditional IRA, and I set the dividend yields to zero.
So let’s now look at Betty’s assets over time, first with the new method off, then turning it on:
You can see how with the new method ON, Betty runs out of money at age 70 instead of 72 – so not only did the new method not help, it made her situation substantially worse!
Next let’s take a look at the yearly values such as income, cash levels, expenses, taxes, penalties, and RMDs:
Looking at the latter plot with the New Method on, you can see the impact of the new method at ages 42 through 49 – instead of a flat line of constant total standard income (as seen in the upper plot with the new method off), the total standard income is much lower. The opposite is true for the long term capital gains income – it’s much higher than the “new method off” scenario.
As a result, penalties (pink line) are a bit lower for the new method at ages 43 through 48. However, right after age 48, when the post-tax account is depleted, the penalties and taxes are MUCH HIGHER with the new method on until about age 53. Thus it seems like I’m getting higher OVERALL taxes and penalties through age 53, even if they are a bit smaller initially.
My leading suspect for this surprising result: because Roth conversions from the pre-tax account are dramatically reduced, that means less penalty free (and then tax free) money is available (via the Roth ladder) once the post-tax account is depleted. But I haven’t verified this yet.
You can see how RMDs are not really a factor though, at least in this scenario, because the scenario where the new method is on runs out of money before age 72 (and yes, I know I need to update that to age 73).
So far I haven’t found a single scenario where it improves the results. For most scenarios it has no impact (usually because the post-tax account is fully depleted by the time tax-free withdrawal sources are depleted), and in the rest it actually produces WORSE results. Bleh!
Understanding Why, Other Scenarios
I’d like to understand much better why I’m not seeing improved results. E.g., for the above scenario, is the new method reducing Roth conversions and thus it’s much more expensive to pull money from the Roth account later?
Perhaps when I better understand what’s going on, I’ll know what scenarios this new technique could produce improved results. Or at the very least have a much better sense of where to look. Ideally I’d be able to employ this new method in a stress testing analysis that looks at a variety of expenses / expense rates / ROI values like I did previously.
That said, I also don’t want to waste hours and hours on a method that may only provide an advantage in a few uncommon situations. At some point you have to cut your losses and recognize you’ve hit a dead end. That happens in research! But it’s still a valuable experience – knowing what DOESN’T work can be just as important as knowing what DOES.
ROI for Post-Tax Accounts With Dividends
One thing I noticed when I was testing different scenarios was that when the dividend yield was above zero, the results with the new method on were even worse than when the new method was off.
Then I realized that all this time I’ve been using the same ROI for taxable/brokerage funds (which I’m calling “post-tax” here) as tax-advantaged funds (pre-tax and Roth) – even though in tax-advantaged accounts the dividends are automatically reinvested.
So when the new method was on, the post-tax account was depleted even faster (trying to generate more cash for the same income), which meant fewer dividends. Which meant those dividends weren’t getting added on top of the standard historical 7% (after inflation) ROI each year. But they shouldn’t have in the first place, because that historical yield includes the impact of reinvesting dividends.
Thus, I need to subtract the dividend yield from the ROI that is applied to the post-tax account each year in the simulation. Yet another thing that’s obvious in retrospect that I should have done already. And I suspect it won’t be the last!
In the end, this new method might prove consistently useful only once I bring in ACA subsidies / health insurance cost as a factor.
Why? Because this new method can keep total income the same, even when delivering the same amount of cash. That means your subsidies won’t go down if you increase your LT cap gains (even if your tax bill is unaffected).
At this point I suspect the ability to retain ACA subsidies might be the only force powerful enough to make this new method a consistent winner. We’ll see.
Updating FIRE Withdrawal Strategy Algorithms Page
After I’ve determined if it’s ever useful to employ this new method and decide whether to keep it or not, I then need to update the FIRE Withdrawal Strategy Algorithms page to show the latest formulation I have for the TPM (and Traditional) methods. And perhaps either modify that page or create a new page/post that makes it as easy as possible to understand and execute the TPM method.
And as always, if you have ideas for future content, let me know!