写在前面: 面对全面铺开后多样的消费机会,开发者们如安在保证质量日子的一同,借助开源东西,全面、科学地规划和办理个人财务,掌握资金动向,避开消费陷阱?

LigaAI特邀我司Nerd4me 大佬共享其个人财务办理经验,系列共分「概念篇」和「实战篇」。本篇「实战篇」,将翻开介绍开发者怎么运用 Beancount 系统且快捷地记账。

Beancount 是一个根据纯文本的开源记账软件,供给了一系列开箱即用的指令行东西,以及一套简洁、有用且美观的 Web UI。

其间心记账逻辑是「复式记账法」,即每一笔买卖至少相关两个买卖账户,一借一贷,数额相等。特别的是, 复式记账法规定「收入为负,开销为正」 —— 在《「钞才能养成指北」前传》中,咱们也具体解释了这点,大家能够按需补课。

新手指南:Why Beancount?

市面上有十分多成熟、闻名的记账东西,为什么我仍强烈推荐运用 Beancount?出于以下几点考虑:

  1. Beancount 采用改良版的复式记账方案,「正负」替代「借贷」 对非会计专业的朋友更友好;

  2. 可直接在本地运转。比较根据云端的东西,数据安全更有保证,无需担心个人账务走漏;

  3. 纯文本文件办理账目,便于记载和存储 根据 Beancount 语法生成的文件,很简单阅览;

  4. 供给完整的指令行东西集和可视化东西 Fava(内含许多财报模板),支撑根据类 SQL 查询,可轻松生成各种杂乱的报表数据;

  5. 账本既是用户的输入文件,也是软件的「数据库」,可完结数据和东西的「无痛搬家」

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的开户时刻是该公司的入职日期;
  • AssetsLiabilities 账户中的借/贷记卡的开设日期,与银行的开户日期保持一致。

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 助力开发者扬帆远航,等待与你一路同行!