Beancount 的强大之处不仅在于其纯文本格式,更在于其通过插件实现的扩展性。原生插件是内置模块,可以增强 Beancount 的功能、自动化繁琐任务并强制执行会计最佳实践。在本综合指南中,我们将探讨 Beancount 中提供的所有原生插件以及如何有效使用它们。
什么是 Beancount 插件?
Beancount 插件是处理账本分录的 Python 模块,旨在增加自动化、校验或转换功能。它们在加载账本文件阶段运行,可以:
- 自动化重复性任务(例如:创建账户声明)
- 校验数据完整性(例如:检查重复交易)
- 转换分录(例如:从交易中生成价格分录)
- 强制执行会计规则(例如:每个账户仅限一种商品)
如何使用插件
要在 Beancount 文件中启用插件,请在账本顶部添加 plugin 指令:
plugin "beancount.plugins.auto_accounts"
plugin "beancount.plugins.implicit_prices"某些插件接受配置选项:
plugin "beancount.plugins.check_commodity" "USD,EUR,CAD"原生插件分类
Beancount 的原生插件主要分为四大类:
1. 自动化插件
2. 校验插件
3. 转换插件
4. 元插件
1. 自动化插件
这些插件可以自动化重复的记账任务,为你节省时间并减少手动错误。
auto_accounts - 自动账户声明
功能: 为出现在交易中但尚未明确声明的账户自动插入 Open 指令。
使用原因: 无需在使用前手动声明每个账户。非常适合快速上手,或适合喜欢精简样板代码的用户。
示例:
plugin "beancount.plugins.auto_accounts"
2026-01-01 * "Coffee shop"
Expenses:Food:Coffee 4.50 USD
Assets:Cash -4.50 USD如果没有该插件,你需要手动添加:
2025-12-01 open Expenses:Food:Coffee
2025-12-01 open Assets:Cash使用时机: 适合初学者或希望账本不那么冗长的用户。然而,明确的账户声明有助于发现拼写错误。
close_tree - 账户层级自动关闭
功能: 当你关闭父级账户时,此插件会自动关闭其所有子级账户。
使用原因: 保持账户层级的一致性。如果你关闭了 Assets:Investments,所有子账户(如 Assets:Investments:Stocks 和 Assets:Investments:Bonds)都将被自动关闭。
示例:
plugin "beancount.plugins.close_tree"
2025-06-30 close Assets:Investments
; 以下账户将被自动关闭:
; Assets:Investments:Stocks
; Assets:Investments:Bonds
; Assets:Investments:RealEstate使用时机: 在重构账户层级或关闭整个类别的账户时。
implicit_prices - 自动价格分录生成
功能: 从包含成本 (@) 或价格 (@@) 的交易过账中合成 Price 指令。
使用原因: 从交易中自动填充价格数据库,无需手动输入价格分录即可实现准确的市场价值报告。
示例:
plugin "beancount.plugins.implicit_prices"
2026-01-02 * "Buy AAPL shares"
Assets:Investments:Stocks 10 AAPL @ 150.00 USD
Assets:Cash -1500.00 USD此操作会自动生成:
2026-01-02 price AAPL 150.00 USD使用时机: 对于投资跟踪和多货币会计至关重要,尤其是当你希望获得自动价格历史记录时。
2. 校验插件
这些插件强制执行数据完整性和会计最佳实践,在错误演变成问题之前将其捕获。
noduplicates - 重复交易检测
功能: 通过计算并比较交易数据的哈希值,检查是否不存在完全相同的两笔交易。
使用原因: 防止意外的重复录入,尤其是在从多个来源导入交易时。
示例:
plugin "beancount.plugins.noduplicates"
2026-01-02 * "Rent payment"
Expenses:Rent 1200.00 USD
Assets:Checking -1200.00 USD
; 这将触发一个错误:
2026-01-02 * "Rent payment"
Expenses:Rent 1200.00 USD
Assets:Checking -1200.00 USD使用时机: 始终推荐使用,特别是如果你正在从银行对账单导入或使用多个数据源。
check_commodity - 商品声明校验
功能: 确保账本中使用的所有商品都有对应的 Commodity 指令。
使用原因: 强制执行明确的商品声明,帮助你维护整洁的资产和货币列表。
示例:
plugin "beancount.plugins.check_commodity"
2015-01-01 commodity USD
2020-01-01 commodity AAPL
; 如果没有商品声明,这将触发错误:
2026-01-02 * "Buy Bitcoin"
Assets:Crypto 0.5 BTC @ 45000 USD
Assets:Cash -22500.00 USD使用时机: 推荐用于维护严格的商品跟踪,并防止交易代码中的拼写错误。
check_average_cost - 成本基础验证
功能: 验证交易中是否妥善保留了成本基础,特别是在使用平均成本记账(average-cost booking)时。
使用原因: 确保你的成本会计在税务报告和资本利得计算中保持准确。
适用场景: 对于投资组合以及任何需要精确成本追踪的场景至关重要。
check_closing - 结清余额验证
功能: 将 closing 元数据扩展为余额检查,确保在平仓交易后持仓为零。
使用原因: 确认当你卖出全部持仓时,余额确实为零(没有残留碎股)。
示例:
plugin "beancount.plugins.check_closing"
2026-01-02 * "Close entire AAPL position" #closing
Assets:Investments:Stocks -100 AAPL {150.00 USD}
Assets:Cash 15000.00 USD
Income:Investments:Gains -500.00 USD#closing 标签告知插件在交易完成后验证你的 AAPL 持仓是否为零。
适用场景: 在卖出全部持仓时使用,以确保无任何残留。
coherent_cost - 货币/成本一致性检查
功能: 验证货币使用是否一致 —— 检查是否存在同时使用带成本标注和不带成本标注的情况。
使用原因: 防止混合使用裸货币(如 100 USD)和带成本的货币(如 100 USD {1.2 CAD}),这可能会导致会计错误。
适用场景: 建议在多货币账本中使用,以保持一致性。
leafonly - 强制使用叶子账户
功能: 确保只有叶子账户(没有子账户的账户)接收过账。
使用原因: 强制执行清晰的账户层级结构,使得汇总账户(如 Expenses:Food)不包含直接过账,只有其子账户(如 Expenses:Food:Groceries 和 Expenses:Food:Restaurants)包含过账。
示例:
plugin "beancount.plugins.leafonly"
; 这将触发错误:
2026-01-02 * "Grocery shopping"
Expenses:Food 50.00 USD ; 错误:应过账到叶子账户
Assets:Cash -50.00 USD
; 正确方式:
2026-01-02 * "Grocery shopping"
Expenses:Food:Groceries 50.00 USD ; 正确:过账到叶子账户
Assets:Cash -50.00 USD适用场景: 当你希望维持严格的层级会计结构并进行清晰的分类时。
nounused - 未使用账户检测
功能: 识别已开设但在任何交易中都未曾实际使用的账户。
使用原因: 帮助你清理账户声明,识别潜在的拼写错误或废弃账户。
适用场景: 定期使用,用于审计和清理你的账户结构。
onecommodity - 每个账户单一商品
功能: 强制要求每个账户仅持有一种类型的商品(资产)。
使用原因: 防止在同一账户中混合不同的资产,这通常是会计的最佳实践。
示例:
plugin "beancount.plugins.onecommodity"
2026-01-02 * "Buy stocks"
Assets:Investments 10 AAPL @ 150 USD
Assets:Cash -1500.00 USD
; 这将触发错误:
2026-01-03 * "Buy more stocks"
Assets:Investments 5 GOOGL @ 140 USD ; 错误:不同的商品
Assets:Cash -700.00 USD适用场景: 当你偏好严格的账户隔离(每个股票/资产一个账户)时。
sellgains - 资本利得验证
功能: 将声明的资本利得与从分批销售(lot sales)计算出的收益进行交叉比对,确保你的损益计算准确。
使用原因: 捕捉手动计算资本利得时的错误,这对于准确的税务报告至关重要。
示例:
plugin "beancount.plugins.sellgains"
2026-01-02 * "Sell AAPL shares"
Assets:Investments:Stocks -10 AAPL {140.00 USD}
Assets:Cash 1500.00 USD
Income:Investments:Gains -100.00 USD ; 插件会验证此项是否正确该插件将验证:销售收入 (1500) - 成本基础 (1400) = 利得 (100)
适用场景: 对于任何交易股票、加密货币或其他涉及资本利得的资产的人来说都是必不可少的。
unique_prices - 价格唯一性检查
功能: 确保每个日期、每种商品只有一个价格条目。
使用原因: 防止冲突的价格数据导致估值错误。
适用场景: 建议在手动输入价格或从多个价格源导入时使用。
3. 转换插件
这些插件以实用的方式修改或增强你的账本数据。
currency_accounts - 货币交易账户
功能: 实现货币交易账户,以显式追踪外汇兑换。
使用原因: 提供货币兑换交易的详细追踪,适用于有此要求的会计准则。
适用场景: 当你需要单独追踪外汇损益或满足特定会计要求时。
commodity_attr - 商品属性验证
功能: 验证商品指令(commodity directives)是否具有所需的属性(如 export、name 等)。
使用原因: 确保你的商品元数据完整且一致。
适用场景: 当你为了报告或导出目的而维护详细的商品元数据时。
4. 元插件 (Meta-Plugins)
这些插件是其他插件的集合,旨在提供便利。
auto - 所有自动化插件
功能: 在一个指令中启用一系列“宽松”或自动化的插件。
何时使用: 适用于希望以最少配置实现最高自动化程度的用户,用于快速设置。
pedantic - 所有校验插件
功能: 一次性启用所有严格校验插件。
使用原因: 强制执行最高级别的数据完整性和会计严谨性。非常适合正式账本或对准确性要求极高的场景。
示例:
plugin "beancount.plugins.pedantic"
; 这相当于启用了:
; - check_commodity
; - check_average_cost
; - coherent_cost
; - leafonly
; - noduplicates
; - nounused
; - onecommodity
; - sellgains
; - unique_prices何时使用: 适用于正式账本,当你希望进行最大限度的校验并愿意维护更严格的会计实操时。
推荐插件配置
初学者配置
plugin "beancount.plugins.auto_accounts"
plugin "beancount.plugins.noduplicates"
plugin "beancount.plugins.implicit_prices"这套精简的配置在提供自动化的同时,能防止常见的错误。
投资者配置
plugin "beancount.plugins.auto_accounts"
plugin "beancount.plugins.implicit_prices"
plugin "beancount.plugins.sellgains"
plugin "beancount.plugins.check_average_cost"
plugin "beancount.plugins.unique_prices"专注于投资跟踪和资本利得的准确性。
严格会计配置
plugin "beancount.plugins.pedantic"
plugin "beancount.plugins.sellgains"
plugin "beancount.plugins.check_closing"为正式生产环境提供最大限度的校验。
Beancount.io 的默认配置
在 Beancount.io,我们在所有新的账本文件中默认包含 auto_accounts 插件:
plugin "beancount.plugins.auto_accounts"这在易用性和功能性之间取得了平衡,方便用户快速上手。
最佳实践
-
从简开始,按需添加: 从
auto_accounts和noduplicates开始,随着账本的成熟,再逐步添加校验插件。 -
单独测试插件: 添加多个插件时,请逐个启用,以了解每个插件的具体影响。
-
仔细阅读错误信息: 插件报错通常指向需要修复的真实会计问题。
-
在正式账本中使用
pedantic: 一旦你的工作流稳定下来,考虑启用严格校验。 -
结合自定义插件: 原生插件可以与自定义插件(如 预测插件)配合使用,以实现最大化功能。
原生插件之外
虽然原生插件提供了核心功能,但 Beancount 生态系统还包含许多由社区开发的插件,用于满足特定需求:
- fava.plugins.forecast - 用于定期交易预测
- fava.plugins.link_documents - 用于将交易关联至收据文件
- 针对特定银行 CSV 格式的自定义导入器
- 特定税务计算器和报表
访问 Beancount 生态系统 了解更多选项。
总结
Beancount 的原生插件将纯文本会计从手动过程转变为自动化、经过验证且健壮的财务管理系统。通过理解并利用这些内置工具,你可以:
- ✅ 自动化繁琐的记账任务
- ✅ 在错误演变成问题之前及时发现
- ✅ 保持严格的数据完整性
- ✅ 生成准确的财务报表
- ✅ 专注于财务洞察而非数据录入
今天就开始在你的账本中试验这些插件吧。建议先从 auto_accounts 和 implicit_prices 开始,然后随着会计实践的成熟,逐渐添加校验插件。
准备好尝试这些插件了吗? 立即前往 Beancount.io 并在你的账本文件中开始使用它们!
来源
对 Beancount 插件有疑问?欢迎加入我们的 社区论坛 参与讨论,或查阅我们的 帮助中心文档。
探索实时加密货币账本示例: