Created
March 6, 2018 16:27
-
-
Save bobular/ffd25244538db9daa92381b1efe8645c to your computer and use it in GitHub Desktop.
Slightly more complex pension funding model, which includes career progression
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
# -*- mode: cperl -*- | |
# | |
# The purpose of this little model is to figure out what kind of | |
# investment returns the pension fund needs to make in order to meet | |
# its defined benefits promises. | |
# | |
# It assumes a single employee with their own "pot" and a fixed payout | |
# period. I'm not suggesting euthanasia... Obviously in reality the | |
# longevity risk is shared by the many thousands of scheme | |
# members. I'm trying to keep this simple... | |
# | |
# Salary progresses through early career to a fixed level until | |
# retirement. A very simple career-averaged earnings approach is used | |
# to calculate the pension payout. | |
# | |
# This is 100% defined benefit. There is no 55k cap (as found in the | |
# USS scheme). | |
# | |
# ./pension-funding-model-v2.pl 0.04 0.26 0.04 35000 20 60000 20 3 0.5 0.02 25 | |
# | |
# 0.26 = C, fraction of salary contribution total (employer+employee) | |
# 0.04 = I, expected annual asset investment return (e.g. 4%) | |
# 35000 = S, starting salary | |
# 20 = X, number of years working with linear annual salary increments | |
# 60000 = T, salary after X years of increments | |
# 20 = Y, number of years working at fixed salary T until retirement | |
# 3 = L, salary multiple for lump sum payment | |
# 0.5 = P, fraction of career-averaged salary paid out in retirement | |
# 0.04 = J, expected annual asset return in drawdown period* | |
# 25 = Z, number of years retirement | |
# | |
# (* in a large and long-running scheme with good cashflow there is no | |
# need to de-risk and be more prudent here, but I give the option anyway) | |
# | |
# In the example above, with estimated 4% returns from buy-and-hold | |
# company share investments (reinvesting dividends), the scheme makes | |
# a 1.7m pound surplus for the fictional employee: | |
# | |
## Starting salary was 35000 and after 20y it was 60000 | |
## Career averaged salary over 40 years is 53437 | |
## Pot is 1232367 after 40y contributions at 26% of salary and 4% annual growth of pot | |
## Lump sum payout of 3 x career avg salary = 160312 upon retirement | |
## After 25y retirement paying out 50% of career-averaged salary, | |
## the pot (with 4% annual return) is 1700687 | |
# | |
# It breaks even comfortably also with 2% annual return on investments. | |
# | |
use strict; | |
use warnings; | |
my ($contrib, $growth, $start_salary, $years_1, $end_salary, $years_2, | |
$lump_multiple, $payout, $growth_2, $years_retired) = @ARGV; | |
my $pot = 0; | |
my $salary = $start_salary; | |
my $annual_increment = ($end_salary-$start_salary)/$years_1; | |
my $sum_salary = 0; # for calculating career-averaged salary | |
my $total_years = $years_1+$years_2; | |
for (1 .. $years_1) { | |
$pot *= 1+$growth; | |
$pot += $salary*$contrib; | |
$sum_salary += $salary; | |
$salary += $annual_increment; | |
} | |
for (1 .. $years_2) { | |
# same as above but without the annual increment | |
$pot *= 1+$growth; | |
$pot += $salary*$contrib; | |
$sum_salary += $salary; | |
} | |
printf "Starting salary was %d and after %dy it was %d\n", | |
$start_salary, $years_1, $salary; | |
my $career_averaged_salary = $sum_salary/$total_years; | |
printf "Career averaged salary over %d years is %d\n", | |
$total_years, $career_averaged_salary; | |
printf "Pot is %d after %dy contributions at %d%% of salary and %d%% annual growth of pot\n", | |
$pot, $total_years, $contrib*100, $growth*100; | |
my $lump_sum = $career_averaged_salary*$lump_multiple; | |
$pot -= $lump_sum; | |
printf "Lump sum payout of %d x career avg salary = %d upon retirement\n", | |
$lump_multiple, $lump_sum; | |
for (1 .. $years_retired) { | |
$pot -= $career_averaged_salary*$payout; | |
$pot *= 1+$growth_2; | |
} | |
printf "After %dy retirement paying out %d%% of career-averaged salary, the pot (with %d%% annual return) is %d\n", | |
$years_retired, $payout*100, $growth_2*100, $pot; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
So as pointed out here
https://twitter.com/GreyTranslation/status/971339962162532352?s=19
In theory the long term investment should all work out in the long run to fund the promises made, but you would need buffer assets to let you pay out pensions in the lean times without having to dip into your core assets.
However if 2% growth in theory pays for the benefits we are currently promised (as shown above) then the 4% growth you should get in practice should help build up such a buffer.