第一次了解到复式记账是 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.el
,
https://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 Value
和 Market Value
。
复式记账多用于公司,所以这两个值主要也是公司财务比较熟悉的。
- Book Value
- 纸面上的价值,就是欠的钱都还了之后的资产
- Market Value
- 股票价值,Beancount 里就是制定 price 之后计算出来的价格
考虑到自动化需要一个比较好用的工具,等下一片文章再具体写一下工具的情况。