跳到主要内容

Beancount.io 简介

本指南综合了使用强大的开源纯文本会计工具 Beancount 进行纯文本会计的最佳实践。它涵盖了基本理念、从基础到高级的语法、复杂资产的实际案例研究以及长期账本管理策略。

第一部分: “为什么”——智能记账的基础

在深入研究“如何做”之前,理解“为什么”至关重要。 有效的记账是个人财务管理的基础,也是实现财务清晰和自由的必要步骤。

超越费用跟踪:通往财务清晰之路

简单的费用跟踪应用程序会告诉你你的钱花在了哪里。 一个强大的会计系统不仅会告诉你这些,还会告诉你更多:它提供了你财务健康的完整画面,包括你的净资产、现金流和你的投资表现。 主要目标是 可观察性——获得对你财务生活的清晰、数据驱动的理解,使你能够做出明智的决策、评估风险并朝着退休等长期目标努力。

为什么使用复式记账?平衡系统的力量

与单式记账(简单的费用清单)不同,复式记账法将每笔交易记录为至少两个账户之间的价值流动。 它的核心原则是基本会计等式:

资产=负债+权益 (净值)\text{资产} = \text{负债} + \text{权益 (净值)}

该系统确保你的账簿始终保持平衡,从而大大减少错误。 它通过生成重要的报表(如资产负债表(你拥有和欠款)和利润表(你赚取和花费的金额))来提供完整的财务状况。

第二部分:Beancount 入门

Beancount 是一个强大的、基于 Python 的纯文本会计工具。

在 Beancount.io 上使用 Fava 的初体验

Beancount.io 提供了一个强大的环境,将 Beancount 引擎与移动应用程序(iOSAndroid)和 Web 应用程序 - Fava 相结合,Fava 是一个出色的基于 Web 的界面,用于可视化你的账本。 无需安装。 当你使用该平台时,你将直接与账本文件(例如,main.bean)的文本编辑器进行交互,并实时查看 Fava 生成的报告更新。

Fava 将你编写的纯文本转换为交互式图表、财务报表和可过滤的交易列表,让你清楚地了解你的财务报告。

五种核心账户类型

Beancount 使用五种顶级账户类型,它们构成了你的账本的结构:

账户类型描述典型余额
资产你拥有的东西(现金、银行账户、投资、财产)。正数
负债你欠的东西(信用卡债务、贷款、抵押贷款)。负数
收入钱的来源(工资、奖金、利息)。负数
支出钱的去向(食物、租金、旅行、税收)。正数
权益你的净资产;用于初始余额。负数

Beancount 等式

Beancount 强制执行其自身的会计等式版本,其中整个账本中所有过账的总和等于零:

资产+支出+负债+收入+权益=0\text{资产} + \text{支出} + \text{负债} + \text{收入} + \text{权益} = 0

这就是为什么按照惯例,收入负债权益 账户持有负值——它们是增加你的 资产支出 的资金来源

第三部分:Beancount 的语言 - 核心语法

Beancount 中的所有条目都是以日期开头的指令。

定义账户 (open) 和商品

在使用账户之前,必须使用 open 指令声明它。 你还可以选择指定它将持有的货币或“商品”。

; YYYY-MM-DD open Account:Name [Commodity1, Commodity2, ...]
2020-01-01 open Assets:Bank:US:Chase:Checking USD
2020-01-01 open Liabilities:CreditCard:US:Discover USD
2020-01-01 open Expenses:Food:Groceries
2020-01-01 open Income:Salary:Google

商品可以是真实世界的货币(例如,USDJPY),也可以是你定义的任何自定义单位,例如航空公司里程(MILES_UA)或股票代码(HOOL)。

记录你的第一笔交易 (*)

交易是最常见的条目。 它们以日期、标志(* 表示完整交易,! 表示未完成交易)、可选的收款人和描述开头。 随后的每一行(缩进两个空格)都是对账户的“过账”。

; YYYY-MM-DD * "Payee" "Description"
; Account1 Amount Commodity
; Account2 -Amount Commodity

2024-07-28 * "Trader Joe's" "每周杂货"
Expenses:Food:Groceries 125.50 USD
Liabilities:CreditCard:US:Discover -125.50 USD

为方便起见,如果交易只有两个过账,则可以省略第二行的金额,Beancount 将自动计算。

2024-07-28 * "Trader Joe's" "每周杂货"
Expenses:Food:Groceries 125.50 USD
Liabilities:CreditCard:US:Discover

交易级别的平衡: 更重要的是,对于日常使用,每笔单独的交易也必须平衡——单个交易中所有过账的总和必须等于零。 如果交易不平衡,Beancount 将显示如下错误:

Beancount Error Alert

处理多币种交易 (@@@)

Beancount 擅长多币种会计。

  • 使用 @ 指定每单位换算价格。
  • 使用 @@ 指定换算的总成本。
; 用美元卡购买欧元机票
2024-08-01 * "Lufthansa" "飞往柏林的航班"
Expenses:Travel:Flights 500.00 EUR @@ 545.00 USD ; 500 欧元总共花费我 545 美元
Liabilities:CreditCard:US:Discover -545.00 USD

第四部分:确保准确性 - 调节的艺术

维护准确账本的关键做法是定期调节。 这涉及将 Beancount 账本中的余额与你金融机构的官方报表进行比较。

使用余额断言 (balance) 自动检查

balance 指令是用于自动检查的主要工具。 你断言在给定的日期,账户具有特定的余额。 如果 Beancount 计算的余额与你的断言不符,它将引发错误。 这对于快速查找错误非常宝贵。

注意: 余额断言检查指定日期的开始时的账户状态(在该日期的任何交易之前)。

; 从你的每月信用卡对账单中
2024-08-01 balance Liabilities:CreditCard:US:Discover -1432.78 USD

链接支持文档 (document)

你可以链接到外部文件,如银行对账单或收据,从而创建可审计的跟踪。 Fava 使这些链接可点击。

2024-08-01 document Liabilities:CreditCard:US:Discover "statements/discover-2024-07.pdf"

纠正错误和初始化余额

当你启动账本或发现无法追踪的差异时,你需要进行调整。 标准做法是使用特殊的 Equity 账户。

; 启动账本时初始化现金账户
2020-01-01 * "初始余额" "设置现金账户"
Assets:Cash:Wallet 200.00 USD
Equity:Opening-Balances -200.00 USD

Equity:Opening-Balances 账户持有从未知或外部来源进入你账本的金额。

对于快速修复,如果确切的差异不重要,pad 指令可以自动调整账户的余额以满足后续的 balance 断言,并将差额记入权益账户。 谨慎使用此功能,因为它可能会隐藏更大的问题。 显式调整通常更安全。

第五部分:高级和真实的交易模式

跟踪债务:管理应收账款和应付账款

复式记账非常适合跟踪欠你的钱 (Assets:Receivables) 或你欠的钱 (Liabilities:Payable)。

示例: 你支付了 90 美元的团体晚餐费用,你的朋友 Bob 欠你他那份 45 美元的份额。

  1. 记录初始费用和应收账款:

    2024-08-05 * "晚餐地点" "与 Bob 共进晚餐"
    Expenses:Food:Restaurant 45.00 USD ; 你的份额
    Assets:Receivables:Bob 45.00 USD ; Bob 欠你的
    Assets:Bank:US:Chase:Checking -90.00 USD
  2. 当 Bob 还你钱时:

    2024-08-06 * "Bob" "还我晚餐钱"
    Assets:Bank:US:Chase:Checking 45.00 USD
    Assets:Receivables:Bob -45.00 USD

Assets:Receivables:Bob 账户现在为零,并且你的账簿完全平衡。

资产与费用:汽车购买和折旧

像汽车这样的大额购买不是简单的费用; 它是随着时间推移而贬值的资产(折旧)的购置。

  1. 将购买记录为资产:

    2023-01-15 * "丰田经销商" "购买一辆新车"
    Assets:Car:ToyotaCamry 30000.00 USD
    Assets:Bank:US:Chase:Checking -30000.00 USD
  2. 记录年度折旧: 假设你估计该车每年贬值 3,000 美元。 在年底,你将此记录为费用。

    2023-12-31 * "折旧" "年度汽车价值折旧"
    Expenses:Depreciation:Car 3000.00 USD
    Assets:Car:ToyotaCamry -3000.00 USD

在此条目之后,你的 Assets:Car:ToyotaCamry 账户正确反映了汽车的新价值(27,000 美元),并且你已将使用成本正确地记为该年度的费用。

第六部分:深入研究 - 建模复杂的真实世界资产

案例研究 1:房地产会计

房屋通常是你最大的资产和负债。 以下是如何对其进行建模。

  1. 创建账户和自定义商品:

    2022-01-01 commodity HOUSE_123MAIN
    name: "位于 123 Main St 的房产"
    2022-01-01 open Assets:Property:Home:123Main HOUSE_123MAIN
    2022-01-01 open Liabilities:Mortgage:HomeLoan USD
    2022-01-01 open Expenses:Home:Interest
    2022-01-01 open Expenses:Home:PropertyTax
  2. 记录购买: 假设你以 50 万美元的价格购买了一栋房子,首付 10 万美元,贷款 40 万美元。

    2022-03-15 * "结算公司" "购买 123 Main St"
    Assets:Property:Home:123Main 1 HOUSE_123MAIN {500000.00 USD}
    Assets:Bank:DownPayment -100000.00 USD
    Liabilities:Mortgage:HomeLoan -400000.00 USD
  3. 记录每月抵押贷款付款: 你的每月付款包括本金(减少负债)和利息(费用)。

    2022-04-01 * "抵押贷款银行" "每月抵押贷款付款"
    Liabilities:Mortgage:HomeLoan 800.00 USD ; 本金
    Expenses:Home:Interest 1200.00 USD ; 利息
    Assets:Bank:US:Chase:Checking -2000.00 USD
  4. 跟踪升值(未实现收益): 房屋的市场价值会发生变化。 为了在不影响你的官方净资产的情况下跟踪此情况(因为只有在出售时才能实现收益),你可以将价格指令与“虚拟”货币一起使用。

    ; 购买价格是实际成本基础
    2022-03-15 price HOUSE_123MAIN 500000.00 USD

    ; 更新的市场估价是未实现收益
    2024-01-01 price HOUSE_123MAIN 550000.00 USD.UNREALIZED

这使你可以在 Fava 的图表中查看估计值,而不会不适当地夸大你的资产负债表。

案例研究 2:跟踪限制性股票单位 (RSU)

RSU 是股权补偿的常见形式。 对其进行会计处理涉及跟踪初始授予、归属事件和税款代扣。

  1. 初始设置: 为已归属 (HOOL) 和未归属 (HOOL.UNVEST) 的股票创建商品,以及必要的账户。

    2021-01-01 commodity HOOL
    2021-01-01 commodity HOOL.UNVEST
    2021-01-01 open Assets:Brokerage:Etrade:HOOL HOOL
    2021-01-01 open Assets:Grant:Unvested HOOL.UNVEST
    2021-01-01 open Income:Salary:Hooli:RSU
    2021-01-01 open Expenses:Taxes:Federal
  2. 记录初始授予: 此交易显示了总授予转移到未归属资产账户中。

    2021-02-01 * "Hooli" "初始 RSU 授予"
    Assets:Grant:Unvested 1000 HOOL.UNVEST
    Income:Grant:Awards -1000 HOOL.UNVEST
  3. 记录归属事件: 这是关键交易。 当股票归属时,你会确认收入、支付税款(通常通过出售一些股票)并获得净股票。 假设 100 股以每股 150 美元的价格归属。

    2022-02-01 * "Hooli" "RSU 归属事件"
    ; 确认 100 * 150 美元 = 15,000 美元的总收入
    Income:Salary:Hooli:RSU -15000.00 USD

    ; 显示从该收入中支付的税款
    Expenses:Taxes:Federal 4000.00 USD
    Expenses:Taxes:State 1000.00 USD

    ; 你以其成本基础获得净股票(假设 60 股)
    Assets:Brokerage:Etrade:HOOL 60 HOOL {150.00 USD}

    ; 另外 40 股被出售以支付 6000 美元的税款。
    ; 此交易平衡了收入、税款和收到的股票。
    ; 我们还必须显示未归属股票的减少。
    Assets:Grant:Unvested -100 HOOL.UNVEST
    Expenses:Grant:Vested 100 HOOL.UNVEST

这笔单一的、平衡的交易正确地建模了整个事件:未归属的授予减少,收入得到确认,税款已支付,并且净已归属的股票出现在你的经纪账户中,并具有正确的成本基础,以用于将来的资本收益计算。

第七部分:账本的项目管理

随着账本的增长,组织变得至关重要。

使用版本控制 (Git) 来保护你的数据

由于你的账本是一个文本文件,因此非常适合使用 Git 进行版本控制。 这为你提供了所有更改的完整历史记录,从而保护你免受意外删除或错误的影响。 警告: 你的财务数据高度敏感。 在 GitHub/GitLab 等服务上使用私有存储库,或者托管你自己的存储库。

使用标签 (#) 和链接 (^) 进行组织

Beancount 提供了两种在账户之外对交易进行分组的方法:

  • 标签 (#): 用于事件或项目。 例如,你可以过滤与特定旅行相关的所有交易。 2024-07-20 * "Hotel" "Vienna" #trip-europe-2024
  • 链接 (^): 用于连接在不同时间发生的财务相关交易,例如现金提取和相关的银行费用。

用于构建文件的可扩展策略 (include)

单个大型文件很难管理。 使用 include 指令将你的账本拆分为多个文件。 main.bean

; 主账本文件

; 全局选项
option "title" "我的个人账本"
option "operating_currency" "USD"

; 包括账户声明和其他文件
include "accounts.bean"
include "years/2023.bean"
include "years/2024.bean"
include "events/trip-europe-2024.bean"

强大的组织策略,按优先级顺序排列:

  1. 按事件: 为主要的、独立的事件创建一个单独的文件(例如,trip-europe-2024.bean)。
  2. 按类别/收款人: 对于高度规律的、经常性交易(如水电费或工资),请将其分组到自己的文件中(例如,recurring-rent.bean)。
  3. 按账户: 对于与特定账户紧密相关的交易(利息、费用、信用卡付款),请考虑使用特定于账户的文件。
  4. 按日期: 对于所有其他常规交易,按年份 (2024.bean) 或月份 (2024/07.bean) 进行简单的拆分非常有效。

第八部分:结论

Beancount 提供了陡峭的学习曲线,但它以无与伦比的力量、灵活性和对你财务数据的控制来回报你的努力。 通过拥抱复式记账的原则和 Beancount 提供的实用工具,你可以从简单的费用跟踪转变为完整、准确和有洞察力的个人财务管理系统。 你的账本将成为一个永久的、私人的和宝贵的资产,用于了解你的过去和规划你的未来。

Beancount.io 入门

Beancount.io 是一个现代的基于云的财务管理平台,它将你的基于文本的交易记录转换为全面的财务报表,包括利润表、资产负债表和试算表。 通过将纯文本文件的可靠性与强大的可视化工具相结合,Beancount.io 帮助你保持对财务生活的精确控制,同时获得对你投资业绩的宝贵见解。

使用 Beancount.io 开始你的财务之旅 - 在我们的促销期间免费!

Expenses

Income Statement

Balance Sheet