复式借贷记账法 Beancount (0) - 先导

最近开始折腾起来记账,总觉得记账是实现财富自由的必要条件。。。不知道这辈子还能不能染指财富自由这四个字。总而言之,处于我现在的人生阶段不得不需要审视自己的开支,才能做出正确的风险估计,投资行为等等。所以记账是非常有必要的。

什么是记账?为什么记账?

记账(bookeeping),顾名思义就是把交易记录下来。

为什么要记账呢?我还是喜欢知乎上的高分答案。

还是因为穷。

当然不能这么消极,破罐破摔是不行的。
积极的思考这个问题,记账的好处我浅显的总结为:可观测性(Obvervability)。

可观测性的好处是能够提供反馈,这样就能根据反馈来刻意调整行动来达到目标。这样的才能够形成一个正向反馈的闭环,你的收益才能增长。
这其实是一个很普遍的方法论。比如说,理财。在做出理财行为之前,对自己的财务有一个清晰的了解,可以更方便的评估自己能承受的风险,从而能够在理财上做出理性的决定。

记账分类学

单式记账法

是一种简单,但是并不完整的记账方法。

账户设置不完整,通常只有现金,存款,应收,应付。

因为没法记录所有的业务,所以不能做试算平衡。

复式记账法

每一项经济活动发生的时候,会在资产和负债至少两个项目发生增减变动。
理论依据是”资产=负债+所有者权益”。
可以全面的反应经济业务。

借贷记帐法

以借贷为记账符号。

账户结构

账户类型 结构
资产类(Assets) 借方记录资产增加额,贷方记录资产的减少额
负债类(Liabilities) 和 权益类(Equity) 贷方记录权益的增加额,借方记录权益的减少额
成本费用类(Expenses) 与资产类结构基本相同,
收益类(Income) 与负债类结构基本相同,

收付记账法

以收付为记账符号, “有收必有付,收付必相等”

增减记账法

以增减为记账符号, “资金占用金额=资金来源总额””

这个我就没花时间了解了

我国自1996年实行新的会计准则以后,就基本不再使用增减记账法了。

为什么是复式记账

经济人需要记账, 来提供经济业务可观测性

作为一个在经济社会上活动的人,难免就要发生各种经济行为。随着人越来越深入的和社会经济紧密结合,不记账就很难得到经济行为的可观测性。

这里只概括一下我个人的记账方式的变化。
早期,读硕士和博士那会儿,拿着微薄的补助,基本月光,全来付房租和吃饭。的确没有什么记账的必要。
稍后,有机会做一些实习,开始有一些结余,加上没事儿薅一些信用卡福利羊毛,也在股市上小打小闹,收入支出变得复杂的起来。那个时候我已经开始使用手机app, 比如Mint来记账了(Mint后来被Intuit收购了). 最后,开始工作了,RSU,车贷,房贷,401K等,各种交易越来越多,记账越来越显得必要了。
而Mint这样的手机程序已经没办法满足我所有的需求,而且说实话还是有隐私的顾虑。后来对于单个项目有很多开支的,我都是利用Excel或者Google Spreadsheet来记账,这样其实对于单个项目其实也挺不错的,还有各种图表功能,非常方便。但是随着这样的项目的增多,我越来越需要一个更完整的解决方法了。
几年前曾经做过一些研究plain text accounting,也听说过Beancount,但是并没有的深入的了解。去年偶尔看过ByVoid的博客,对Beancount多了很多了解。直到最近发现自己想记账的需求越来越强烈了,索性就在最近几个月的某些周末(反之是Covid-19,你也不能去哪里)就坐下来学习了一下Beancount。
这一次想要记账的一个最基本动机就是想回答这个问题,如果我们家有一个人或者两个人在金融危机中失业,没有了收入,我们现在的现金和资产储备可以撑多久。

复式记账可以提供完整的经济业务可观测性

复式记账,通过对交易行为的完整记录,可以提供更完整的可观测性。虽然我们大部分的交易都是购买消费行为,但是我们还有很多其他类型的经济业务,比如RSU,ESPP,个人投资,各种税收,个人借贷,多方的交易,货币资产,等等,这些资产之间还会有频繁的转换。所以复式记账这一个会计工具,也应该被个人掌握并应用。

做一个现代人好难!

为什么是 Beancount

首先,Beancount是纯python的,虽然说我个人对python不是特别感冒,因为我还是习惯有静态类型的编程语言,但是毕竟这个是我以前做研究,数据分析和机器学习项目用了很频繁的语言。如果记账系统是python实现的话,当我需要去做一些自定义修改的时候,比如自动化脚本,账户导入等,可以轻松上手。

然后,Beancount的编辑器支持也很不错:VSCode,Vim, Emacs 上都有插件支持。

再次,就是Web UI的支持,Beancount也很不错,fava看起来很美观,功能也很全面。

最后就是Beancount的中文资源貌似还不少,可以找到不少中文用户在博客和一些技术网站上有介绍和分享使用的经验和方法。

我简要对比过的项目大概包括

项目 年份 语言 代码贡献者 Github星标
Ledger 2003 C++ 160 3.3K
Hledger 2007 haskell 122 1.4K
Beancount 2008 python 40 (BitBucket)

毕竟好多年没用过C++了,haskell我也不懂。
如果有机会,可能会选择一个golang的项目参与一下。

更多其他项目,请看 https://plaintextaccounting.org/

快速上手

首先使用Python的虚拟环境

1
python3 -m venv ./venv

激活虚拟环境

1
source venv/bin/activate

安装对应的Python包

1
pip3 install beancount fava

生成一个模版账本

1
bean-example > example.beancount

运行Web UI

1
fava example.beancount

默认情况下Web UI会运行在 http://localhost:5000

这样就有一个基本环境了。
下一篇会介绍一些基础知识。

Reference

系列介绍

准备用一个系列的文章来介绍这个工具和一些技巧。
这些技巧有一些是我从已有的模版中找出来,也有一些是在Google Group里看到大家的推荐,自己又尝试出来的方法。

  1. 先导 复式借贷记账法 Beancount (0) - 先导
  2. 基础知识 复式借贷记账法 Beancount (1) - 基础知识
  3. 环境设置 复式借贷记账法 Beancount (2) - 环境设置
  4. 如何对房产建模 复式借贷记账法 Beancount (3) - 房产
  5. 如何对RSU建模 复式借贷记账法 Beancount (4) - RSU
  6. 如何对ESPP建模
  7. 自动化导入
  8. 安全

希望快速得到新文章的通知?请关注作者的微信公众号

wechat-qrcode