你应该了解的 Beancount 核心内置插件
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"
这套精简的配置在提供自动化的同时,能防止常见的错误。