With apologies to my pensions actuary friends - saving for a pension is rarely anyone’s idea of a great time.
But sometimes there are great incentives:
Employers might match your contributions - either because employment laws make them, or else because a good pension package helps to attract and retain talent (or both)
Governments might provide tax incentives - around the world populations are ageing, and governments should prefer a financially independent retiring population
Compound returns - though certainly not guaranteed, compound returns can work like magic ✨ over a long pension savings horizon
For as long as I’ve needed to think about pension savings, it’s helped me to draw a picture 🖼️
We want to visualize saving for a pension - with some nice incentives
Let’s suppose you save € 1,000 each year from age 50
For retirement at age 65
In the end you, you’ll have saved € 15,000 🎉
But: we hope your savings will grow with compounding returns
md`Assuming **${d3.format('.1%')(unit_growth_rate_in)} compound returns** each year`
You may also get tax relief on the amounts you save: reducing the effective cost
In Ireland the value of tax relief depends on the amount of tax you pay: which in turn depends on how much you earn
Here I include a tax relief allowance for an individual earning €
// some reactive issue causing trigger to fail? moved @cr-pens to :::{focus-on="cr-pens"} but didn't help !md`The tax relief is <span class="m">**€ ${/*model.js.empee_contribution_tax_relief({...cursor__1, age_in: 60})*/400}**</span> so that the <span class="cell-hl cost">effective cost</span> of saving <span class="m">**€ 1,000**</span> is just <span class="m">**€ ${/*model.js.empee_contribution_cost({...cursor__1, age_in: 60})*/600}**</span>`
Now let’s suppose your employer matches 100% of your contributions
Then you benefit from more contributions and more compound returns
Now we can see that a little effective cost
Can result in lots more value
Compound returns, tax relief, and employer matching can be extremely valuable for pension savings.
But it’s hopeful to think that money will accumulate, untouched by charges 💸
Suppose there is a 5% charge on contributions
And a management charge of 1% - deducted from the savings balance each year
Now we can interpret the value of our pension savings as the area under inflows 💰 minus the area under outflows 💸
At this level of charges, we can still see a lot of value
🏖️
So far, we assumed saving starts at age 50.
What if saving started earlier? 🤔
Over a longer period, the value of compound returns is more apparent ✨
Here in fact, the value from the first 10 years of saving is more than the value from the following 15 years
✨
//md`**${d3.format('.1%')(unit_growth_rate_in)}**`//md`**${d3.format(',.0f')(salary_0_in)}** salary`// check_cfs_vs_fund_value is weakened as a checkviz =embed('#viz',spec, {renderer:'svg',actions:false,tooltip:false});
This illustrated pension savings projection includes features that may be valuable, but they are not applicable to everyone
I used a 6% compound returns assumption, but there’s no such thing as guaranteed outcomes at rates such as 6%. In a separate post: Visualizing Risk, I illustrate a wider set of outcomes.
Even when there is tax relief to save for a pension, this doesn’t mean that there aren’t taxes on pension income after retirement1
There are usually additional rules about how pension savings can be used after retirement
In other words: for help to understand pensions-related issues you should speak to a financial advisor who can understand your particular circumstances and communicate suitable choices. This blog post isn’t financial advice ⚠️
formulas and custom projections 🔍
I use calculang: a language for calculations, to describe the pensions calculator and income tax calculations used here.
import {spec as spec_} from'./spec.js'spec =spec_(width, y)
viz.view.data('data', [...data]).resize().run();
window.dispatchEvent(newEvent('resize'));// without this, my own focus-on blocks don't get triggered (for some reason only my ones - OJS Variables ones work)// They work when I resize. So triggering this programmatically.
// I need ojs blocks to be inside focus-on blocks, or they break a triggere = d3.sum(data.filter(d => d.input_cursor_id==1&& d.formula=="empee_contribution_cost"), d => d.value)
{for (const el ofdocument.getElementsByClassName('cr-column-screen')) { el.classList.remove('cr-column-screen')}}