本指南综合了使用强大的开源纯文本会计工具 Beancount 进行纯文本会计的最佳实践。它涵盖了基本理念、从基础到高级的语法、复杂资产的实际案例研究以及长期账本管理策略。
第一部分: “为什么”——智能记账的基础
在深入研究“如何做”之前,理解“为什么”至关重要。 有效的记账是个人财务管理的基础,也是实现财务清晰和自由的必要步骤。
超越费用跟踪:通往财务清晰之路
简单的费用跟踪应用程序会告诉你你的钱花在了哪里。 一个强大的会计系统不仅会告诉你这些,还会告诉你更多:它提供了你财务健康的完整画面,包括你的净资产、现金流和你的投资表现。 主要目标是 可观察性——获得对你财务生活的清晰、数据驱动的理解,使你能够做出明智的决策、评估风险并朝着退休等长期目标努力。
为什么使用复式记账?平衡系统的力量
与单式记账(简单的费用清单)不同,复式记账法将每笔交易记录为至少两个账户之间的价值流动。 它的核心原则是基本会计等式:
该系统确保你的账簿始终保持平衡,从而大大减少错误。 它通过生成重要的报表(如资产负债表(你拥有和欠款)和利润表(你赚取和花费的金额))来提供完整的财务状况。
第二部分:Beancount 入门
Beancount 是一个强大的、基于 Python 的纯文本会计工具。
在 Beancount.io 上使用 Fava 的初体验
Beancount.io 提供了一个强大的环境,将 Beancount 引擎与移动应用程序(iOS、Android)和 Web 应用程序 - Fava 相结合,Fava 是一个出色的基于 Web 的界面,用于可视化你的账本。 无需安装。 当你使用该平台时,你将直接与账本文件(例如,main.bean)的文本编辑器进行交互,并实时查看 Fava 生成的报告更新。
Fava 将你编写的纯文本转换为交互式图表、财务报表和可过滤的交易列表,让你清楚地了解你的财务报告。
五种核心账户类型
Beancount 使用五种顶级账户类型,它们构成了你的账本的结构:
| 账户类型 | 描述 | 典型余额 |
|---|---|---|
资产 | 你拥有的东西(现金、银行账户、投资、财产)。 | 正数 |
负债 | 你欠的东西(信用卡债务、贷款、抵押贷款)。 | 负数 |
收入 | 钱的来源(工资、奖金、利息)。 | 负数 |
支出 | 钱的去向(食物、租金、旅行、税收)。 | 正数 |
权益 | 你的净资产;用于初始余额。 | 负数 |
Beancount 等式
Beancount 强制执行其自身的会计等式版本,其中整个账本中所有过账的总和等于零:
这就是为什么按照惯例,收入、负债 和 权益 账户持有负值——它们是增加你的 资产 和 支出 的资金来源。
第三部分: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商品可以是真实世界的货币(例如,USD、JPY),也可以是你定义的任何自定义单位,例如航空公司里程(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 擅长多币种会计。
- 使用
@指定每单位换算价格。 - 使用
@@指定换算的总成本。
; 用美元卡购买欧元机票
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 USDEquity:Opening-Balances 账户持有从未知或外部来源进入你账本的金额。
对于快速修复,如果确切的差异不重要,pad 指令可以自动调整账户的余额以满足后续的 balance 断言,并将差额记入权益账户。 谨慎使用此功能,因为它可能会隐藏更大的问题。 显式调整通常更安全。
第五部分:高级和真实的交易模式
跟踪债务:管理应收账款和应付账款
复式记账非常适合跟踪欠你的钱 (Assets:Receivables) 或你欠的钱 (Liabilities:Payable)。
示例: 你支付了 90 美元的团体晚餐费用,你的朋友 Bob 欠你他那份 45 美元的份额。
-
记录初始费用和应收账款:
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 -
当 Bob 还你钱时:
2024-08-06 * "Bob" "还我晚餐钱" Assets:Bank:US:Chase:Checking 45.00 USD Assets:Receivables:Bob -45.00 USD
Assets:Receivables:Bob 账户现在为零,并且你的账簿完全平衡。
资产与费用:汽车购买和折旧
像汽车这样的大额购买不是简单的费用; 它是随着时间推移而贬值的资产(折旧)的购置。
-
将购买记录为资产:
2023-01-15 * "丰田经销商" "购买一辆新车" Assets:Car:ToyotaCamry 30000.00 USD Assets:Bank:US:Chase:Checking -30000.00 USD -
记录年度折旧: 假设你估计该车每年贬值 3,000 美元。 在年底,你将此记录为费用。
2023-12-31 * "折旧" "年度汽车价值折旧" Expenses:Depreciation:Car 3000.00 USD Assets:Car:ToyotaCamry -3000.00 USD
在此条目之后,你的 Assets:Car:ToyotaCamry 账户正确反映了汽车的新价值(27,000 美元),并且你已将使用成本正确地记为该年度的费用。
第六部分:深入研究 - 建模复杂的真实世界资产
案例研究 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 -
记录购买: 假设你以 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 -
记录每月抵押贷款付款: 你的每月付款包括本金(减少负债)和利息(费用)。
2022-04-01 * "抵押贷款银行" "每月抵押贷款付款" Liabilities:Mortgage:HomeLoan 800.00 USD ; 本金 Expenses:Home:Interest 1200.00 USD ; 利息 Assets:Bank:US:Chase:Checking -2000.00 USD -
跟踪升值(未实现收益): 房屋的市场价值会发生变化。 为了在不影响你的官方净资产的情况下跟踪此情况(因为只有在出售时才能实现收益),你可以将价格指令与“虚拟”货币一起使用。
; 购买价格是实际成本基础 2022-03-15 price HOUSE_123MAIN 500000.00 USD ; 更新的市场估价是未实现收益 2024-01-01 price HOUSE_123MAIN 550000.00 USD.UNREALIZED
这使你可以在 Fava 的图表中查看估计值,而不会不适当地夸大你的资产负债表。
案例研究 2:跟踪限制性股票单位 (RSU)
RSU 是股权补偿的常见形式。 对其进行会计处理涉及跟踪初始授予、归属事件和税款代扣。
-
初始设置: 为已归属 (
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 -
记录初始授予: 此交易显示了总授予转移到未归属资产账户中。
2021-02-01 * "Hooli" "初始 RSU 授予" Assets:Grant:Unvested 1000 HOOL.UNVEST Income:Grant:Awards -1000 HOOL.UNVEST -
记录归属事件: 这是关键交易。 当股票归属时,你会确认收入、支付税款(通常通过出售一些股票)并获得净股票。 假设 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"强大的组织策略,按优先级顺序排列:
- 按事件: 为主要的、独立的事件创建一个单独的文件(例如,
trip-europe-2024.bean)。 - 按类别/收款人: 对于高度规律的、经常性交易(如水电费或工资),请将其分组到自己的文件中(例如,
recurring-rent.bean)。 - 按账户: 对于与特定账户紧密相关的交易(利息、费用、信用卡付款),请考虑使用特定于账户的文件。
- 按日期: 对于所有其他常规交易,按年份 (
2024.bean) 或月份 (2024/07.bean) 进行简单的拆分非常有效。
第八部分:结论
Beancount 提供了陡峭的学习曲线,但它以无与伦比的力量、灵活性和对你财务数据的控制来回报你的努力。 通过拥抱复式记账的原则和 Beancount 提供的实用工具,你可以从简单的费用跟踪转变为完整、准确和有洞察力的个人财务管理系统。 你的账本将成为一个永久的、私人的和宝贵的资产,用于了解你的过去和规划你的未来。
Beancount.io 入门
Beancount.io 是一个现代的基于云的财务管理平台,它将你的基于文本的交易记录转换为全面的财务报表,包括利润表、资产负债表和试算表。 通过将纯文本文件的可靠性与强大的可视化工具相结合,Beancount.io 帮助你保持对财务生活的精确控制,同时获得对你投资业绩的宝贵见解。
使用 Beancount.io 开始你的财务之旅 - 在我们的促销期间免费!


