偶尔看到了复式记账这个概念,对精细记账的我而言很受用,我这里从一次个人实践的角度来说明一下复式记账的使用。

本篇文章是一个从零开始的个人实践记录,供同样使用Beancount的人做参考。本文内容基于读者对复式记账和Beancount语法有一定了解的情况下撰写的,关于复式记账的概念和一些诸多基本功能介绍,可以参考阅读以下文章:

开始!

安装使用

Beancount是一个Python实现的开源工具,在本地即可运行,首先从PyPI获取:

1
pip install beancount fava

其中beancount是核心包,包含核心的命令行工具;fava是网页可视化工具,这里是一个fava示例账本 ,对应的Beancount源代码可以在Bitbucket上下载

在命令行中使用 fava example.beancout 即可看到

1
Running Fava on http://localhost:5000

打开浏览器即可看到可视化账本

文件结构

Beancount支持 include 语法来拓展账簿,我个人采用按时间划分文件,辅之特殊事件(比如旅游)单独记录的方法,目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
├── 2018
│   └── ...
├── 2019
│   └── 01.bean
│   └── 02.bean
│   └── 03.bean
│   └── 04.bean
│   └── xx.event.bean
│   └── 05.bean
│   └── 06.bean
│   └── 07.bean
├── accounts.bean ; 记录初始账户信息
├── main.bean ; 主文件

账户信息设置

首先要定义账户,Beancount系统中预定义了五个分类:

  1. Assets 资产
    我按照账户类型:国家:金融机构名字:具体账户的策略划分,时间是开户时间,比如

    1
    2
    3
    4
    2019-01-01 open Assets:Cash:USD USD ; 现金
    2019-01-01 open Assets:Bank:CN:BoC CNY:C1111 ; 中国银行卡
    2019-01-01 open Assets:Broker:US:IB USD, JPY, CHF ; 股票
    2019-01-01 open Assets:Points:Airline:JAL P_JAL ; 点数

    有一类针对AA付款或者个人向自己借款的账户,也需要及时补充和记录

    1
    2019-09-01 open Assets:Receivables:X ; 对X的应收款项
  2. Liabilities 负债
    我主要是信用卡和向他人借款的账户,比如

    1
    2
    2019-09-01 open Liabilities:Payable:X ; 对X的债务
    2019-09-01 open Liabilities:CreditCard:CN:BoC:C1111 CNY ; 信用卡
  3. Equity 权益(净资产)
    目前只有一个用于平衡开户的时候账户资金的权益,

    1
    1990-01-01 open Equity:Opening-Balances
  4. Expenses 支出
    支出就非常的多样化,比如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    2019-01-01 open Expenses:Food:Dinner
    2019-01-01 open Expenses:Food:Lunch
    2019-01-01 open Expenses:Food:Breakfast
    2019-01-01 open Expenses:Food:Fruits
    2019-01-01 open Expenses:Food:Drinks
    2019-01-01 open Expenses:Food:Snack ; 零食
    2019-01-01 open Expenses:Show:Movie ; 电影
    2019-01-01 open Expenses:Show:Drama ; 话剧
    2019-01-01 open Expenses:Show:Concert ; 演唱会
    2019-01-01 open Expenses:Show:Opera ; 歌剧
    2019-01-01 open Expenses:Show:Musical ; 音乐剧
    2019-01-01 open Expenses:Transport:Airline
    2019-01-01 open Expenses:Transport:Railway ; 铁路,含高铁
    2019-01-01 open Expenses:Transport:Subway ; 地铁
    2019-01-01 open Expenses:Transport:Bus
    2019-01-01 open Expenses:Transport:Taxi

    等等…

  5. Income 收入
    收入也可以根据自己的实际收入来源来建立账户,比如
    1
    2
    2019-01-01 open Income:Salary
    2019-01-01 open Income:Rebate

主文件设置

然后设置主文件main.bean内容,主文件任务是设置全局变量,然后去涵盖各个子账本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
option "title" "取个霸气的名字吧" ; 账簿名称
option "operating_currency" "CNY" ; 账簿主货币
option "operating_currency" "USD" ; 可以添加多个主货币

include "accounts.bean" ; 包含账户信息

; 每个月的账本
include "2019/01.bean"
include "2019/02.bean"
include "2019/03.bean"
include "2019/04.bean" ; 特殊事件的账簿用include包含在各自的月份中
include "2019/05.bean"
include "2019/06.bean"
include "2019/07.bean"

账户初始余额设置

在开始记账前,要设置每个账户的余额信息,采用以下方法来给每个账户设置余额/借记账单:

1
2
2019-01-01 pad Assets:Bank:CN:BoC:C1111 Equity:Opening-Balances ; 从Opening-Balances中划取XX帐到银行卡中
2019-01-02 balance Assets:Bank:CN:BoC:C1111 +xxx.xx CNY ; 银行卡余额为xxx.xx

该语句的含义是无论Assets:Bank:CN:BoC:C1111之前余额多少,在2019年1月2日开始之前都调整到xxx.xx CNY,差额从Equity:Opening-Balances来。注意两行之间差一天的时间,balance断言界定为当天开始;一般储蓄卡余额为正,信用卡余额为负;

记账

  1. 基本记账,记账语法为:

    1
    2
    3
    4
    5
    YYYY-mm-dd * ["Payee"] "Narration"
    posting 1
    posting 2
    posting 3
    ...

    比如

    1
    2
    3
    4
    5
    2019-01-01 * "Walmart" "在超市买两件衣服和晚餐"
    Expenses:Clothing 20 USD
    Expenses:Clothing 10 USD
    Expenses:Food:Dinner 10 USD
    Liabilities:CreditCard:US:Discover -40 USD
  2. 多货币转换
    使用@@作为货币转换即可,货币Beancount会进行汇率计算,比如

    1
    2
    3
    2019-01-01 * "日本航空" "纽约-东京"
    Expenses:Transport:Airline 1000 USD @@ 110000 JPY
    Liabilities:CreditCard:JP:Rakuten -110000 JPY
    • TBD:“多种货币记账”会带来“在Fava中看统计,默认没有转化为同一种货币统计显示”的问题,这个尚待解决
  3. 账户结息
    账户的利息肯定难以每日都记录,我采用pad+balance断言pad不该轻易使用,就每个月结算一下比较合适
  4. 分期付款
    这是个常见的购买方式,需要单独设置开一个 Liabilities Account,手续费记利息支出,每个月账单出现的时候转移一下。

核账

  1. 我选择每个月还款日核实一下账本,在Fava左侧 Balance Sheet 或者 Holdings 里可以看到各个账户当前的状况,如果和实际的账户金额有出入的话就需要点进对应账户查看每笔交易的情况,看看是否漏记或者错记。

Fava

  • Fava 可视化系统中提供了编辑功能,对于多文件的编辑,默认打开的是主文件,要想修改编辑器默认打开的文件,需将 2019-07-11 custom "fava-option" "default-file" 这个设置放在想要设定的文件里。
  • Fava 系统中也提供了添加记录的功能,但添加的记录默认写入了主文件里,根据Fava insert-entry options, default-file could also set the insertion file 作者似乎不care添加在哪个文件里这个问题,但依然可以利用 insert-entry 关键字变相设置一下,比如将 2019-01-01 custom "fava-option" "insert-entry" ".*" 断言写在 2019/01.bean 文件的末尾,所有在2019-01-01之后的记录,通过Fava添加记录的话,该记录会write在这个断言之前。
  • Fava 是不带有密码功能的,根据Make fava password-protected作者认为这不应该是Fava应该做的工作;利用Apache或者Nginx的加密功能可以满足这个需求。