When I first made the python version of the net worth spreadsheet, I used a function like this:
def netWorthByAge( ages, savingsRate = 0.18, startingNetWorth = 10000, startingSalary = 40000, raises = 0.025, marketReturn = 0.06, inflation = 0.02, retirementAge = 65 ):
You could pass in parameters, but only constants. This is how the spreadsheet works as well—each cell contains a constant.
The first thing to do to make it more flexible is to use a lambda instead for the
marketReturn = (lambda age: 0.06),
Then, when you use it, you need to call it like a function:
netWorth = netWorth * (1 + marketReturn(age - 1)) + savings
We use last year’s market return to grow your current net worth and then add in your new savings.
The default function is
(lambda age: 0.06)
This just says that 0.06 is the return at every age, so it’s effectively a constant.
But, instead, we could use historical market data. You can see this file that parses the TSV market data file and gives you a simple function to look up a historical return for a given year.
Then, I just need to create a lambda that looks up a market rate based on the age and starting year:
mktData = mktdata.readMktData() for startingYear in range(fromYear, toYear, 5): scenario = networth.netWorthByAge(ages = ages, savingsRate = savingsRate, marketReturn = (lambda age: mktdata.mktReturn(mktData, age, startingYear = startingYear)) )
And this will create a scenario (an array of doubles representing net worth) for each year in the simulation.
You can download and run the code to play with it. Here’s a sample chart it generates:
There are lines for starting the simulation in 1928, 1933, 1938, 1943, 1948, 1953, and 1958. This gives you an idea of the expected range of possibilities.