mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-07 21:15:19 +03:00
doc: budgeting and forecasting how-to, demonstrating new features
This commit is contained in:
parent
8cd58b71ab
commit
aca82cf400
16
examples/budget.journal
Normal file
16
examples/budget.journal
Normal file
@ -0,0 +1,16 @@
|
||||
~ monthly from 2013/01
|
||||
Expenses:Food 500 USD
|
||||
Expenses:Health 200 USD
|
||||
Expenses:Home 2545 USD
|
||||
Expenses:Transport 120 USD
|
||||
Expenses:Taxes 4300 USD ;; Taken from monthly average report
|
||||
Income:US -10700 USD
|
||||
Assets:US
|
||||
|
||||
~ every Dec 20th from 2014
|
||||
Expenses:Food 500 USD ; Prize turkey, the biggest of the big
|
||||
Assets:US
|
||||
|
||||
~ 2014/11/17
|
||||
Assets:US
|
||||
Expenses:Food 6000 USD ; Birthday, lots of guests
|
323
site/budgeting-and-forecasting.md
Normal file
323
site/budgeting-and-forecasting.md
Normal file
@ -0,0 +1,323 @@
|
||||
# Budgeting and forecasting
|
||||
|
||||
Budgeting and forecasting allows you to keep better track of your expenses and future financial situation.
|
||||
If you write down your expectations of what your income/expenses/investment yields/etc should be, you can use them to:
|
||||
- check how far off are your expectations from reality (budgeting)
|
||||
- project your future account activity or balances (forecasting)
|
||||
|
||||
(This section uses examples/bcexample.hledger from hledger source repository).
|
||||
|
||||
## Periodic budget
|
||||
To start budgeting, you need to know what your average yearly or weekly expenditures are. Hledger could help you with that.
|
||||
Usually the interval for which you compute budget figures will be the same as the interval between
|
||||
your paychecks -- monthly or weekly.
|
||||
|
||||
Lets create monthly (-M) report for years 2013-2014 (-b 2013) of all
|
||||
top-level expense categories (--depth 2 Expenses), looking for average
|
||||
figures (-A) in the cost at the time of transaction (-B), limiting
|
||||
ourselves to USD transactions only, to save screen space:
|
||||
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -MBA -b 2013 --depth 2 Expenses cur:USD
|
||||
Balance changes in 2013/01/01-2014/10/31:
|
||||
|
||||
|| 2013/01 2013/02 2013/03 ... 2014/07 2014/08 2014/09 2014/10 Average
|
||||
====================++========================================...==================================================================
|
||||
Expenses:Financial || 4.00 USD 12.95 USD 39.80 USD ... 30.85 USD 21.90 USD 12.95 USD 4.00 USD 17.83 USD
|
||||
Expenses:Food || 396.46 USD 481.48 USD 603.32 USD ... 871.20 USD 768.23 USD 466.72 USD 83.00 USD 562.10 USD
|
||||
Expenses:Health || 290.70 USD 193.80 USD 193.80 USD ... 290.70 USD 193.80 USD 193.80 USD 96.90 USD 207.01 USD
|
||||
Expenses:Home || 2544.98 USD 2545.02 USD 2544.97 USD ... 2545.12 USD 2545.01 USD 2545.10 USD 0 2429.33 USD
|
||||
Expenses:Taxes || 5976.60 USD 3984.40 USD 4901.83 USD ... 5976.60 USD 3984.40 USD 3984.40 USD 1992.20 USD 4322.27 USD
|
||||
Expenses:Transport || 120.00 USD 120.00 USD 120.00 USD ... 0 120.00 USD 120.00 USD 120.00 USD 109.09 USD
|
||||
--------------------++----------------------------------------...------------------------------------------------------------------
|
||||
|| 9332.74 USD 7337.65 USD 8403.72 USD ... 9714.47 USD 7633.34 USD 7322.97 USD 2296.10 USD 7647.64 USD
|
||||
```
|
||||
|
||||
This report is rather wide and portion of it had been cut out for
|
||||
brevity. Most interesting column is the last one, it shows average
|
||||
monthly expenses for each category. Expenses in Food, Health, Home and
|
||||
Transport categories seem to roughly similar month to month, so lets
|
||||
create a budget for them.
|
||||
|
||||
Budgets are described with periodic transactions. Periodic transaction
|
||||
has `~` instead of date and period expression instead of description. In this case
|
||||
we want to create a monthly budget that will come into effect starting from January 2013,
|
||||
which will include income of 10000 USD that is partically spent on Food, Health, Home and Transport
|
||||
and the rest becomes our Assets:
|
||||
|
||||
```journal
|
||||
~ monthly from 2013/01
|
||||
Expenses:Food 500 USD
|
||||
Expenses:Health 200 USD
|
||||
Expenses:Home 2545 USD
|
||||
Expenses:Transport 120 USD
|
||||
Income:US -10700 USD ;; Taken as monthy average of Income account group
|
||||
Assets:US
|
||||
```
|
||||
|
||||
This transaction could be put into separate file (budget.journal) or
|
||||
could be kept in the main journal. Normally hledger will ignore it and
|
||||
will not include it in any computations or reports.
|
||||
|
||||
To put it into action, you need to add `--budget` switch to your balance invocation. If you do that,
|
||||
you would be able to see how your past expenses aligned with the budget that you just created. This
|
||||
time, lets not limit accounts in any way:
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -f budget.journal -MB -b 2013 --budget cur:USD
|
||||
Balance changes in 2013/01/01-2014/10/31:
|
||||
|
||||
|| 2013/01 2013/02 2013/03
|
||||
==========================++===========================================================================================================
|
||||
<unbudgeted>:Expenses || 5980.60 USD 3997.35 USD 4941.63 USD
|
||||
<unbudgeted>:Liabilities || 293.09 USD -147.51 USD -66.01 USD
|
||||
Assets:US || 1893.32 USD [26% of 7335 USD] 2929.77 USD [40% of 7335 USD] -3898.89 USD [-53% of 7335 USD]
|
||||
Expenses:Food || 396.46 USD [79% of 500 USD] 481.48 USD [96% of 500 USD] 603.32 USD [121% of 500 USD]
|
||||
Expenses:Health || 290.70 USD [145% of 200 USD] 193.80 USD [97% of 200 USD] 193.80 USD [97% of 200 USD]
|
||||
Expenses:Home || 2544.98 USD [100% of 2545 USD] 2545.02 USD [100% of 2545 USD] 2544.97 USD [100% of 2545 USD]
|
||||
Expenses:Transport || 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD]
|
||||
Income:US || -15119.10 USD [141% of -10700 USD] -10331.21 USD [97% of -10700 USD] -11079.40 USD [104% of -10700 USD]
|
||||
--------------------------++-----------------------------------------------------------------------------------------------------------
|
||||
|| -3599.95 USD -211.30 USD -6640.58 USD
|
||||
|
||||
```
|
||||
|
||||
Numbers in square brackets give you your budget estimate and percentage of it used by your real expenses. Numbers below 100% mean
|
||||
that you have some of your budget left, numbers over 100% mean that you went over your budget.
|
||||
|
||||
You can notice that actual numbers for Assets:US seem to be well below computed budget of 7335 USD. Why? Answer to this is in the first
|
||||
row of the report: we have quite a lot of unbudgeted Expenses!
|
||||
|
||||
Notice that even though we have not limited accounts in any way, report includes just those mentioned in the budget. This is on purpose,
|
||||
assumption is that when you are checking your budgets you probably do not want unbudgeted accounts getting in your way. Another thing to
|
||||
note is that budget numbers have been allocated to top-level expense subcategories (like Expenses:Food). Journal has subaccounts under
|
||||
Food, but to compute budget report they have all been rolled up into a nearest parent with budget number associated with it. Accounts that
|
||||
do not have such parent went into `<unbudgeted>` row.
|
||||
|
||||
Allright, it seems that for Jan 2013 we have ~3000 USD of budgeted expenses and almost twice as much unbudgeted. Lets figure out what they are.
|
||||
We can see more details if we add `--show-unbudgeted` switch:
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2013-01 -e 2013-02 --budget cur:USD --show-unbudgeted
|
||||
Balance changes in 2013/01:
|
||||
|
||||
|| 2013/01
|
||||
==================================++====================================
|
||||
Assets:US || 1893.32 USD [26% of 7335 USD]
|
||||
Expenses:Financial:Fees || 4.00 USD
|
||||
Expenses:Food || 396.46 USD [79% of 500 USD]
|
||||
Expenses:Health || 290.70 USD [145% of 200 USD]
|
||||
Expenses:Home || 2544.98 USD [100% of 2545 USD]
|
||||
Expenses:Taxes:Y2013:US:CityNYC || 524.76 USD
|
||||
Expenses:Taxes:Y2013:US:Federal || 3188.76 USD
|
||||
Expenses:Taxes:Y2013:US:Medicare || 319.86 USD
|
||||
Expenses:Taxes:Y2013:US:SDI || 3.36 USD
|
||||
Expenses:Taxes:Y2013:US:SocSec || 844.62 USD
|
||||
Expenses:Taxes:Y2013:US:State || 1095.24 USD
|
||||
Expenses:Transport || 120.00 USD [100% of 120 USD]
|
||||
Income:US || -15119.10 USD [141% of -10700 USD]
|
||||
Liabilities:US:Chase:Slate || 293.09 USD
|
||||
----------------------------------++------------------------------------
|
||||
|| -3599.95 USD
|
||||
|
||||
```
|
||||
|
||||
All the accounts that were rolled up into `<unbudgeted>` category are now shown with their original name, but budgeted accounts are still rolled up. It
|
||||
is easy to see now that we forgot taxes. Lets add them to our budget:
|
||||
```journal
|
||||
~ monthly from 2013/01
|
||||
Expenses:Food 500 USD
|
||||
Expenses:Health 200 USD
|
||||
Expenses:Home 2545 USD
|
||||
Expenses:Transport 120 USD
|
||||
Expenses:Taxes 4300 USD ;; Taken from monthly average report
|
||||
Income:US -10700 USD
|
||||
Assets:US
|
||||
```
|
||||
|
||||
Lets try again for a couple of month with this updated budget:
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2013-01 -e 2013-04 --budget cur:USD
|
||||
Balance changes in 2013q1:
|
||||
|
||||
|| 2013/01 2013/02 2013/03
|
||||
==========================++===========================================================================================================
|
||||
<unbudgeted>:Expenses || 4.00 USD 12.95 USD 39.80 USD
|
||||
<unbudgeted>:Liabilities || 293.09 USD -147.51 USD -66.01 USD
|
||||
Assets:US || 1893.32 USD [62% of 3035 USD] 2929.77 USD [97% of 3035 USD] -3898.89 USD [-128% of 3035 USD]
|
||||
Expenses:Food || 396.46 USD [79% of 500 USD] 481.48 USD [96% of 500 USD] 603.32 USD [121% of 500 USD]
|
||||
Expenses:Health || 290.70 USD [145% of 200 USD] 193.80 USD [97% of 200 USD] 193.80 USD [97% of 200 USD]
|
||||
Expenses:Home || 2544.98 USD [100% of 2545 USD] 2545.02 USD [100% of 2545 USD] 2544.97 USD [100% of 2545 USD]
|
||||
Expenses:Taxes || 5976.60 USD [139% of 4300 USD] 3984.40 USD [93% of 4300 USD] 4901.83 USD [114% of 4300 USD]
|
||||
Expenses:Transport || 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD]
|
||||
Income:US || -15119.10 USD [141% of -10700 USD] -10331.21 USD [97% of -10700 USD] -11079.40 USD [104% of -10700 USD]
|
||||
--------------------------++-----------------------------------------------------------------------------------------------------------
|
||||
|| -3599.95 USD -211.30 USD -6640.58 USD
|
||||
|
||||
```
|
||||
|
||||
Now unbudgeted amounts are much smaller and some of them could be dismissed as noise, and we can see that budget created is actually
|
||||
close enough to the real numbers, meaning that they are usually close to average that we put in our budget.
|
||||
|
||||
## Envelope budget
|
||||
|
||||
Budget report that we have used so far assumes that any unused budget amount for a given (monthly) period will not contribute to the
|
||||
budget of the next period. Alternative popular "envelope budget" strategy assumes that you put a certain amount of money into an envelope
|
||||
each month, and any unused amount stays there for future expenses. This is easy to simulate by adding --cumulative switch. Lets redo
|
||||
the last report with it:
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2013-01 -e 2013-04 --cumulative --budget cur:USD
|
||||
Ending balances (cumulative) in 2013q1:
|
||||
|
||||
|| 2013/01/31 2013/02/28 2013/03/31
|
||||
==========================++============================================================================================================
|
||||
<unbudgeted>:Expenses || 4.00 USD 16.95 USD 56.75 USD
|
||||
<unbudgeted>:Liabilities || 293.09 USD 145.58 USD 79.57 USD
|
||||
Assets:US || 1893.32 USD [62% of 3035 USD] 4823.09 USD [79% of 6070 USD] 924.20 USD [10% of 9105 USD]
|
||||
Expenses:Food || 396.46 USD [79% of 500 USD] 877.94 USD [88% of 1000 USD] 1481.26 USD [99% of 1500 USD]
|
||||
Expenses:Health || 290.70 USD [145% of 200 USD] 484.50 USD [121% of 400 USD] 678.30 USD [113% of 600 USD]
|
||||
Expenses:Home || 2544.98 USD [100% of 2545 USD] 5090.00 USD [100% of 5090 USD] 7634.97 USD [100% of 7635 USD]
|
||||
Expenses:Taxes || 5976.60 USD [139% of 4300 USD] 9961.00 USD [116% of 8600 USD] 14862.83 USD [115% of 12900 USD]
|
||||
Expenses:Transport || 120.00 USD [100% of 120 USD] 240.00 USD [100% of 240 USD] 360.00 USD [100% of 360 USD]
|
||||
Income:US || -15119.10 USD [141% of -10700 USD] -25450.31 USD [119% of -21400 USD] -36529.71 USD [114% of -32100 USD]
|
||||
--------------------------++------------------------------------------------------------------------------------------------------------
|
||||
|| -3599.95 USD -3811.25 USD -10451.83 USD
|
||||
|
||||
```
|
||||
|
||||
If you look at Expenses:Food category, you will see that every month budget is increased by 500 USD, and by March total amount budgeted
|
||||
is 1500 USD, of which 1481.26 USD is spent. If you look back at the previous non-cumulative monthly budget report, you will see that in March food expenses
|
||||
were 121% of the budgeted amount, but cumulative report shows that taking into account budget carry-over from Jan and Feb we are well withing planned numbers.
|
||||
|
||||
# Forecasting
|
||||
|
||||
Budget transaction that was created could be used to predict what would be our financial situation in the future. If you add `--forecast` switch, you will
|
||||
see how budgeted income and expense affects you past the last transaction in the journal. Since journal ends in Oct 2014, lets see next two month:
|
||||
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD
|
||||
Balance changes in 2014q4:
|
||||
|
||||
|| 2014/10 2014/11 2014/12
|
||||
====================================++======================================
|
||||
Assets:US || 0 3035 USD 3035 USD
|
||||
Assets:US:BofA:Checking || -2453.40 USD 0 0
|
||||
Assets:US:ETrade:Cash || 5000.00 USD 0 0
|
||||
Expenses:Financial:Fees || 4.00 USD 0 0
|
||||
Expenses:Food || 0 500 USD 500 USD
|
||||
Expenses:Food:Restaurant || 83.00 USD 0 0
|
||||
Expenses:Health || 0 200 USD 200 USD
|
||||
Expenses:Health:Dental:Insurance || 2.90 USD 0 0
|
||||
Expenses:Health:Life:GroupTermLife || 24.32 USD 0 0
|
||||
Expenses:Health:Medical:Insurance || 27.38 USD 0 0
|
||||
Expenses:Health:Vision:Insurance || 42.30 USD 0 0
|
||||
Expenses:Home || 0 2545 USD 2545 USD
|
||||
Expenses:Taxes || 0 4300 USD 4300 USD
|
||||
Expenses:Taxes:Y2014:US:CityNYC || 174.92 USD 0 0
|
||||
Expenses:Taxes:Y2014:US:Federal || 1062.92 USD 0 0
|
||||
Expenses:Taxes:Y2014:US:Medicare || 106.62 USD 0 0
|
||||
Expenses:Taxes:Y2014:US:SDI || 1.12 USD 0 0
|
||||
Expenses:Taxes:Y2014:US:SocSec || 281.54 USD 0 0
|
||||
Expenses:Taxes:Y2014:US:State || 365.08 USD 0 0
|
||||
Expenses:Transport || 0 120 USD 120 USD
|
||||
Expenses:Transport:Tram || 120.00 USD 0 0
|
||||
Income:US || 0 -10700 USD -10700 USD
|
||||
Income:US:Hoogle:GroupTermLife || -24.32 USD 0 0
|
||||
Income:US:Hoogle:Salary || -4615.38 USD 0 0
|
||||
Liabilities:US:Chase:Slate || -203.00 USD 0 0
|
||||
------------------------------------++--------------------------------------
|
||||
|| 0 0 0
|
||||
```
|
||||
|
||||
Note that this time there is no roll-up of accounts. Unlike `--budget`, which could be used with `balance` command only, `--forecast`
|
||||
could be used with any report. Forecast transactions would be added to your real journal and would appear in the report you requested as
|
||||
if you have entered them on the scheduled dates.
|
||||
|
||||
Since quite a lot of accounts do not have any budgeted transactions, lets limit the depth of the report to avoid seeing lots of zeroes:
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD --depth 2
|
||||
Balance changes in 2014q4:
|
||||
|
||||
|| 2014/10 2014/11 2014/12
|
||||
====================++======================================
|
||||
Assets:US || 2546.60 USD 3035 USD 3035 USD
|
||||
Expenses:Financial || 4.00 USD 0 0
|
||||
Expenses:Food || 83.00 USD 500 USD 500 USD
|
||||
Expenses:Health || 96.90 USD 200 USD 200 USD
|
||||
Expenses:Home || 0 2545 USD 2545 USD
|
||||
Expenses:Taxes || 1992.20 USD 4300 USD 4300 USD
|
||||
Expenses:Transport || 120.00 USD 120 USD 120 USD
|
||||
Income:US || -4639.70 USD -10700 USD -10700 USD
|
||||
Liabilities:US || -203.00 USD 0 0
|
||||
--------------------++--------------------------------------
|
||||
|| 0 0 0
|
||||
```
|
||||
|
||||
As you can see, we should expect 3035 USD to be added into Assets:US each month. It is quite easy to see how overal amount of Assets will change with time if you use
|
||||
`--cumulative` switch:
|
||||
```shell
|
||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD --depth 2 --cumulative
|
||||
Ending balances (cumulative) in 2014q4:
|
||||
|
||||
|| 2014/10/31 2014/11/30 2014/12/31
|
||||
====================++============================================
|
||||
Assets:US || 2546.60 USD 5581.60 USD 8616.60 USD
|
||||
Expenses:Financial || 4.00 USD 4.00 USD 4.00 USD
|
||||
Expenses:Food || 83.00 USD 583.00 USD 1083.00 USD
|
||||
Expenses:Health || 96.90 USD 296.90 USD 496.90 USD
|
||||
Expenses:Home || 0 2545 USD 5090 USD
|
||||
Expenses:Taxes || 1992.20 USD 6292.20 USD 10592.20 USD
|
||||
Expenses:Transport || 120.00 USD 240.00 USD 360.00 USD
|
||||
Income:US || -4639.70 USD -15339.70 USD -26039.70 USD
|
||||
Liabilities:US || -203.00 USD -203.00 USD -203.00 USD
|
||||
--------------------++--------------------------------------------
|
||||
|| 0 0 0
|
||||
```
|
||||
|
||||
According to forecast, assets are expected to grow to 8600+ USD by the end of 2014. However, our forecast does not include a couple
|
||||
of big one-off year end expenses. First, we plan to buy prize turkey for the Christmas table every year from 2014, spending up to 500 USD on it.
|
||||
And on 17th Nov 2014 we would celebrate birthday of significant other, spending up to 6000 USD in a fancy restaurant:
|
||||
```journal
|
||||
~ every 20th Dec from 2014
|
||||
Expenses:Food 500 USD ; Prize turkey, the biggest of the big
|
||||
Assets:US
|
||||
|
||||
~ 2014/11/17
|
||||
Assets:US
|
||||
Expenses:Food 6000 USD ; Birthday, lots of guests
|
||||
```
|
||||
|
||||
Note that turkey transaction is not entered as "yearly from 2014/12/20", since yearly/quarterly/monthy/weekly periodic expressions always generate
|
||||
entries at the first day of the calendar year/quarter/month/week. Thus "monthly from 2014/12" will occur on 2014/12/01, 2015/01/01, ..., whereas
|
||||
"every 20th of month from 2014/12" will happen on 2014/12/20, 2015/12/20, etc.
|
||||
|
||||
With latest additions forecast now looks like this:
|
||||
```shell
|
||||
hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD --depth 2 --cumulative
|
||||
Ending balances (cumulative) in 2014q4:
|
||||
|
||||
|| 2014/10/31 2014/11/30 2014/12/31
|
||||
====================++============================================
|
||||
Assets:US || 2546.60 USD -418.40 USD 2116.60 USD
|
||||
Expenses:Financial || 4.00 USD 4.00 USD 4.00 USD
|
||||
Expenses:Food || 83.00 USD 6583.00 USD 7583.00 USD
|
||||
Expenses:Health || 96.90 USD 296.90 USD 496.90 USD
|
||||
Expenses:Home || 0 2545 USD 5090 USD
|
||||
Expenses:Taxes || 1992.20 USD 6292.20 USD 10592.20 USD
|
||||
Expenses:Transport || 120.00 USD 240.00 USD 360.00 USD
|
||||
Income:US || -4639.70 USD -15339.70 USD -26039.70 USD
|
||||
Liabilities:US || -203.00 USD -203.00 USD -203.00 USD
|
||||
--------------------++--------------------------------------------
|
||||
|| 0 0 0
|
||||
```
|
||||
|
||||
It is easy to see that in Nov 2014 we will run out of Assets. Using `register` we can figure out when or why it would happen:
|
||||
```shell
|
||||
$ hledger register -f bcexample.hledger -f budget.journal -b 2014-10 -e 2014-12 --forecast cur:USD Assets
|
||||
2014/10/04 "BANK FEES" | "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD -4.00 USD
|
||||
2014/10/09 "Hoogle" | "Payroll" Assets:US:BofA:Checking 2550.60 USD 2546.60 USD
|
||||
2014/10/10 "Transfering accumulated savings to o.. Assets:US:BofA:Checking -5000.00 USD -2453.40 USD
|
||||
Assets:US:ETrade:Cash 5000.00 USD 2546.60 USD
|
||||
2014/11/01 Forecast transaction Assets:US 3035 USD 5581.60 USD
|
||||
2014/11/17 Forecast transaction Assets:US -6000 USD -418.40 USD
|
||||
```
|
||||
|
||||
It is 6000 USD planned for birthday! Something will have to be done about the birthday plans.
|
Loading…
Reference in New Issue
Block a user