账户类别
复式记账的最基本的特点就是以账户为核心,Beancount的系统整体上就是围绕账户来实现的。Beancount 中账户名支持层级,以英文冒号:
分隔,如 Assets:Card:1234
。但第一层必须是以下五个账户之一,日常交易中涉及到的账户,一定可以归于其中某一类:
- Assets 资产:储蓄卡余额、支付宝余额、股票、房产、汽车等(房子车子可以以金额入账方便折旧)
- Liabilities 负债:信用卡欠款、房贷、车贷等
- Equity 权益:可以看作是净资产,也可用于账户初始化、误差处理等
- Expenses 支出:生活中的一切支出,指不再进行转卖以获取利益的支出
- Income 收入:工资、奖金、投资收益等
接下来需要声明账户的开户时间,格式为YYYY-mm-dd open [账户名称] [货币]
。其中账户名称需自定义且用:
进行分隔(但必须归属于5类账户),货币种类可自定义,例如我在以下例子中就使用了CNY作为人民币,COIN做为储值类代币:
2022-01-01 open Assets:Savings:Bank:ZhaoShang:C8837 CNY ; 银行卡
2022-01-01 open Assets:Savings:Recharge:AliCloud COIN ; 储值类使用COIN指代
2022-01-01 open Liabilities:CreditCard:Bank:ZhongXin:C6428 CNY ; 信用卡
2022-01-01 open Equity:OpenBalance ; 初始化账户
账户如何组织分类完全看个人需求和喜好,譬如我先分账户类型,再分功能,然后是金融机构名,最后是具体账户。分类的作用是可视化的时候,可以看某个账户下面所有账户的汇总。
账户open
开启时间可用真实时间,若无从考据可设置为开始使用复式记账前一天或今年伊始(例如我2022-08-16开始记账,开启时间就设置为2022-01-01)。开设账户时货币类型不是必须的,但建议加上,记录交易时货币不一致 Beancount 会报错。货币可设多个,用英文逗号(,)分隔,但如果某个账户的货币组成形式较复杂也可省略。
最后,如果一个账户不再使用,比如注销信用卡、关闭充值卡等。可用 close
命令关闭账户:
2022-01-02 close Liabilities:CreditCard:Bank:ZhongXin:C6428 ; 信用卡被注销
为什么需要大量时间来初始化账户?
在正式记账前,一般资产和负债都不会是 0,因此需要提前初始化所有的账户的余额(初始化数量较多可根据实际情况制定),例如Assets账户若要精细到各个银行卡账户的余额则要为各个银行卡创建相应的账户并初始化。这需要大量的时间来思考自己有哪些账户且哪些账户需要纳入管理,在'项目管理'篇章中提供我定义的所有账户及规范。
初始化需要用到 Equity 账户,以下为初始化案例,C8837
储蓄卡中的10000元来自Equity:OpenBalance
账户:
2022-08-16 * "存款初始化"
Assets:Savings:Bank:ZhaoShang:C8837 10000.00 CNY
Equity:OpenBalance ; Beancount假设总和一定是0,当上条记录为10000时,该条记录自动记录为-10000,无视货币形式(账户允许的情况下)
基本借贷
有了以上定义的账户以后,我们终于可以开始实践记账了。复式记账又叫作「借贷记账」。之所以这么叫,是因为每一条记录都至少有一条借记(Debit)和一条贷记(Credit)。可以看下面这个例子:
2022-09-06 * "中国铁路" "去程及返程票"
Expenses:TransPort:Public:Railway 651.89 CNY
Liabilities:CreditCard:Bank:ZhongXin:C6428 -651.89 CNY
其中:
*
表示这笔交易是确定的,没有疑问。若是!
,表示存疑,但一般用不上。- 交易方(中国铁路)和交易备注(去程及返程票),均可省略。
- 货币必须与账户设置中对应的货币类型一致。比如账户设置为美元账户,消费时出现人民币,Beancount 会报错。
此外,账户后的金额是带有符号的,如下:
- 支出账户:一般为正数。表示花费多少钱。
- 收入账户:一般为负数。表示收入多少钱。投资收入账户如果出现正数,则表示投资亏损。
- 资产账户:可正可负。正数表示有钱存入,余额增加;负数表示有钱支出,余额减少。
- 负债账户:可正可负。正数表示还款,负债减少;负数表示借款,负债增加。
支出为正,收入为负,有点反直觉,是会计恒等式逻辑所致。会计恒等式具体表述如下:
(Assets + Expenses) + (Liabilities + Income) + Equity = 0
这里有一个要点:要保证所有条目的总和是0,否则就会出现Transaction does not balance: (xxx USD)
这样的错误。这个要求很好理解,因为花出去的钱必须和账户上减少的钱一样,否则就是所谓的「账目不平」了。Beancount语法的灵活性在于每个记账单元可以有任意多个条目(借记和贷记),只要保证它们的总和是0就可以。于是我们还可以这样记录:
2022-10-21 * "日常消费"
Expenses:Food:Breakfast 8.60 CNY
Expenses:Food:Lunch 9.00 CNY
Expenses:Food:Dinner 25.00 CNY
Expenses:Food:DrinkFruit 12.00 CNY
Assets:Savings:Web:AliPay -37.00 CNY
Liabilities:CreditCard:Bank:ZhongXin:C6428 -17.60 CNY
该例子体现了对工资条的内容进行记账,因为每个月的工资条总有各种各样的条目需要扣除。在使用了 Beancount 之后,可以方便地把工资、补贴、五险一金、个税等信息都记录进去,以后能很方便地统计每个月有多少工资是喂狗的。这块需要解释一下,我的工资基数为8000,但公司只为我缴纳483的公积金,剩下的公积金由我自行支出从工资中扣除。
2022-07-21 * "wlhiot" "六月份工资"
Income:Salary:Wlhiot -8000.00 CNY ; 正常薪资
Income:Salary:Subsidy:Meal -357.00 CNY ; 餐补
Income:Salary:Subsidy:Provident -483.00 COIN ; 公司缴纳的公积金
Expenses:Government:Insurance 468.23 CNY ; 社保
Expenses:Government:Provident -1,417.00 CNY @@ 1,417.00 COIN; 以公积金入账
Expenses:Government:Provident 1,417.00 CNY ; 本人额外缴纳的公积金,但以CNY支出
Expenses:Government:IncomeTax 44.15 CNY ; 个人所得税
Assets:Savings:Government:Provident:WenZhou 1900.00 COIN ; 工资金账户
Assets:Savings:Bank:HuaXia:C5636 6427.62 CNY ; 实际银行到账的金额
货币转换
在使用多个货币之前,需要先定义「通货」,通货可以不止一个,例如:
option "operating_currency" "CNY"
option "operating_currency" "COIN"
定义了通货以后,在fava界面中可以看到工作货币单独列出的栏目,其他未定义但有记录的货币则会记录到'其他'栏。Beancount货币转换的语法有两种,一种是使用@
记录单位货币的转换价格,另一种方式更符合人的习惯,使用@@
记录转换后的总额,之后的记录均以总额进行记账。
使用代币支付
在工资的例子中,其实已经用到货币转换的功能。在日常生活中,也会经常用到该功能,例如储值卡消费、国外旅游等。例如在加油站账户充值了100元,我是以人民币形式支出,但是以代币的形式记录在加油站,当在加油站进行消费时,也是以代币的形式进行记录,这是可以通过以下案例来记录(下述账户均已初始化):
2022-08-17 * "MHPC" "加油站储值"
Assets:Savings:Recharge:MHPC 505.00 CNY @@ 505.00 COIN
Income:Receivables:Coupon -5.00 CNY ; 充值赠送
Assets:Savings:Bank:ZhaoShang:C8837 -500.00 CNY
2022-08-17 * "MHPC" "加油站消费"
Expenses:TransPort:Private:Oil 200.00 COIN
Assets:Savings:Recharge:MHPC -200.00 COIN
借贷管理
复式记账的强大之处是每个账户都有状态,而且每个操作都是原子的,这对复杂的资金进出记录非常有帮助。
生活中一个常见的例子是朋友之间的借钱和相互垫付,例如我和X、Y三人去一起出游,从东京附近的横须贺坐船到猿岛,费用是每人1300日圆的船票和200日圆的登岛费,其中船票可以用信用卡支付,而登岛费只能付现金。我们一共需要付4500日圆,但是正好谁都没有这么多现金,于是决定我用信用卡付三人的船票,X用现金付三人的登岛费,最后再结算。
2019-05-25 * "猿岛" "渡轮"
Expenses:Transport:Ferry 1300 JPY ; 个人渡轮费用
Assets:Receivables:X 1300 JPY ; 对X应收款项
Assets:Receivables:Y 1300 JPY ; 对Y应收款项
Liabilities:CreditCard:JP:Rakuten -3900 JPY
2019-05-25 * "猿岛" "登岛费"
Expenses:Transport:Attraction 200 JPY ; 登岛费
Liabilities:Payable:X -200 JPY ; 欠X的钱
第二天,三人结算完毕,X付给我现金,Y转账给我。
2019-05-26 * "猿岛" "费用结算"
Assets:Receivables:X -1300 JPY ; X偿还债务
Liabilities:Payable:X 200 JPY ; 偿还对X的债务
Assets:Cash:JPY 1100 JPY ; X实际付给我的钱到账
Assets:Receivables:Y -1300 JPY ; Y偿还债务
Assets:Bank:JP:SMBC:JPY 1300 JPY ; Y实际付给我的钱到账
最终可以看出来,我在Expenses:Transport:Ferry
类别消费1300 JPY
,在Expenses:Transport:Attraction
类别消费200 JPY
,信用卡扣款3900 JPY
,收到了1100 JPY
的现金,Assets:Bank:JP:SMBC:JPY
收到了1300 JPY
的转账。
以上这种记账方法可以让资金的流动一目了然,类别和金额也准确无误。记录对他人的债权(应收账款)和欠他人的债务(应付账款),我分别使用了Assets:Receivables
和Liabilities:Payable
下面的账户。
应收账款和应付账款的另一个用途是区分付款和到货时间。一般来说交易是当场进行的,一个账户的借记和另一个账户的贷记同时发生,但是有些时候付款和到货并不是同时发生的,如果需要精确区分发生的时间的话,可以用这种方法把他们分成两笔记录。
到此为止,Beancount基本的借贷用法已经介绍完毕,剩下比较重要的就是对资产的结余进行断言和Beancount项目管理,当学会借贷、断言、项目管理就可以进行完整的记账历程。