0°

初级使用|利用 Beancount 打造个人的记账系统(2)

上一篇文章《基础认识》为大家简单地介绍了 Beancount 的安装过程和示例演示,本篇文章将开始介绍 Beancount 的初级使用,如果各位读者对 Beancount 还不了解,请先阅读上一篇文章。

目录结构

首先,我们先规划好记账系统的目录结构,下面这个是我自己的目录

├── accounts.bean
├── documents
│   ├── Assets
│   ├── Expenses
│   ├── Income
│   └── Liabilities
└── main.bean

accounts.bean 是账户文件,比如我要开一个工商银行卡的账户,便在这个文件中进行操作。

documents 目录下有四个目录,分别是 Assets(资产)、Expenses(消费)、Income(收入)、Liabilities(负债),用来放置对应的账单文件

而 main.bean 是主入口文件,里面通常是一些初始化命令,比如设定系统的名字,引入账单文件等。

以上仅仅是我自己的目录规划,大家可以根据自己的喜好进行规划,Beancount 对目录没有特别的要求,甚至对文件的命名、后缀也没有要求,比如你可以把 main.bean 设置为 index.xxx 也是可以的

入口文件

我们先从入口文件 main.bean 开始

设置记账系统的名字(标题),我给自己的系统取名为 金山银山

; 系统标题(这里前面加分号代表注释)
option "title" "金山银山"

然后我们在 main.bean 所在目录运行一下

⇒  fava main.bean
Running Fava on http://localhost:5000

在浏览器打开 http://localhost:5000 你就能看到我们设定的标题

标题

设定货币类型(至少添加一种,否则会报错)

option "operating_currency" "CNY"
option "operating_currency" "USD"
option "operating_currency" "CAD"

需要注意的是,这里并非是要添加所有的货币,仅需要把你日常使用的货币类型添加就行,这个设置在报表中会体现出来,如下图。

报表示例

引入账户文件

include "accounts.bean"

什么是账户?

比如你有尾号为 0001 的工商卡和尾号为 0002 的招行卡,银行卡属于资产,因此我们把它归类到 Assets 下,并且可以为他们开设一个账户,操作如下

; 开户日期  开户命令    账户名称     货币类型
2019-04-01 open Assets:Bank:ICBC:0001 CNY
2019-04-01 open Assets:Bank:CMB:0002 CNY

其中,前面的日期代表开户日期,oepn 即开户的命令,但 Assets:Bank:ICBC:0001 这一段是什么意思呢?

简单解释一下,因为银行卡属于资产,所以银行卡分配到 Assets 层级下,因为这是属于在银行的资产,所以再添加一个层级,就变为 Assets:Bank,这是属于工商银行(ICBC)的银行卡,所以再添加一个层级变为 Assets:Bank:ICBC,这是尾号为 0001 的工行卡,所以最终的层级就变为 Assets:Bank:ICBC:0001,这就算是一个账户,层级之间用冒号进行分隔即可。

需要注意的是,除了Assets 是固定的名字之外(事实上也可以自定义,这里暂不展开),后面的层级名称可以自定义,并且层级的数量也可以根据自己的习惯设定,比如你完全可以将这个账户设定为 Assets:ICBC:001,省略了 Bank 也是可以的,但这样可能就不那么清晰了。

并且,你还可以继续细分,比如,我在尾号为 0001 的工行卡上既有现金储蓄又有股票投资,那么可以开设两个账户

2019-04-01 open Assets:Bank:ICBC:0001:Cash CNY
2019-04-01 open Assets:Bank:ICBC:0001:Stock CNY

了解了什么是账户,可能有小伙伴有一个疑问,我该如何记录自己现有的资产呢,即如何初始化?

首先,我们要了解几个基本概念,即

  • Assets(资产)
  • Expenses(消费)
  • Income(收入)
  • Liabilities(负债)
  • Equity(权益)

如果把它们视为 5 个桶的话,那我们的 money 就是在这几个桶之间流过来流过去,比如 Income(收入) 流向 Assets(资产),Assets(资产)流向 Expenses(消费)

对这几个概念有了基本认识之后,我们便可以开始记账了

第一步

我们刚开始的时候,肯定要先初始化我们已有的资产,这一部分资产我们先把它放在 Equity(权益)这个桶上,我们为它开设一个账户

; opening balances 的意思是 期初余额 的意思,你也可以按照自己的喜好命名
2019-05-05 open Equity:Opening-Balances

把上面这些命令写在你的账户文件上,比如 accounts.bean,保存之后刷新一下 http://localhost:5000,你便能看到你的 Equity(权益)数据

权益

然后,再开设一个资产(Assets)账户,将 Equity:Opening-Balances 上的资产转移到该账户下

; checking 的意思是核对账目,同上,你可以自己起一个自己喜欢的名字
2019-05-05 open Assets:Checking

这个也是保存在 accounts.bean 文件上

接下来,我们将 Equity(权益)的资产转移到 Assets:Checking 账户下,比如我现有的资产(现金、存款、股票等)总共是 1万 块,那么可以这样记录

2019-05-05 * “initial assets”
     Assets:Checking        10000.00 CNY
     Equity:Opening-Banlances    -10000.00 CNY 

你还可以省略这样写

2019-05-05 * “initial assets”
     Assets:Checking        10000.00 CNY
     Equity:Opening-Banlances   

或者这样写

2019-05-05 * “initial assets”
     Assets:Checking        
     Equity:Opening-Banlances  -10000.00 CNY

beancount 可以只知道流出(流入)的方向和数量情况,即可推倒出对立的情况

这样,我们就初始化好了自己已有的资产,然后,我们将这个总资产分配到具体的账户下,比如我有现金 2千,银行卡里有 6千,股票有 2千,那么我们需要先新开3个账户,分别是

2019-05-05 open Assets:Cash CNY
2019-05-05 open Assets:BankCard CNY
2019-05-05 open Assets:Stock CNY

开好账户后,然后分配资产

2019-05-05 * “distribute asset for cash”
       Assets:Cash      2000.00 CNY
       Assets:Checking
2019-05-05 * “distribute asset for card”
       Assets:BankCard      6000.00 CNY
       Assets:Checking
2019-05-05 * “distribute asset for stock”
       Assets:Stock      2000.00 CNY
       Assets:Checking