写在前面: 面对全面铺开后多样的消费机会,开发者们如安在保证质量日子的一同,借助开源东西,全面、科学地规划和办理个人财务,掌握资金动向,避开消费陷阱?
LigaAI特邀我司Nerd4me 大佬共享其个人财务办理经验,系列共分「概念篇」和「实战篇」。本篇「实战篇」,将翻开介绍开发者怎么运用 Beancount 系统且快捷地记账。
Beancount 是一个根据纯文本的开源记账软件,供给了一系列开箱即用的指令行东西,以及一套简洁、有用且美观的 Web UI。
其间心记账逻辑是「复式记账法」,即每一笔买卖至少相关两个买卖账户,一借一贷,数额相等。特别的是, 复式记账法规定「收入为负,开销为正」 —— 在《「钞才能养成指北」前传》中,咱们也具体解释了这点,大家能够按需补课。
新手指南:Why Beancount?
市面上有十分多成熟、闻名的记账东西,为什么我仍强烈推荐运用 Beancount?出于以下几点考虑:
Beancount 是 Ledger-Like 家族的杰出成员。对比背靠C++
的 Ledger,根据Python
的 Beancount 应用简便,新增插件或二次开发更简单;多钱银支撑等丰富而强大的功用,能够很好地掩盖各种记账、查账场景。
事实上,Beancount 并不知道什么是「钱银」。它仅仅记载了「通货 Commodity」的改变,而通货完全由用户定义。 因而,Beancount 能够记载含钱银在内任何东西的改变,如年假天数、股票、航空路程、信用卡积分……
当然,也能够用来数豆子——这也是「Beancount」名字的由来 >A<
英勇黄铜:基本环境建立
迈出「Beancount 记账」的第一步,需求装置Python3
环境和对应包。
pip install beancount fava
运用下列指令,生成一个官方供给的示例。
bean-example > example.beancount
通过fava
指令运转 Web UI 。默许状况下的 Web UI 会运转在http://localhost:5000
中。
fava -H 0.0.0.0 example.beancount
不平白银:Beancount 语法入门
环境建立后,咱们需求制造账本来承载账目信息。Beancount 作者在Beancount User’s Manual中供给了十分详尽的运用说明,大家能够根据实践需求自行创建。
下面以《「钞才能养成指北」前传》中「老王煎饼摊」为例,逐渐演示怎么运用 Beancount 编写账本并制成报表。
1. 制造账本
新建一个纯文本文件并保存为laowang.bean
。在任意文本编辑器翻开,只需简单两步就能完结账本内容的编写。
第一步:建立买卖账户
运用open指令建立买卖账户,语法结构为开户时刻 open 账户类型:账户名称 钱银类型;补白
。
其间,开户时刻应早于该账户相关的首笔买卖发生的时刻;一同,在复式记账法中,买卖账户分为五大类型:
-
Assets – 财物类账户:现金、存款、基金、股票、房子、车子、借出账款等;
-
Liabilities – 负债类账户:信用卡、借款、花呗、向他人借款等;
-
Income – 收入类账户:薪酬、奖金、专利、出资收益等;
-
Expenses – 费用类账户:衣食住行等一切花销、春节发出的红包等;
-
Equity – 权益类账户:记账前已有的财物或负债,一般在账户初始化时设置。
1970-01-01 open Income:Sales CNY
1970-01-01 open Assets:Bank:Saving:ICBC CNY
1970-01-01 open Assets:Fixed CNY ;固定财物
1970-01-01 open Liabilities:CreditCard:ICBC CNY
1970-01-01 open Expenses:Food CNY
第二步:编写买卖记载
Beancount 是复式记账东西,其账目分录至少包括三行信息:买卖概况、开销概况和收入概况。
买卖概况记载了买卖时刻、收款人信息和买卖补白,格局为YYYY-MM-DD */! "" ""
。
- 「 */! 」为对账标识符: * 表明该买卖已承认,! 表明该买卖存疑/待承认。
- 双引号中的为选填内容,别离记载「收款人 Payee」和「买卖补白 Narration」。
开销/收入概况记载出/进账的账户名称、买卖数额和钱银类型,出账为负,进账为正,正负金额相加为零。
2023-01-01 * "xx公司" "购买设备"
Assets:Bank:Saving:ICBC -1,000.00 CNY
Assets:Fixed 1,000.00 CNY
2023-01-01 * "采购食材"
Liabilities:CreditCard:ICBC -500.00 CNY
Expenses:Food 500.00 CNY
把「老王煎饼摊」的账本弥补完整,就会得到下面这个laowang.bean
文件。
1970-01-01 open Income:Sales CNY
1970-01-01 open Assets:Bank:Saving:ICBC CNY
1970-01-01 open Assets:Fixed CNY ;固定财物
1970-01-01 open Liabilities:CreditCard:ICBC CNY
1970-01-01 open Expenses:Food CNY
2023-01-01 * "xx公司" "购买设备"
Assets:Bank:Saving:ICBC -1,000.00 CNY
Assets:Fixed 1,000.00 CNY
2023-01-01 * "采购食材"
Liabilities:CreditCard:ICBC -500.00 CNY
Expenses:Food 500.00 CNY
2023-01-02 * "煎饼销售收入"
Income:Sales -1,000.00 CNY
Assets:Bank:Saving:ICBC 1,000.00 CNY
2023-01-02 * "质量问题食材退货"
Expenses:Food -100.00 CNY
Liabilities:CreditCard:ICBC 100.00 CNY
2. 生成财务报表
运用 Beancount 指令行东西集中的bean-report
指令,能够完结各类财务报表的主动生成。
比如,income
子指令能生成损益表,balsheet
能够计算财物负债状况,balances
用于查询各账户余额等。
(BEANCOUNT) bean-report laowang.bean balances
Assets:Bank:Saving:ICBC
Assets:Fixed 1000.00 CNY
Equity
Expenses:Food 400.00 CNY
Income:Sales -1000.00 CNY
Liabilities:CreditCard:ICBC -400.00 CNY
账户余额表指出,老王持有 1,000 元的固定财物、在食材上花费 400 元、煎饼经营收入 1,000 元、信用卡欠款 400 元。
对许多非技术背景的朋友来说,用指令行出现的数据有点不太好阅览。不要紧,Beancount 自己会出手:Beancount 为咱们供给了一个可视化东西Fava
。
装置Fava
后,运用fava laowang.bean
指令发动 Web UI 服务。在浏览器中翻开http://localhost:5000/
,就能够获得表格局的报表数据。
荣耀黄金:进阶场景说明
在现实日子中,除了「一对一」买卖,咱们还会遇到许多涉及多个账户的「一对多」和「多对多」的状况。下面几个场景展示了 Beancount 和复式记账法在处理杂乱买卖方面的优势。
场景 1 :发薪酬
应聘谈薪,咱们关怀「税前薪酬」和「到手薪酬」。那么,每月发放的薪酬、奖金,交纳的五险一金和个人所得税等费用,在 Beancount 中应该怎么入账呢?
2023-01-10 * "Some Company" "薪酬2022-12"
Income:SomeCompany:Salary -20,000.00 CNY ;应发薪酬
Income:SomeCompany:Benefits -500.00 CNY ;节日福利
Income:SomeCompany:HousingFund -2,000.00 CNY ;住宅公积金单位扣除
Assets:Government:HousingFund 4,000.00 CNY ;住宅公积金交纳
Expenses:Government:SocialSecurity 1,500.00 CNY ;社保交纳
Expenses:Government:IncomeTax 3,000.00 CNY ;个税交纳
Assets:Bank:Saving:ICBC 14,000.00 CNY ;实发薪酬
不难看出,复式记账法的优势之一是能够清晰地展示同一笔买卖中,资金在各个账户之间的流动联系,反映资金运动的来龙去脉。
场景 2 :记载房产
关于房产、车辆等固定财物,咱们不只关怀其购入时的价值,也同样在乎其后续的升/贬值状况,即当时商场估值。
Beancount 不预先定义任何钱银,咱们能够创建人民币CNY
的变种钱银CNY.UNVEST
,赋予房子一个人民币变种价格(即估值价格) 。
这样,在以人民币CNY
展示总财物时,咱们既能在价格页查看房子的当时市值估值,也不会影响总财物的计算。
;创建房产钱银
2018-06-01 commodity HOUSE.ABC
name: "房产名称"
2018-06-01 open Assets:Property:CS:ABC HOUSE.ABC
;房产购买
2018-06-01 * "XX地产" "房产名称"
Assets:Property:CS:ABC 1 HOUSE.ABC {2,000,000.00 CNY} ;房产购买价格
Assets:Bank:Saving:ICBC 600,000.00 CNY ;首付款
Liabilities:Bank:BOC:MortgageLoan 1,400,000.00 CNY ;典当借款
;房产价格
2018-06-01 price HOUSE.ABC 2,000,000.00 CNY ;买入本钱
2018-06-01 price HOUSE.ABC 2,000,000.00 CNY.UNVEST ;估值价格
2023-01-17 price HOUSE.ABC 2,500,000.00 CNY.UNVEST ;估值价格
场景 3 :AA 制消费分摊
AA 制的费用分摊、信用卡分期还款等买卖记账是典型的「一对多」场景。
小红和小明外出吃饭一共花费 500 元,由小红先行支付;小明几天后想起,将 AA 的费用转账还给小红。在小红的账本中,这笔钱应该这样记载:
2023-01-13 * "xx 饭店" "和小明吃饭"
Assets:VA:Wechat -500.00 CNY ;微信零钱付款
Expenses:Food:DiningOut 250.00 CNY ;AA我(小红)的一半
Assets:Receivables:Xiao-Ming 250.00 CNY ;AA小明的一半
2023-01-17 * "小明" "AA吃饭收款"
Assets:VA:Wechat 250.00 CNY
Assets:Receivables:Xiao-Ming -250.00 CNY
场景 4 :钱银转换
出入境限制全面铺开,许多老友也都挑选出国游玩散心。在消费记账时,Beancount 怎么处理不同钱银之间的汇率转化联系?
在登记买卖时,运用@@
即可衔接两种互相转换的钱银。本例中,信用卡开销的 650 元人民币正是由 100 美元转换而来。
2023-01-17 * "在免税店买东西"
Assets:Cash -200.00 USD ;现金支付
Liabilities:CreditCard:ICBC -650.00 CNY @@ 100.00 USD ;信用卡付款
Expenses:Clothing:Pants +150.00 USD
Expenses:Clothing:Shoes +150.00 USD
场景 5 :运用 DSL 进行杂乱查询
除了bean-report
指令外,Beancount 还供给bean-query
东西,支撑SQL
句子查询,以满意更杂乱的数据计算。感兴趣的朋友能够在Beancount – Query Language文档中了解。
这儿共享一下让 Beancount 答复「我都在哪些加油站加过几回油」的操作指令。
超凡大师:最佳实践共享
看到这儿的朋友们,恭喜你们已经学会了 Beancount 复式记账的常用语法和操作。它们能够满意日子中绝大多数消费和买卖的记账需求。下面共享的是一些个人实践的经验总结,希望能更好地帮你敞开「Beancount 之旅」。
1. 账本编辑器的挑选
我挑选VSCode
作为账本文件编辑器,调配Lencerf/vscode-beancount
插件一同运用,能够主动为.bean
或者.beancount
文件加上语法高亮、补全账户名,还能够完结金额数据的主动对齐。
具体的配置操作请查看作者在Github
上供给的协助文档了解。
2. 账户开户日期的建立
前面提到,买卖账户的开设日期应早于该账户首笔买卖发生的时刻。这儿也弥补一些比较有意思的开户事情,供诸位参阅。
- Expenses 账户能够运用自己的出生日期作为开户日期;
-
Income 账户能够按来历分类后再挑选日期,如
Income:SomeCompany:Salary
的开户时刻是该公司的入职日期; - Assets和Liabilities 账户中的借/贷记卡的开设日期,与银行的开户日期保持一致。
3. 切割账本文件结构
记账是一个长期习惯,但是随着时刻累积,账本文件越变越大,只在一个文件中编写和记载就会变得极其不方便。
因而,在创建账本时,咱们能够提早规划账本分类,运用 Beancount 的include
语法对账本进行结构切割。这样就能够在一个 Beancount 文件中包括其他的文件,就像下面这样:
.
├── 2022
│ ├── 09.bean
│ ├── 10.bean
│ ├── 11.bean
│ ├── 12.bean
│ ├── __index.bean
│ ├── creditcard.bean
│ ├── event.bean
│ ├── forecast.bean
│ ├── income.bean
│ ├── loan.bean
│ └── transfer.bean
├── 2023
│ ├── 01.bean
│ ├── __index.bean
│ ├── forecast.bean
│ ├── income.bean
│ ├── insurance.bean
│ ├── loan.bean
│ └── transfer.bean
├── account
│ ├── __index.bean
│ ├── assets.bean
│ ├── equity.bean
│ ├── expenses.bean
│ ├── income.bean
│ └── liabilities.bean
├── commodity
│ ├── __index.bean
│ └── fund.bean
├── doc
│ └── __index.bean
└── main.bean
4. 定时对账
账本的定时对账(或称定时断语,Balance Assertion)就像写代码时的「Ctrl + S」或「Command + S」,无事发生主动隐形,关键时刻出手「救命」。
断语就是告诉 Beancount,在某个日期前,这个账户有多少余额(设值为 A) 。假如 Beancount 计算的该时刻点前的买卖余额 B,与余额 A 不相等,那它就会报错。此刻,咱们只需查看两次断语日期之间的买卖,就能快速定位错账。
运用balance
指令符号某个日期前的账户余额(区别bean-report
指令中的balance
子指令),让 Beancount 主动核对账本中的账户余额是否与实践金额相等。
2023-01-01 balance Assets:Bank:Saving:ICBC 10,000.00 CNY
需求注意,断语声明的是所给日期开始前的余额,即当日的买卖不算在内。也就是说,上面的断语表明,在2023 年元旦前,即截止至 2022 年 12 月 31 日,工商银行储蓄账户余额为 10,000 元。
后记
在 wzyboy 的《Beancount——指令行复式簿记》一文中,我第一次了解到「记账神器 Beancount」;2022 年 9 月前后,我正式运用 Beancount 办理个人财务。现在睡前翻开VSCode
记载当天的资金变化,已经成为固定活动,而在每日的记账、查账中,我也获益良多。
本文共享的 Beancount 入门级操作指令,能够满意(个人)日常记账的简单需求;Beancount 还有许多证券出资、基金净值更新等高档应用,大家能够自行挖宝~
新的一年,坚持记账,搞钱发财!
编者语:# 编程之外是 LigaAI 开设的全新栏目。在这儿,咱们将与开发者朋友们一同发现和共享日子中的「技术时刻」,并通过极具创意与有用的「日子代码」,感触「技术改善日子」的真谛。假如你也对「代码提高幸福感」感兴趣,欢迎重视 LigaAI 帐号。
LigaAI 是新一代智能研制协作渠道,咱们重视研制协作与效率,重视开发者个人的价值创造。往期文章中,咱们共享了许多敏捷开发、项目办理、个人成长与提高的文章,欢迎朋友们阅览沟通。
体验新一代智能研制协作,请 点击这儿 翻开了解。LigaAI 助力开发者扬帆远航,等待与你一路同行!