复式记账 Beancount

第一次了解到复式记账是 Emacs 的 Ledger mode ,但是还挺复杂的,就放弃了。后来 Byvoid 的Beancount 复式记账(一):为什么里提到了 Beancount ,感觉比较值得一试。

目前 beancount 的中文文章还不算多,主要看了这两篇:

配置

网上有很多安装教程,就不复述,主要就是安装 beancount 和 fava

pip install beancount fava

ArchLinux

因为使用了 ArchLinux ,在用 beancount 命令的时候会报

UserWarning: Fast C decimal implementation appears to be missing; Consider installing cdecimal
  warnings.warn("Fast C decimal implementation appears to be missing; "

这个其实是因为在 ArchLinux 上少了 mpdecimal 这个库,所以要安装

pacman -S mpdecimal

Emacs

Beancount 作者也是 Emacs 用户,所以在项目里有一个 beancount.elhttps://github.com/beancount/beancount/tree/master/editors/emacs 我们下载并放到 load-path ,然后用 use-package 配置一下即可。

(use-package beancount
  :load-path "~/.emacs.d/plugin"
  :ensure nil
  :mode
  ("\\.bean$" . beancount-mode))

Emacs 里 Beancount mode 主要是语法高亮和加入了 Beancount 命令的调用,像:

beancount-check
用于检查当前文件有没有语法错误
beancount-init-account
更新 Emacs 已知的账户名,用于下一个
beancount-insert-account
插入账户名,相当于补全

后续可能我会更新我的配置,可以参考:

https://github.com/zwpaper/paper-emacs/blob/master/config/init-beancount.el

下一篇文章我会写工具,也会自介绍一下 Emacs 里怎么去用这些命令。

开始使用

初始化账户

按照上文提到的两篇文章,我们已经可以初步建立我们的账户

option "title" "Personal Ledger"
option "operating_currency" "CNY"
option "operating_currency" "USD"

1990-05-28 open Equity:Opening-Balances

1990-05-28 open Assets:Bank:CMB:xxxx:Deposit CNY
1990-05-28 open Assets:Bank:CMB:xxxx:ZZY CNY
20xx-xx-xx open Assets:House:HouseName CNY

20xx-xx-xx open Liabilities:Mortgage:House CNY
20xx-xx-xx open Liabilities:Mortgage:Interest CNY

1990-05-28 open Liabilities:Credit:CMB:xxxx CNY,USD
1990-05-28 open Liabilities:Huabei CNY

2018-10-30 open Income:CompanyName:Salary CNY
1990-05-28 open Income:PnL CNY
1990-05-28 note Income:PnL "盈亏"
1990-05-28 open Income:PnL:Fund CNY

2016-07-07 open Expenses:Gov:HousingFund CNY
2016-07-07 open Expenses:Gov:Pension CNY
2016-07-07 open Expenses:Gov:Unemployment CNY
2016-07-07 open Expenses:Gov:MedicalCare CNY
2016-07-07 open Expenses:Gov:IncomeTax CNY

1990-05-28 open Expenses:Daily:Cloth CNY
1990-05-28 open Expenses:Daily:Food CNY

主要是几类:

Asset:Bank
银行卡
Liabilities:Credit
信用卡
Incoume:CompanyName:Salary
工资
Incoume:PnL
用于盈亏,对应加了一条 note,方便记忆
Expenses:Gov
五险一金
Expenses:XXX
其它支出
Equity:Opening-Balances
开户平衡

有几点需要主要的是,工资的话,是算上应收,再算五险一金,最后是收入。还有房贷,房屋价值和利息是要分开算的。

当前余额

现在有账户了,然后就是账户里的余额, beancount 已经考虑到了,所以有 pad ,而且上文开户有一个 Equity:Opening-Balances ,就是用来初始化账户,而且在你补充了中间的条目之后, pad 的值也会对应更新。

用法是从 时间1时间2 期间 账户1 的余额是 banlance 指明的值,差值算到 账户2 内。

  时间1 pad 账户1 账户2
  时间2 balance 账户1 金额1 货币

我们初始化账户可以把 时间1 设置为生日, 时间2 设置为当前,这样表示之前帐目的都用 Opening-Balances 先抹平,如果我们之前有记录的内容,直接补充进去就好了, pad 会自己更新。

1990-05-28 pad Assets:Bank:CMB:6838:Deposit Equity:Opening-Balances
2019-08-10 balance Assets:Bank:CMB:6838:Deposit xxx CNY

1990-05-28 pad Liabilities:Credit:CMB Equity:Opening-Balances
2019-08-10 balance Liabilities:Credit:CMB -xxxxx CNY

到此,我们的账户初始化就完成了。

总结

我们可以打开 fava 看一下我们的资产:

fava xx.bean

可以看到在资产页,我们填的余额都已经更新了。

其中还有一个点,就是 Book ValueMarket Value 。复式记账多用于公司,所以这两个值主要也是公司财务比较熟悉的。

Book Value
纸面上的价值,就是欠的钱都还了之后的资产
Market Value
股票价值,Beancount 里就是制定 price 之后计算出来的价格

考虑到自动化需要一个比较好用的工具,等下一片文章再具体写一下工具的情况。