When I quit my job in 2011 I wrote a program to simulate retirement and give me a feel for the odds that we would be able to survive on the money we’d saved. The program used a Monte Carlo approach to simulate thousands of possible market scenarios and had logic for how we would spend money, collect social security, pay taxes, etc. At the time the program said that we had an 85% chance of outliving our money. That was good enough to quit; knowing that we could go back to work if we had to.
Since writing that program I’ve come back to it every few years to put in more recent data and make improvements. Once my spouse and I got married, I took out a bunch of code that split expenses and taxes between the two of us.
A few months ago I decided to give the program a full makeover and add features to make it useful to more people. The original program was very specific to our situation and didn’t handle account types, expenses, and investments that we didn’t have. Along with adding new features, I needed to make the program much more user friendly and error tolerant.
I’ve completed this project, and the program (and source) are available for download. It still doesn’t handle nearly as many situations as I’d like, and it has very little support for people who are still working, but it is good enough to release.
Continue reading “SimRetirement update and release”
The SimFinance application is mostly done.
As is always the case, the software was more complex than I thought it would be. The main complications were due to the fact that my partner and I aren’t married. So the application had to try to optimize who paid the bills to manage the size of each of our accounts and how much taxes we each had to pay. The other big complication was trying to manage our traditional and Roth IRAs to minimize taxes each year.
There are some big things yet to do:
- Come up with a model for stock dividends. Right now, dividends are simply included in the return of the S&P. However, that is not really accurate, as the yield of dividends lags behind changes in stock prices. Also, taxes are due on dividends the year they are paid instead of the year the stock is sold. Those two differences may end up balancing each other out in the overall results.
- Investment strategy comparison. Would dividing our money between bonds, i-bonds, and stocks be better overall than having everything in stocks? Does the reduction in volatility pay off? Or is it better to just accept the volatility and maximize returns?
- More optimization post 60. The order of IRA withdraws should change after 60. Need to model medicare.
The model is giving us an 85% chance of success right now. I don’t really think that the things that are left to do will change this number significantly. It is surprising how much money we have to have to get a 95% chance of success and how much variation there is in the possible outcomes.
It is possible that treating the S&P 500 as a random distribution is wrong. While the historic data looks random, there probably are some underlying “fundamentals” that keep the stock prices within a range. I am not sure how to add that to the model besides trying to put an overall cap on the market returns.
I have been working on the SimFinance 2.0 application and have been struggling to find a way to simulate the stock market. (Note: I am not trying to predict the stock market, I just need a way to generate a random stock market return that is similar to historic returns)
My first idea was to use a normal distribution centered around the average return with the same standard deviation that the real data has. This was close to correct, but if I plotted sample returns from history against the normal distribution, the historical returns had much longer tails. Meaning that, in reality, there are more really bad and really good years than there would be in a normal distribution.
After doing some research (I am not the only one interested in simulating the stock market), I found that some people are using a Student-t distribution. After playing with the parameters of that distribution I was able to get a much more realistic curve. Based on the historical data for the S&P 500, I am using the following parameters for the distribution: DOF = 3.40234, SCALE = 35, OFFSET = 0.00725
In software, I am using the boost library to generate random numbers according to the student-t distribution.
I am starting work on SimFinance 2.0.
A long time ago, I tried to create a retirement analyzer/simulator. It would allow a user to enter everything about their finances, including their plans for the future. It then simulated the future by generating thousands of possible scenarios and displaying your odds of still having money when you die. It built these futures probabalistically based on historic performance of different investment types, the user’s life expectancy, etc. The project was too ambitious and I never completed it.
Now, as I consider retirement, I’d like to have this tool. And I realized that I could complete the project if I would limit the scope to just my own situation. It wouldn’t be useful for other people, but it would give me a better idea if I can really retire.
The old project was created with C++ and wxWidgets. I would like to build the new version in C# because it would be easier to create the user interfaces. But C++ would be faster for simulating thousands of futures month by month. It would also let me re-use some of the code from the original project. So I am going to compromise and build it with C++/CLI. I can use the GUI builder and the .NET libraries and also have the speed of native C++ for the time critical parts of the code.