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

  • 借 (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" 来组织账本结构。

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

.---o 账本文件夹
 \
  *---> main.bean        主账本
  |---> accounts.bean    账户
  |---> 2019.bean        19 年账本
  '---> 2020.bean        20 年账本

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

.---o 账本文件夹
 \
  *---> main.bean               主账本
  |---> accounts.bean           账户
  |
  |--*--> 2019.bean             19 年账本
  |   \
  |    +---> accounts.bean      客户账户
  |    |---> 2019-01.bean       1月份
  |    '---> ...                其他账本
  |
  |
  '--*--> 2020.bean             20 年账本
      \
       \-----> accounts.bean    客户账户
        '----> ...              其他账本

账本版本控制 Git

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

                          .--->  F 
 A       B      C  D     /
 *-------*-----*---*----*----->  E 
          \            ^ \
           v          /   '--->  G 
            B --> C -'

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

编辑器

VSCODE [vscode]

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

相关软件

参考