On Personal Finance
Managing money is not something that schools teach, some parents might not even teach as they do not fully understand the implications of money and what it can do for you. Most people understand that saving money is a virtue, but do you really know what you are doing with your money? In this day and age, it is very easy to spend money without knowing where it goes. Do you know your monthly expenses? Yearly? When are you fully financially independent? How much do you need to retire? When can you retire? To answer these questions, we must first know what we are doing with our money and what is our financial health like.
Observability
Understanding which stage of wealth is important to know how well you are prepared for any event; be it retirement, something as unfortunate as a retrenchment, or maybe just a break in your career. This chart shows roughly what the measurement should be.
Problem with this is that, how are you tracking the following variables?
- Asset
- Debt and other liabilities
- Annual expenses
- Income
- Emergency funds
- Liquid/Non liquid assets
You could do it with a spreadsheet but it seems rather tedious, so you might take some shortcuts and not record every single dollar you spent. Imagine how big your spreadsheet would be if you were to record every single transaction you made in your life.
This was the motivation for me to build one of the applications that I use everyday.
Tracking everything that has to do with money
I have a Grafana board to track everything I do with my money. Here's a sample I use with the Financials application.
I do various things to make sure my data is accurate. Some events happen on a monthly basis and some happen on a daily basis.
Daily recording into Financials application
On a daily basis, I record all expenditure that is done using cash or a bank transfer (i.e. PayNow/PayLah). Credit card spends are nicely given in a CSV file by the bank that I use so I just wrote a parser to aggregate it into a monthly spend value. Sometimes when you go out with friends, someone will foot the bill first and pay you back via a bank transfer, so you have to record these reimbursements as well. Things got a little more complicated when you have a spouse and have shared expenditure, so that has to be recorded into daily spend as well. But since we count our own involvment, the value has to be based on your contribution.
At first, I used to send a message to myself on Telegram whenever I did one such transaction. Here's an example on how I would send myself messages.
- john reimburse $10 lunch
- dinner jane doe $20
- $5 washing machine pipe
- ...
On the first of every month, I would reconcile all these messages and aggregate it into a monthly value with the following classifications for expenditure:
- Credit card
- Others (cash spending/bank transfers)
- Reimbursements
- Special Bank transfers like Tax/Insurance/etc that happen on a monthly basis
For some time, this was managable as I did not go out much and used very little cash. But when I started living on my own, I had to use a lot of cash and every month I was parsing through 100s of messages. This became a chore and I decided to improve on my collection method. So I built a Telegram bot that helps to parse this information and aggregate it monthly. Here's what it looks like.
I needed to standardise how I formed these messages, so I decided to write a small hand written parser to parse and record the information. The grammar looks something like this.
Add a transaction
ADD <TYPE> <CLASSIFICATION> <PRICE (no $ sign)> <Optional date (will automatically fix to yyyy-mm-dd)>
Type | Explanation |
---|---|
reim | Amount to be reimbursed, usually paying first using CC and friends paying back later. |
shared reim | Amount to be reimbursed, usually paying first using CC and taking from shared account. |
special shared reim | Amount to be reimbursed, usually paying first using CC and taking from shared account, not counting into regular spend. |
shared | Amount that is shared but other party had paid first. |
special shared | Amount that is shared but other party had paid first and it's a one off thing. |
own | Regular type of spending for ownself. |
special own | Amount that is spent for myself but special events. |
tithe | Amount given to parents. |
cc | Amount paid using credit card. |
tax | Amount paid to the tax man. |
insurance | Amount spent for insurance. |
Delete a transaction
DEL <ID>
Generating a monthly report
GEN <Month>-<Year>
It's really neat and it is a tool I use everyday to collect my daily expenditure. This is also integrated into my financials application to generate the graph on Grafana on a monthly report basis. However, I would still have to parse the CSV information on my credit card and manually key it into the Telegram bot to display this information. The same for tax/insurance/parent's allowance. The Telegram bot code can be found here.
In terms of the observability of the expenditure, it would look something like this:
Monthly recordings into application
While credit card/tax/insurance/parent's allowance is done via the Telegram bot app, there are some information that I do on a monthly basis. This includes NAV of stocks/bonds, amount in the bank/SRS account/CPF accounts. These are easily checked and manually keyed in on the first of every month. There might be plans to automate them but I do not see it as a high priority as of now. It is rather easy to retrieve all these information on the bank phone app as well as the Singpass app. The stock monthly NAV value is automated and gets recorded at the start of every month.
Assets are recorded like this.
date,type,amount
2020-03-31,CPF,1000
2020-03-31,Bank,20000
2020-03-31,OA,20000
2020-03-31,SA,10000
2020-03-31,Medisave,10000
And it will look like this.
Income is also recorded monthly. This is used to understand our savings rate.
date,type,amount
2021-03-11,Base,500
2021-03-11,CPF,500
2021-03-11,Bonus,200
2021-03-11,CPF Bonus,200
Fully automated
While stock trades are recorded manually into the Financials application, tracking the historical value of the NAV on a daily basis is automated.
A sample trade CSV would look something like this:
date_purchased,symbol,trade_type,price_each,quantity
2021-03-11,IWDA.LON,buy,76.34,250
As you can see in this part of the chart, this is how the stock performance will look like.
One off recordings
Buying a house has relatively simple calculations. Mortgage values are consistent, so if you know how much you are borrowing, as well as the length of the mortgage and interest rates, you can calculate the payment schedule easily. It does not count into my expenditure as I am using purely CPF to pay for my house. However, things might change when cash is involved as well. Till then, I will not update the code to handle that situation. Here's how it looks like.
For this one off configuration, this is how it looks like.
mortgages:
- total: 50000.0
mortgage_first_payment: 2022-10-10
mortgage_duration_in_years: 25
mortgage_end_date: 2047-10-10
interest_rate_percentage: 2.6
downpayments:
- date: 2021-10-10
sum: 1000.0
- date: 2021-12-12
sum: 20000.0
Future plans for this application
Whenever I see a lacking feature, I will write it out. As of now, this is mainly for personal use. So I would only write the features that I see value in. I might consider some quality of life feature upgrades when I have the time, such as:
- Automating and parsing credit card spending
- Pulling CPF account information automatically
All in all
It is really tedious to record and understand your daily expenditure. Without observability, it is really hard to understand what you are spending on and how much you are truly saving. Recording information like this is extremely valuable as you can adjust your lifestyle accordingly and know if it is a sustainable one.