第一次了解到复式记账是 Emacs 的 Ledger mode ,但是还挺复杂的,就放弃了。 后来 Byvoid 的Beancount 复式记账(一):为什么里提到了 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 之后计算出来的价格

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