在借贷记账法中我粗略介绍了Beancount的基本记账方法和一些常见的规范,但这已经能满足日常生活的记账工作了。这篇继续讲述Beancount的常用语法,主要内容是对账和资产折旧。
对账
在每次记账后根据fava中的错误提示修改出现的错误,其实Beancount的语法规范已经避免了很多可能导致「账不平」的错误,但是对于数额本身的错误,或者某条账目漏记并没有办法,这就是为什么我们要定期对账。
所谓对账,其实就是将可视化界面的资产负债表中的结余与自己的实际结余对比,看数额是否一致。在资产负债表上点击任意账户,可以进入账户的明细界面。账户的明细界面列出了涉及该账户的每一笔交易,点开后可以看到具体的交易信息。每一行的最右侧是这一笔交易后的该账户结余,根据账户列出的每一笔交易再与实际账单进行对比,这就是对账的核心。
定期结余断言
假设已知账户的某日结余金额,只要在这个账户明细界面看一看对应的日期的最后一笔交易后结余是否正确就可以了。如果Beancount计算出的结余和已知的是一样的,那么基本上就可以确定账没有问题。
这个步骤看似容易,但是随着账目增多,对账的负担会很重,而且容易看错。更严重的问题是,如果因为某种原因要修改过去的账目,已经对好的账就不一定正确了。唯一保险的办法是每次修改了过去日期的交易后,把涉及到的账户未来的结余再全部重新对一遍。好在这个过程是可以自动化的,方法就是使用结余断言(Balance Assertion)。
结余断言就是在记账中加入已知事实,即标记某个日期某个账户的结余,一本维护良好的账本应当定期做结余断言(assertion)。结余断言的语法非常简单,如下例所示:
2022-09-01 balance Assets:Savings:Bank:ZhaoShang:C8837 18422.00 CNY
唯一需要留意的地方是,结余断言是所声明日期开始的时候的余额,即当日的交易不算在内。因为Beancount 的时间精度是「日」,所以诸如 open
, close
, balance
等带日期的语句,均发生在当日的第一笔交易之前,你可以想像它们都是在凌晨发生的,而普通的交易都是发生在白天。因此,要断言一月份的余额,日期应写作 02-01 而不是 01-31。同样地,信用卡等通常为负数的账户也能进行断言,比如小红的信用卡账单日为 20 日,2 月份账单应还款 5000 元,那她的断言应该这样写(注意日期是第二天,也就是 21 日):
2022-08-21 balance Liabilities:CreditCard:Bank:ZhongXin:C6428 CNY -5000.00 CNY
声明结余断言之后,Beancount会自动检查账户的数字是否与断言的数字相等,如果不相等就把报错。人总是会犯错的,当你因为各种原因在账目上出现了错误,断言能帮助你缩小查错范围——你只需要检查最后一次成功的断言之后的发生的交易即可。如果每个账户都有适当的结余断言,修改过去的交易就可以放心进行了。
合理填充
但是当账户出现与结余断言不一致且不愿意花时间去排查时,可直接通过pad
关键字直接从指定账户中补齐与断言不一致的金额。例如在上述案例中,我的余额是购买了招商银行的朝朝宝,每天都有相应的收益,若每天对结余进行断言显然不合适,所以我每个月最后一天除了断言开销外,还会从投资收益中直接补齐一个月的利息。
2022-08-31 pad Assets:Savings:Bank:ZhaoShang:C8837 Income:Investment:Interest
2022-09-01 balance Assets:Savings:Bank:ZhaoShang:C8837 18422.00 CNY
由于pad与balance常关联使用,使用pad填充功能其实还有一个隐性的好处。因为balance可以指明指定时间指定账户中的余额,无法追溯的金额则统一由pad进行自动计算并插入交易。如果某一天,你想起在之前的时间有一段支出未记录,重新记上去,那么这个差额会自动变小。
大宗商品的购入和折旧问题
生活中有一些交易我们需要考虑到底要记为花费,还是资产的购入。在光谱的两端一般没什么争议,譬如吃饭肯定是消费,买房无疑是购入资产。中间许多类别就不一定了,这取决于个人的偏好和目的,例如我会将后续可能出售的资产、大宗商品等记为购入资产(即新建Assets账户用于折旧)。
拿买汽车作为例子,无论是新车还是旧车,许多人在开一段时间以后会选择卖掉。如果我们把买车记为消费,卖车记为收入,这本身并没有任何错误。问题是,对很多人来说汽车还是一笔不可忽略的资产,如果直接记为消费,没有对应的资产入账,那就意味着净资产突然大幅减值。几年后卖出,净资产又突然增加。
要解决这个问题,我们就要把汽车记为一项资产,下面是例子:
2023-02-04 * "比亚迪"
Expenses:TransPort:Private:Car 2049.00 CNY ; 底盘护板
Expenses:Finance:Service 4000.00 CNY ; 贷款服务费
Expenses:Finance:Service 500.00 CNY ; 上牌服务费
Assets:Receivables:Organization:BYD 5000.00 CNY ; 中转,两个星期内返还
Assets:Depreciation:Car:BYD -2000.00 CNY ; 定金
Equity:OpenBalance -9549.00 CNY
Income:Government:Subsidy:Car -5000.00 CNY ;
Assets:Receivables:Organization:BYD 5000.00 CNY ; 购车补贴,六个月内返还
Income:Receivables:Card -300.00 CNY @@ 300.00 COIN ; JD购物卡
Assets:Savings:Recharge:JD 300.00 COIN ; 截止至2026年01月09日
Expenses:TransPort:Private:Insurance 7564.47 CNY ; 保险
Liabilities:CreditCard:Bank:ZhongXin:C6428 -7564.47 CNY
2023-02-04 * "比亚迪"
Assets:Depreciation:Car:BYD 259800.00 CNY ; 总金额
Equity:OpenBalance -110000.00 CNY ; 首付
Liabilities:Payables:Organization:BYD -149800.00 CNY ; 剩余贷款
Expenses:Finance:Loans 12188.48 CNY
Liabilities:Payables:Interest:BYD -12188.48 CNY ; 总利息,年利率7.95%,还款期数36期,开始时间2023-02-06
2026-02-04 * "比亚迪" "卖出海豹"
Assets:Depreciation:Car:BYD -259800.00 CNY
Assets:Savings:Bank:ZhaoShang:C8837 160000 CNY ; 以16W卖出
Expenses:Depreciation:CarUsage 99800 CNY ; 3年折旧支出
上述例子是2023年2月4日贷款计息161988.48元总计买入价格为25.98W的汽车,并计入资产Assets:Depreciation:Car:BYD。中间省略还贷款的过程,3年后的2026年2月4日,将车卖给二手商获得16W,剩下的9.98W就是这四年来用车的费用了。
这个方法对买卖交易之间的这段时间内净资产计算仍然不够准确,并没有完全解决净资产跳变。因为汽车的使用是四年来平均花费出去的,而不是最后卖的时候一下子花了9.98W。要解决这个问题就要引入定期进行折旧(Depreciation)计算。一般的会计方法中把因为资产使用或者随着时间自然减值称为折旧,我记为Expenses:Depreciation:CarUsage
。
接下来需要决定的是折旧的周期,即把车的使用费按照多大的粒度来记录。这个完全因人而异,也因金额的大小而异,对于车我可以选择按年折旧,如果希望每个月的花销更加细致,那么按月折旧也是一个方案,只是需要多记录几笔而已。
2024-02-04 * "海豹折旧"
Assets:Depreciation:Car:BYD -30000.00 CNY
Expenses:Depreciation:CarUsage 30000.00 CNY
2025-02-04 * "海豹折旧"
Assets:Depreciation:Car:BYD -30000.00 CNY
Expenses:Depreciation:CarUsage 30000.00 CNY
2026-02-04 * "海豹折旧"
Assets:Depreciation:Car:BYD -30000.00 CNY
Expenses:Depreciation:CarUsage 30000.00 CNY
; 或者使用如下方法进行折旧
2024-02-04 balance Assets:Depreciation:Car:BYD 240094.08 CNY ; 通过商业险获取折旧金额
2024-02-03 pad Assets:Depreciation:Car:BYD Expenses:Finance:Depreciation
下一个问题是,每次折旧减值多少。这个问题就是会计上可以操作的空间了,因为实际的价格只有在出售的时候才知道。一般会计准则是预估一个折旧年限,然后以此为根据来折旧。譬如说,我们预期汽车的寿命是10年,即10年后该车的价值清零,这样我们可以按照每年10%的折旧率每年减记。最终当实际卖出的时候,我们再根据卖出价格做调整,或者差额记为其他类别。如果有特别的事件发生,还可以另外单独折旧。例如发生了车祸,车的估值大幅下降,可以在此时额外减值。
Beancount并没有自动折旧的功能,每一笔都是要自己写的。如果怕忘了,其实可以把未来日期的折旧也写上。另外还有第三方的插件beancount-interpolate可以尝试使用。
周期
在日常的记录中,多久进行一次记录多久进行一次汇总断言呢?刚入门的时候,由于对Beancount不太熟悉,可以每日一记,同时将自己跟钱有关的所有账户都记录到Beancount中,因为你不可能在刚记账的时候就已经将所有账户都统计到位了,所以每日一记不仅能帮助你熟悉复试记账的用法还能对账户查缺补漏。当对Beancount有一定了解,且出现记账错误能根据资产负债表快速定位错误时,可以将记账周期放宽。在刚开始做时,可能会花费 30 分钟到 2 个小时不等的时间,但随着你的消费习惯越来越成熟, 这个时间会快速地缩减。
目前推荐的做法是:每周对常用账户进行记录并balance对账(通过支付宝、微信、银行卡、信用卡账单),每月初汇总上月的被动收入,填充无法回溯的支出,回顾支出情况等。当然,如果有兴趣的话可以了解一下importer自动导入账单和 账单转换 。