纯文本会计从复式记账中借用了不少词汇,又加上了几个 Beancount 特有的词。本词汇表解释你在阅读这些文档或自己的账本文件时会遇到的术语,每个词在需要的时候都配了一个简短的例子。每个条目都有自己的链接,所以你可以直接把某个定义发给同事。
账户
账户是一个记录某一条价值流的命名容器,写成一个用冒号分隔的层级结构,归属于五种根类型之一:Assets(资产)、Liabilities(负债)、Equity(权益)、Income(收入)或 Expenses(支出)。这个层级结构就是你整个账簿的组织方式——Assets:US:BofA:Checking 和 Expenses:Food:Restaurant 会自动排序和汇总。每个账户在使用之前都必须先声明。命名规则见 Beancount 语言语法。
权责发生制
权责发生制会计在收入赚得时记录收入、在费用发生时记录费用,而不论现金实际何时流动。收付实现制则相反:只在钱易手时才确认两者。权责发生制能更真实地反映一个期间的业绩,这就是为什么你三月发出的发票属于三月,即使客户五月才付款。
摊销
摊销把一笔大额付款分摊到它实际覆盖的各个期间,让每个月承担应得的成本份额。一月支付的年度保险费是全部十二个月的费用,而不只是一月的。在 Beancount 中,你要么手动写出拆分的分录,要么用插件生成它们——见摊销。
余额断言
余额断言是一条 balance 指令,它声明某个账户在给定日期开始时余额必须是多少,这样你的银行对账单就成了对账簿的自动检查。如果计算出的余额与断言的偏差超过容差,Beancount 会大声报错,给出预期金额和实际金额。那个容差是你所写的最后一位小数的一个单位——4.27 RGAGX 接受 4.26 到 4.28 之间的任何值——在货币前加一个 ~ 可以设置你自己的容差。每个账户每份对账单撒一条断言,是保持账本可信最省力的办法。
2026-01-01 balance Assets:US:BofA:Checking 4,321.00 USDBeancount
Beancount 是一个开源复式记账系统,它的账本是一个纯文本文件,你用任意文本编辑器编辑,用命令行工具验证。它给你严格的、可解析的语法,一门查询语言,以及一个网页界面,不需要数据库,也没有专有文件格式。因为账本是文本,它很乐意和你的代码一起待在 Git 里。从 Beancount 简介开始。
Beancount 查询语言
Beancount 查询语言,通常缩写为 BQL,是你用来向账本提问的类似 SQL 的语言。它运行在解析后的指令之上,而不是数据库之上,所以 SELECT account, sum(position) WHERE year = 2026 会立刻从你编辑的同一个文件给出答案。完整语法见查询语言指南。
记账方法
记账方法是当一笔减少必须挑选要动用哪些现有批次时 Beancount 应用的规则。Beancount 3.2.3 接受七个名称:STRICT(默认,你自己指明批次)、STRICT_WITH_SIZE、NONE、FIFO、LIFO、HIFO 和 AVERAGE。在账户的 open 指令上为它设置一个,或用 option "booking_method" 为整个文件设置。七个中实现了六个:AVERAGE 能解析,但一旦它必须记一笔减少时就报 AVERAGE method is not supported。你选的方法会改变你已实现的资本利得,所以选你税务管辖区期望的那个并保持稳定。库存管理在同一批批次上跑了全部七个,并公布了在 AVERAGE 下失败的账本。
会计科目表
会计科目表是你的账本使用的账户的完整列表,连同组织它们的结构。在 Beancount 中没有单独的科目表文件——那组 open 指令就是你的会计科目表。早早把它设计好能省下日后大量的重命名工作;起点见特定行业的设置。
关闭指令
close 指令标记一个日期,在此之后账户不得再使用,这就是你如何让一个银行账户或一笔还清的贷款退役而不删除其历史的方式。过去的交易仍然有效、仍然可报告;只有新的分录被拒绝。随着账本变老,关闭未使用的账户能让报告保持可读。
2026-03-31 close Assets:US:OldBank:Checking商品
商品是你的账本追踪的任何价值单位——像 USD 这样的货币,像 AAPL 这样的股票代码,像 BTC 这样的加密资产,或者你发明的什么,比如 VACATION-DAYS。Beancount 绝不会背着你转换商品,所以一个金额始终是一个数字,配上它所计价的商品。可选的 commodity 指令让你附加元数据,比如名称或资产类别。
成本基础
成本基础是你为一项持仓实际支付的东西,以你支付时所用的货币记录,并伴随持仓存放,只要你持有它就一直跟着。Beancount 把它写在花括号里——10 AAPL {150.00 USD} 意思是十股以每股 150 美元购得。把花括号加倍,数字就变成总价而不是单价,所以 10 AAPL {{1,500.00 USD}} 记录同一个批次。因为基础随持仓一起走,卖出时资本利得自然就从算术中得出。见库存管理。
指令
指令是 Beancount 文件中的一条指令,通常带日期,账本就是由指令组成的。有十二种带日期:open、close、balance、price、note、document、pad、event、commodity、custom、query,以及交易本身。有几种不带日期,作用于文件而不是某一天——option、include、plugin,以及 pushtag/poptag 这一对。Beancount 在处理之前会把带日期的按日期排序,所以你可以按最好读的顺序保留它们;不带日期的在它写的位置生效。
复式记账
复式记账是把每个经济事件记录为至少两条相互匹配的条目,使它们的权重总是和为零。钱从不被创造或销毁——它只是在账户之间移动,这就是为什么这项技术能抓住单列表记法永远抓不到的差错。权重是一条分录自己的金额,或者它的成本或价格折算回一种货币,所以两条不同商品的分录仍然能相消。Beancount 严格执行这条规则:分录不平衡的交易是错误,不是警告。
2026-03-02 * "Bank" "Buy euros"
Assets:US:BofA:EUR 100.00 EUR @ 1.08 USD
Assets:US:BofA:Checking -108.00 USD信封预算法
信封预算法在你花钱之前就为一项目标留出钱,所以每个类别有自己的限额,而不是争抢一个合并的余额。这个名字来自人们以前发薪日装上现金的纸信封。在纯文本账本中,你用专用账户或预算指令来模拟信封——见预算。
Fava
Fava 是 Beancount 的网页界面:图表、资产负债表、损益表、查询编辑器和录入表单,都从你的账本文件提供服务。它主要是只读的,且在本地运行,所以它改变的是你看账簿的方式,而不改变你记账的方式。beancount.io 托管的托管版本连同它自己的工具一起提供;界面功能指南介绍了你可以在那里做什么。
库存
库存是一个账户当前持有的持仓的集合,每一项都有自己的商品,在相关时还有自己的成本基础和购置日期。一个三次买入同一只股票的券商账户在一个库存里持有三个独立的批次,而不是一个混合的数字。保持批次独立是准确计算收益成为可能的原因。
日记账
日记账是你的账簿中发生的一切按时间顺序排列的列表——交易的原始流,按日期排序,尚未做任何分组或汇总。当你想回答"我三月到底做了什么?"时,你扫的就是这个视图。Fava 的日记账页面通常是发现分类错误条目最快的地方。
分类账
账本是一个实体的完整会计记录集合,在 Beancount 中就意味你的纯文本文件(加上它包含的任何东西)。这个词既是整个账簿的名字,也是文件本身的名字。因为它是文本,账本可以像源代码一样被 diff、审查、分支和合并。
批次
批次是某个商品的一次具体购置,由它的成本基础和购置日期标识。一月买入同一只 ETF、六月再买一次,就产生了两个批次,以后卖出就意味着选择你卖的是哪个批次。批次正是 Beancount 能精确计算已实现收益而不是估算它们的原因。
2026-06-15 * "Broker" "Buy VTI"
Assets:US:Broker:VTI 5 VTI {260.00 USD, 2026-06-15}
Assets:US:Broker:Cash -1,300.00 USD摘要
摘要是对一笔交易是为了什么的自由文本描述,写成交易行上的第二个引号字符串。它是给人看的:"每月房租"、"杂货和家用"。Beancount 不解析它,但六个月后当这条记录不再说得通时,你读的就是它。
开启指令
open 指令声明一个账户、它开始可用的日期,以及可选地它可以持有的商品和它使用的记账方法。Beancount 要求每个账户在它的第一条分录之前被打开,这就是阻止一个拼写错误悄悄创建一个全新账户的机制。限制允许的商品又能把另一整类错误变成报错。
2026-01-01 open Assets:US:Broker:VTI VTI "FIFO"补平
pad 指令告诉 Beancount 插入让某个账户的下一条余额断言成功所需的任何金额,把差额记到第二个账户。它只为一件事而存在:在生命周期中途开启一个账本,而不必重建多年的历史。在初始设置之外使用 pad 通常意味着一个真正的错误正在被掩盖。
收款方
收款方是你与之交易的对方,写成交易行上的第一个引号字符串。保持收款方一致——总是 "Whole Foods",从不有时写 "WholeFoods"——是让基于收款方的报告和自动导入器工作的关键。Beancount 把收款方视为可选;一笔交易可以只带摘要。
纯文本会计
纯文本会计是把你的账簿保存在一个人类可读的、受版本控制的文本文件中,由开源命令行工具处理。它用持久性、可审计性和自动化换来了一个点击式界面:你的数据比任何供应商都活得久,每一次改动都是可审查的 diff,任何脚本都能读它。Beancount、Ledger 和 hledger 是三个最知名的实现。
插件
插件是 Beancount 在处理你的文件时加载的 Python 模块,允许它在报告构建之前添加、转换或验证指令。预测、摊销计划和自定义检查都是通过插件实现的,而不必改变核心语言。你用账本顶部一行独立的 plugin 来启用一个,绝不用 option——option "plugin" "…" 会被 Option 'plugin' may not be set 拒绝。预测插件指南走了一个真实的例子。
分录
分录是交易的一条腿:一个账户、一个金额,以及可选的一个成本或价格。在一笔交易中必须和为零的不是原始金额,而是它们的权重:一个普通金额的权重是它自己,10 FUND @ 38.46 USD 权重是 384.60 USD,而 10 FUND {384.61 USD} 权重是 3,846.10 USD,因为单花括号装的是一个单位的成本。至多有一条分录可以让它的金额留空,这种情况下 Beancount 为你计算平衡数。完整的权重规则见精度与容差。
价格指令
price 指令记录两个商品在某一天的汇率,这就是 Beancount 在报告中把一项持仓转换成其市场价值的方式。price 指令是纯参考数据:它不移动任何钱,不属于任何交易。不要把它和写在分录里的 @ 价格混淆,后者是算术——它给 10 FUND @ 38.46 USD 一个 384.60 USD 的权重,因此决定交易是否平衡。没有 price 指令,一个投资组合仍然按成本平衡,但无法按市值估值。
2026-06-30 price VTI 271.40 USD实时价格为托管账本中受支持的资产提供托管的 price 指令。对于同一日期和货币对(包括倒数货币对),你自己的价格优先。较晚日期的托管价格仍可适用于较晚的估值。
对账
对账是证明你的账簿与外部记录(如银行或券商对账单)一致的行为。在纯文本会计中它大部分是机械的:为每个对账单日期加一条余额断言,让工具告诉你数字是否吻合。每个月都能干净对账的账本,是你可以放心用来报税的账本。
标签和链接
标签和链接是你为了在账户层级之外对交易分组而附加的两个标记:用 # 的标签标记一个主题,如 #trip-japan;用 ^ 的链接把相关条目系在一起,如 ^invoice-2026-014。标签回答"给我看这个类别里的所有东西";链接回答"给我看属于这一个事件的那些条目"。两者在 Fava 中都可筛选,在 BQL 中都可查询——见筛选与搜索。
交易
交易是一个带日期的经济事件,连同记录它的那些分录,是你最常写的指令。它带一个标志(* 表示已确认,! 表示需复核)、一个可选的收款方、一个摘要,以及两条或更多权重和为零的分录。Beancount 文件中的其他一切都为了声明、检查或批注交易而存在。
2026-02-14 * "Blue Bottle" "Coffee with Dana"
Expenses:Food:Coffee 9.50 USD
Assets:US:BofA:Checking -9.50 USD