复式簿记是一种把每笔交易都记录到复数个账户中的簿记方法。
复式记账又分为了借贷记账法,和正负记账法。一笔交易,钱的流入和流出必定是平的。

  • 借 (debits)
  • 贷 (credits)

Debits 和 Credits 是经济交易中的双向流动:

概念

资产是负债和权益的总和,负债(Liabilities)也是资产的一部分。

会计等式

Assets (资产) = Liabilities (债务) + Equity(权益,或者叫净资产,或者抵押资产)

Beancount 使用

Beancount 是一种文本记账工具。

账户类型

  • 资产 + Assets —— 储蓄卡余额、支付宝余额、股票账户余额、房子、车子固定资产等;
  • 负债 - Liabilities —— 信用卡、房贷、车贷, 贷款等;
  • 收入 - Income —— 工资、奖金, 投资收益等;
  • 费用 + Expenses —— 外出就餐、购物、旅行等;
  • 权益 Equity —— 这个账户比较特殊,在账户初始化、误差处理等少数场合使用。

账本的基本语法

; 英文分号可以设置注释
option <配置项> <值> ; beancount 配置项

;开户,支持unicode, YYYY-MM-DD 表示开户时间
YYYY-MM-DD open 账户类型:命名:命名区别 货币[,货币2]  

; 注销账户
YYYY-MM-DD close 账户类型:命名:命名区别

;交易 , 这里账户必须开户, * 表示确认, ! 表示存疑, 货币必须保持一致
YYYY-MM-DD * "交易对象" "备注"
    账户1        +金额 货币类型
    账户2        -金额 货币类型

此外,账户后的金额是带有符号的,如下:

  • 支出账户:一般为正数。表示花费多少钱。
  • 收入账户:一般为负数。表示收入多少钱。投资收入账户可能出现正数,则表示投资亏损。
  • 资产账户:可正可负。正数表示有钱存入,余额增加; 负数表示有钱转出,余额减少。
  • 负债账户:可正可负。正数表示还款,负债减少; 负数表示借款,负债增加。

支出为正,收入为负,有点反直觉,是会计恒等式逻辑所致。会计恒等式具体表述如下:

 (Assets + Expenses) + (Liabilities + Income) + Equity = 0

一笔交易记录可能涉及2个以上的账户,比如例子中的「工资收入」,这时,多个账户的金额也满足「有正有负,正负相等」。实际记录时,Beancount允许一个账户的金额为空,它会根据正负相等的原则自动计算。

安装配置

beancount 是 Python项目,可以使用 pip3 安装, 另外有 Web GUI 可以使用 fava.

pip3 install beancount
pip3 install fava

如果需要

安装 beancount 后有命令可以使用

  • bean-bake
  • bean-doctor
  • bean-extract
  • bean-format
  • bean-price
  • bean-report
  • bean-web
  • bean-check
  • bean-example 提供账本样本
  • bean-file
  • bean-identify
  • bean-query
  • bean-sql

创建账本 可以使用文本编辑器创建账本,文件后缀命名为 .bean 即可。

; 账本配置
option "title" "我的账本" ;账本名称
option "operating_currency" "CNY" ;账本主货币
option "inferred_tolerance_default" "*:0.01" ;精度
option "inferred_tolerance_multiplier" "1.2"

; 开户
2020-01-01 open Income:工资 CNY ;"收入-工资"

2020-01-01 open Liabilities:信用卡:CMB CNY ;"负债-招行信用卡"

2020-01-01 open Assets:虚拟卡:ALI CNY
2020-01-01 open Assets:招行 CNY ;招商银行
2020-01-01 open Assets:现金 CNY ;资产-现金
2020-01-01 open Assets:建行 CNY ;建设银行

2020-01-01 open Expenses:CNY
2020-01-01 open Expenses:穿 CNY
2020-01-01 open Expenses:CNY
2020-01-01 open Expenses:CNY

2020-01-01 open Equity:平衡账户 CN

; 初始化 断言账户
2020-01-01 balance Liabilities:CreditCard:CMB -300.00 CNY
2020-01-01 balance Assets:VirtualCard:Alipay 100000.00 CNY


; 交易记录

2020-01-01 * "xx餐厅" "吃饭"
    Expenses:Food            +200 CNY
    Assets:AliPay            -200 CNY

使用 fava 来阅读账本,其默认使用地址 http://localhost:5000

在账本配置中追加 fava 的配置项

; fava option 
2000-01-01 custom "fava-option" "default-file"
2000-01-01 custom "fava-option" "interval" "day" ;图标的 X 轴,day|week|month|quarter|year
2000-01-01 custom "fava-option" "auto-reload" "true" ; 自动重载
2000-01-01 custom "fava-option" "journal-show" "transaction open"
2000-01-01 custom "fava-option" "currency-column" "100" 
2000-01-01 custom "fava-option" "language" "zh_CN"  ; 中文显示

具体配置可以在运行后查看帮助(help) 中的 Option;

启动fava账本

fava 账本名称.bean

Running Fava on http://localhost:5000

资产

默认交易时间的格式为 YYYY-MM-DD

配置

; 英文分号可以设置注释
option <配置项> <值> ; beancount 配置项

账户

开户时间 open 账户类型:命名:命名区别 货币[,货币2]  ;开户,开户名称现在仅支持英文,尚未支持unicode, YYYY-MM-DD 表示开户时间
备注时间 note 账户名 备注
注销时间 close 账户名

交易记录 一般交易,是至少两个账户进行交易,总和一定为0,货币必须一致。

  • * 表示确认,
  • ! 表示存疑
交易时间 * "交易对象" "备注"
    账户1         +金额 货币类型
    账户2        (-金额 货币类型)


2015-05-30 ! "通信费" "电信费用" #tag ˆlink
  id: "TW378743437"               ; Meta-data
  Expenses:Home:Phone  87.45 CYN
  Assets:Checking                 ; You may leave one amount out

断言和填充 Balance Assertions and Padding

Asserts the amount for only the given currency:

2015-06-01 balance Liabilities:CreditCard  -634.30 CYN 

Automatic insertion of transaction to fulfill the following assertion:

设定 权益(Equity)对一部分不能直接加入资产的

YYYY-MM-DD pad Assets:Checking Equity:Opening-Balances

标签

可以在 交易记录后追加 #tagname (仅支持英文),可以对一些交易进行分类处理.

交易时间 * "交易对象" "备注" #biaoqianmingcheng
    账户1        +金额 货币类型 ; 注释
    账户2        -金额 货币类型 ; 备注

为多条追加同样的标签可以

pushtag #biaoqianmingcheng

; .... 记账记录

poptag #biaoqianmingcheng

备注

时间 note 账户 "备注内容"

eg:
2013-03-20 note Assets:Checking "账号信息" 

事件

可以记录一些事件日志之类的.

日期 event "事件分类" "事件详情"

申报商品


账本分割

beancount 支持 include 语法,意味着可以进行文件管理,而并非讲所有的账本放在一个文本文件中

include "2020.bean"

账本管理

目录结构整理

管理账本的时候随着时间的增加,文本信息也会变多,单文件管理就不在适合。建议二层或者三层管理。

利用 include "账本名称.bean" 来组织账本结构。

个人 个人财务一般不会过于复杂,使用两层即可

main.bean accounts.bean 2019.bean 2020.bean 19 20

公司 比较繁琐复杂,使用三层管理

main.bean accounts.bean 2019.bean 2020.bean accounts.bean 2019-01.bean ... accounts.bean ... 19 1月 20

账本版本控制 Git

多人编辑账本,以及账本分发。

A B B C C D F E G

无论账本如何记账,根据会计恒等式原理,所有的账目必定是平的。

编辑器

VSCODE [vscode]

  • Beancount 语法支持
    追加配置 .vscode/settings.json, 来为账本提供账户的快捷提示输入。
    {
        "beancount.mainBeanFile": "main.bean",
        "beancount.inputMethods": ["pinyin"]
    }
    
  • BeanCount Formatter 格式化工具

相关软件

参考