Beancount 系列一: 一次复式记账实践
偶尔看到了复式记账这个概念,对精细记账的我而言很受用,我这里从一次个人实践的角度来说明一下复式记账的使用。
本篇文章是一个从零开始的个人实践记录,供同样使用Beancount的人做参考。本文内容基于读者对复式记账和Beancount语法有一定了解的情况下撰写的,关于复式记账的概念和一些诸多基本功能介绍,可以参考阅读以下文章:
- 文本记账综述、复式记账开源工具比较
- Beancount复式记账(一):为什么
- Beancount —— 命令行复式簿记
- beancount 简易入门指南
- 钱都到哪儿去了 - 使用 BEANCOUNT 自动记账
开始!
安装使用
Beancount是一个Python实现的开源工具,在本地即可运行,首先从PyPI获取:
1 | pip install beancount fava |
其中beancount
是核心包,包含核心的命令行工具;fava
是网页可视化工具,这里是一个fava示例账本 ,对应的Beancount源代码可以在Bitbucket上下载
在命令行中使用 fava example.beancout
即可看到
1 | Running Fava on http://localhost:5000 |
打开浏览器即可看到可视化账本
文件结构
Beancount支持 include
语法来拓展账簿,我个人采用按时间划分文件,辅之特殊事件(比如旅游)单独记录的方法,目录结构如下:
1 | . |
账户信息设置
首先要定义账户,Beancount系统中预定义了五个分类:
Assets 资产
我按照账户类型:国家:金融机构名字:具体账户
的策略划分,时间是开户时间,比如1
2
3
42019-01-01 open Assets:Cash:USD USD ; 现金
2019-01-01 open Assets:Bank:CN:BoC CNY:C1111 ; 中国银行卡
2019-01-01 open Assets:Broker:US:IB USD, JPY, CHF ; 股票
2019-01-01 open Assets:Points:Airline:JAL P_JAL ; 点数有一类针对AA付款或者个人向自己借款的账户,也需要及时补充和记录
1
2019-09-01 open Assets:Receivables:X ; 对X的应收款项
Liabilities 负债
我主要是信用卡和向他人借款的账户,比如1
22019-09-01 open Liabilities:Payable:X ; 对X的债务
2019-09-01 open Liabilities:CreditCard:CN:BoC:C1111 CNY ; 信用卡Equity 权益(净资产)
目前只有一个用于平衡开户的时候账户资金的权益,1
1990-01-01 open Equity:Opening-Balances
Expenses 支出
支出就非常的多样化,比如1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
162019-01-01 open Expenses:Food:Dinner
2019-01-01 open Expenses:Food:Lunch
2019-01-01 open Expenses:Food:Breakfast
2019-01-01 open Expenses:Food:Fruits
2019-01-01 open Expenses:Food:Drinks
2019-01-01 open Expenses:Food:Snack ; 零食
2019-01-01 open Expenses:Show:Movie ; 电影
2019-01-01 open Expenses:Show:Drama ; 话剧
2019-01-01 open Expenses:Show:Concert ; 演唱会
2019-01-01 open Expenses:Show:Opera ; 歌剧
2019-01-01 open Expenses:Show:Musical ; 音乐剧
2019-01-01 open Expenses:Transport:Airline
2019-01-01 open Expenses:Transport:Railway ; 铁路,含高铁
2019-01-01 open Expenses:Transport:Subway ; 地铁
2019-01-01 open Expenses:Transport:Bus
2019-01-01 open Expenses:Transport:Taxi等等…
- Income 收入
收入也可以根据自己的实际收入来源来建立账户,比如1
22019-01-01 open Income:Salary
2019-01-01 open Income:Rebate
主文件设置
然后设置主文件main.bean
内容,主文件任务是设置全局变量,然后去涵盖各个子账本:
1 | option "title" "取个霸气的名字吧" ; 账簿名称 |
账户初始余额设置
在开始记账前,要设置每个账户的余额信息,采用以下方法来给每个账户设置余额/借记账单:
1 | 2019-01-01 pad Assets:Bank:CN:BoC:C1111 Equity:Opening-Balances ; 从Opening-Balances中划取XX帐到银行卡中 |
该语句的含义是无论Assets:Bank:CN:BoC:C1111
之前余额多少,在2019年1月2日开始之前都调整到xxx.xx CNY,差额从Equity:Opening-Balances来。注意两行之间差一天的时间,balance
断言界定为当天开始;一般储蓄卡余额为正,信用卡余额为负;
记账
基本记账,记账语法为:
1
2
3
4
5YYYY-mm-dd * ["Payee"] "Narration"
posting 1
posting 2
posting 3
...比如
1
2
3
4
52019-01-01 * "Walmart" "在超市买两件衣服和晚餐"
Expenses:Clothing 20 USD
Expenses:Clothing 10 USD
Expenses:Food:Dinner 10 USD
Liabilities:CreditCard:US:Discover -40 USD多货币转换
使用@@
作为货币转换即可,货币Beancount会进行汇率计算,比如1
2
32019-01-01 * "日本航空" "纽约-东京"
Expenses:Transport:Airline 1000 USD @@ 110000 JPY
Liabilities:CreditCard:JP:Rakuten -110000 JPY- TBD:“多种货币记账”会带来“在Fava中看统计,默认没有转化为同一种货币统计显示”的问题,这个尚待解决
- 账户结息
账户的利息肯定难以每日都记录,我采用,pad
+balance
断言pad
不该轻易使用,就每个月结算一下比较合适 - 分期付款
这是个常见的购买方式,需要单独设置开一个 Liabilities Account,手续费记利息支出,每个月账单出现的时候转移一下。
核账
- 我选择每个月还款日核实一下账本,在Fava左侧
Balance Sheet
或者Holdings
里可以看到各个账户当前的状况,如果和实际的账户金额有出入的话就需要点进对应账户查看每笔交易的情况,看看是否漏记或者错记。
Fava
- Fava 可视化系统中提供了编辑功能,对于多文件的编辑,默认打开的是主文件,要想修改编辑器默认打开的文件,需将
2019-07-11 custom "fava-option" "default-file"
这个设置放在想要设定的文件里。 - Fava 系统中也提供了添加记录的功能,但添加的记录默认写入了主文件里,根据Fava insert-entry options, default-file could also set the insertion file 作者似乎不care添加在哪个文件里这个问题,但依然可以利用
insert-entry
关键字变相设置一下,比如将2019-01-01 custom "fava-option" "insert-entry" ".*"
断言写在2019/01.bean
文件的末尾,所有在2019-01-01之后的记录,通过Fava添加记录的话,该记录会write在这个断言之前。 - Fava 是不带有密码功能的,根据Make fava password-protected作者认为这不应该是Fava应该做的工作;利用Apache或者Nginx的加密功能可以满足这个需求。