复式记账工具 Beancount


    本文简单介绍一下复式记账和 Beancount 的使用方法。

    为什么要记账

    记账是理财的第一步,熟话说得好:”你不理财,才不理你。“

    记账可以明确自己每一笔钱花在哪去了,这个月最大的开销是什么,以及对自己的冲动消费、不必要消费能有一个反思。

    我曾使用过很多记账软件如:挖财、随手记、网易有钱、MoneyWiz、MOZE 等,其实记账最大的问题在于很难坚持下来,因为短期来看记账的收益并不高,而从长远来看,账本也能体现经济的健康状况。

    复式记账是什么

    复式记账(Double Entry Bookkeeping)是以资产与权益平衡关系作为记账基础,对每一笔账单,都要以相等的金额在两个相互联系的账户中进行记录。

    原理: 资产 = 负债 + 所有者权益

    复式记账的优点是:

    • 账户对应关系清楚,可以鲜明的表示各种经济活动的来龙去脉。
    • 有借必有贷,借贷必相等的记账方式,对于检查账单是否记对非常有帮助。

    何为 Beancount

    Beancount 是一个用 Python 实现的开源复式记账软件。

    数据文件基于纯文本,所以不用担心程序出问题,数据没法看懂。

    Beancount(fava)的界面大概是这个样子。

    Beancount 的优点:

    1. 开源,可以自己写功能。
    2. 数据基于纯文本,自己掌握所有数据,不担心隐私泄露。
    3. 支持各种图标,支持 SQL 查询生成报表。
    4. 支持预算(fava)。
    5. 支持无限账本、无限账户、无限币种。
    6. 可以导入各种账单文件(有些需要写代码支持)。
    7. 可以用 Git、iCloud 等工具来管理账本。

    不仅如此,Beancount 还可以量化年假,产假等等非标准金融标的。

    例如讲公司年假记为一笔收入,从公司账户转入到个人账户,成为资产。使用掉年假,则把年假从个人资产转出到消费即可。这样就相当于把年假消费掉了。而年假的货币单位可以设置成 Day。

    写在 Beancount 里大概是这个样子。

    2019-04-24 * "CompanyName" "请假一天休息"
      Assets:Leave                              -1.00 DAY
      Expenses:Health
    
    2019-04-01 * "CompanyName" "年假-初始化"
      Income:Job:CompanyName:Leave
      Assets:Leave                                 +7.00 DAY

    基本语法

    基本格式

    YYYY-MM-DD <directive> <arguments...>

    创建货币

    option "operating_currency" "CNY"

    账户相关

    创建账户

    1970-01-01 open Assets:Bank:ABC CNY

    备注账户

    1970-01-01 note Assets:Bank:ABC "农行卡"

    关闭帐户,账户关闭后就可以在现实界面上过滤掉已经关闭的账户。

    1970-01-02 close Assets:Bank:ABC

    交易

    这是单笔简单交易的写法,表示我去美食风暴用微信支付吃了个盒饭。

    2019-08-02 * "美食风暴" "盒饭"
      Assets:Wechat:EINDEX                                  -18 CNY
      Expenses:Food:Restaurant:Lunch

    设置价格

    可以这是各种“货币”之间的价格转换。如果用上程序员思维,我们就可以实现股票价格跟踪、汇率跟踪等等。来提高账本的准确度。

    2019-10-01 price USD 7 CNY

    余额自动设置

    这是一个偷懒必备功能,下面的 pad,我农行卡自动平账使用Equity:Opening-Balances,明天的 balance 表示在 2019 年 10 月 02 日时这张卡的余额为 4000CNY,如果旧的账单不平就会从Equity:Opening-Balances自动平账。

    2019-10-01 pad Assets:Bank:ABC Equity:Opening-Balances
    
    2019-10-02 balance Assets:Bank:ABC 4000 CNY

    如果未来要在这个账户过去的账目上做删改,2019 年 10 月 1 日的余额也会是 4000 元不变。

    使用 Beancount

    首先需要安装 Python 3,然后安装 beancount、fava。

    pip install beancount fava

    fava 是 beancount 的一个 WebUI 实现,可以可视化的看见自己的账本。

    Example

    官方提供了一个 Beancount 的使用用例。

    bean-example > example.bean
    fava example.bean

    然后打开 localhost:5000 就可以在本地体验 Beancount 与 fava 了。