复式簿记是一种把每笔交易都记录到复数个账户中的簿记方法。
复式记账又分为了借贷记账法,和正负记账法。一笔交易,钱的流入和流出必定是平的。
- 借 (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 格式化工具
相关软件
- beancount github book
- Fava Web UI github 官方文档, Beancount - Getting Started
- ledger