把自己当做一家公司:使用 beancount 记账

之前一直用挖财记账,从大学开始,断断续续的记账,到现在差不多快 10 年了。是什么让我放弃挖财转向 beancount 了呢:

  1. 隐私问题,这是一直比较担心的问题
  2. 挖财数据导出现在得 VIP 会员才行
  3. 看到关注的一个博主介绍 beancount 的文章,感觉很有意思
  4. beancount 是开源的,数据都在本地,比较安全

为什么要用 beancount 记账

为什么要记账

首先是为什么要记账,以我个人这快 10 年的记账经验来讲,记账可以让你更好的把控你的财务能力,在我断断续续记账的时间里,记账的时候对自己财务非常清晰,该怎么花钱,花多少钱心里都会有数;而不记账的时候,就感觉没有把控力,对自己财务也非常模糊,花钱花的也有点失控。

通过记账不仅可以加深对自己的财务的了解,也可以根据支出的数据针对性的进行优化。如果要达到财务自由,需要达到三点要求,对支出的预期,对资产和收入的了解,和对寿命的期望。而记账可以解决前两点。

当你开始记账,你就会发现自己离自己的财务自由目标就更近了。

试想一下,假设把你作为一家公司,如果对自己的财务状况和自己的财务能力都不了解,谈何发展?

为什么要用 beancount

  1. 项目开源优先,数据隐私得到保障
  2. 跨平台,可以用 git 进行管理,随处可用
  3. 数据可以导出或自行管理,因为数据是记录在文本文件里的,所以怎么用就非常灵活了,还可以自己写脚本玩出不一样的花子🤣
  4. 复式记账,更加强大。复式记账会记录每笔交易的资金流动,各账户变化「有正有负,正负相等」。这便是复式记账的基本原理,称之为「会计恒等式」。这种方式能够保证记账准确无误,也能提供更详细的财务分析。

嗯,大概就是这么些点,说服了我从挖财转向了 beancount。

beancount 安装

昨晚上搞了一晚上,搞清楚了 beancount 怎么安装,怎么配置,最终搞好了自己的一套 beancount:

image.png

在这里我不会记录怎么安装,配置的细节,而是介绍一些我自己实际搭建的时候遇到的一些坑,以及其他一些教程中没有写的但是又比较关键的点

参考教程

实际遇到的坑

项目结构

不用纠结,直接用我已经配好的这个,这是我看了好多教程,整理出来比较合理的项目结构了:

image.png

主入口是 main.bean

accounts 下是各个账户的初始化

2022 下是 2022 年的记账流水

VSCode 插件

第一个坑就是配置 VSCode 插件,beancount 就像编程语言一样,这个插件主要完成了高亮,自动补全。

这些教程里推荐的是这个插件:

image.png

但是不是说下载安装就可以用了,安装完成了需要配置,点击插件配置,需要配置一下三个地方:

  • Fava Path:如果没有特殊改动,可以保持不动
  • Main Bean File:填入你的 main.bean 文件地址
  • Python3 Path:填入使用的 Python 解释器地址

这样配置完成之后,在 VSCode 里编辑就可以正常高亮和补全了。

如何初始化账户

因为挖财的数据没法导出来,而且导出来再导入 beancount 也挺麻烦的,还不如重新开始。

重新开始就遇到一个问题,如何新建账户,并且初始化各个账户的初始金额呢?昨天搞了半天,终于弄明白了,有几个关键点昨天一直没弄明白,所以一直有问题:

  1. 配好上一节的 VSCode 插件,我就是因为没有把插件配置好,所以编辑器一直提醒导入错误,但是其实没有问题。。。
  2. 初始化账户的时间一定要是最早的,至少是比你用这个账户的时间要早,要不然就会报错。比如今天 11 月 11 号,那么我可以把账户初始化时间放到月初

然后 accounts 文件夹下的这几个文件分别代表以下含义:

  • assets.bean:包含你所有的资产,比如银行卡,证券账户,基金账户等等
  • liabilities.bean:包含你所有的负债,比如房贷,信用卡,白条等等
  • income.bean:这个类似于手机记账软件里的收入分类
  • expenses.bean:这个类似于手机记账软件里的支出分类
  • equity.bean:目前我就是在这里做了一个账户初始化

下来就是将你的各个资产和负债记录到 assets.bean 和 liabilities.bean,格式其他教程有讲,我就不赘述了,但是有个小坑,就比如下面的这条,中间的 Card 必须是英文,而且首字母需要大写。。。

2022-11-01 open Assets:Card:中信银行 CNY

定义好资产和负债之后,开始在 equity.bean 初始化,大概就是这样:

1
2
3
4
5
2022-11-01  open Equity:OpenBalance ;用于账户初始化,支持任意货币

;初始化资产
2022-11-01 pad Assets:Card:中信银行 Equity:OpenBalance
2022-11-10 balance Assets:Card:中信银行 5.00 CNY

其他账户照这个写就完事了,注意第一列的时间哦,不要写错了。负债的金额写负数就可以啦。

下来是 收入和支出 定义,这个比较随意,按自己的需求来定义即可,比如我的 income.bean:

1
2
3
4
5
2022-11-01 open Income:Salary CNY
2022-11-01 open Income:PnL:Fund CNY
2022-11-01 note Income:PnL:Fund "基金盈亏"
2022-11-01 open Income:PnL:Stock CNY
2022-11-01 note Income:PnL:Stock "股票盈亏"

支出 expenses.bean:

1
2
3
4
5
2022-11-01 open Expenses:Shopping:京东 CNY

2022-11-01 open Expenses:Traffic:加油 CNY
2022-11-01 open Expenses:Traffic:停车费 CNY
2022-11-01 open Expenses:Traffic:过路费 CNY

这样基本配置就 OK 了,是不是很简单。

开始记账

在项目结构的 2022 文件夹下的 11-expenses.bean 定义的就是 11 月份的支出,第一笔:

1
2
3
4
5
2022-11-11 * "高速过路费"
Expenses:Traffic:过路费 3.80 CNY
Expenses:Traffic:过路费 4.75 CNY
Assets:Card:邮政储蓄 -3.80 CNY
Assets:Card:邮政储蓄 -4.75 CNY

注意,会计恒等式,支出了什么就要从资产中减掉什么,收入了什么就需要在资产里加上什么。那么这里的支出就是用正数记录,收入是用负数记录。

结语

记账的目标不在于记录一个流水账,而应该能帮助我们分析诊断家庭财务的健康度,最终实现家庭的理财规划目标。

在开始记账之后,我们就要逐渐开始思考如何把自己当成一家公司在运营,如何提升自己资产负债表的健康度~