Beancount 对比 hledger:哪款纯文本记账工具最适合你?
如果你已经决定使用纯文本记账(plain-text accounting)来管理财务,那么你已经做出了一个明智的选择。你的财务数据将存储在完全由你控制、可由人类阅读的文件中,通过版本控制进行追踪,并免受供应商锁定。但接下来的问题是:你应该使用哪款工具?
Beancount 和 hledger 是当今最受欢迎的两款纯文本记账(PTA)工具。它们都是开源的,由社区积极维护,且能够处理从个人预算到复杂投资组合的所有事务。然而,它们在记录、验证和分析财务数据的方法论上有着本质的区别。
本指南将分析它们之间的关键差异,以便你选择最适合你的工作流、经验水平和财务追踪需求的工具。
核心哲学:严格 vs. 灵活
Beancount 和 hledger 之间最大的区别不在于功能,而在于思维方式。
Beancount 是严厉的老师。 它假设你会犯数据录入错误,并内置了护栏以尽早捕获这些错误。每个账户在使用前必须显式开启。每笔交易必须平衡为零。货币必须遵循严格的格式。如果发现任何异常,Beancount 将拒绝处理你的文件,直到你修复错误。
hledger 是宽容的朋友。 它使用更宽松的语法,允许你跳过预先声明账户的步骤,甚至可以推断平衡分录。你可以用最少的设置开始追踪财务,并随着需求的增长逐渐增加结构。
这两种方法没有绝对的优劣之分。如果你希望在错误演变成数小时的调试工作之前就捕获它们,那么 Beancount 的严格性就是一个优点。如果你想快速上手并更喜欢灵活性,那么 hledger 的包容性则是其优势。
语法和数据格式
这两款工具都将交易存储在纯文本文件中,但语法规则有明显不同。
Beancount 语法
2026-03-15 * "Whole Foods" "Weekly groceries"
Expenses:Food:Groceries 85.42 USD
Liabilities:CreditCard:Visa
关键规则:
- 日期使用 ISO 8601 格式 (
YYYY-MM-DD) - 货币必须是大写字母(例如
USD、EUR),不使用符号如$或€ - 账户名称至少需要两个由冒号分隔的组件(例如
Expenses:Food) - 描述必须是带引号的字符串
- 所有账户必须使用
open指令显式开启
hledger 语法
2026-03-15 Whole Foods | Weekly groceries
expenses:food:groceries $85.42
liabilities:creditcard:visa
关键规则:
- 更灵活的日期格式
- 允许使用
$和€等货币符号 - 账户名称可以小写,且格式更自由
- 描述不需要引号
- 无需预先声明账户
结论:Beancount 较严格的语法意味着前期工作较多,但歧义较少。hledger 宽松的语法更容易上手,但需要更多的自律来保持一致性。
数据完整性和验证
这是 Beancount 真正脱颖而出的地方。
余额断言 (Balance Assertions)
两款工具都支持余额断言——即验证你记录的余额是否与银行账单相符。但它们的工作方式不同。
Beancount 使用带日期的余额断言,且与顺序无关。你可以随意重新排列交易文件,断言仍然有效。hledger 的断言则依赖于文件中的顺序,这意味着移动交易位置可能会导致断言失效。
库存追踪 (Inventory Tracking)
对于任何追踪投资的人来说,这一点至关重要。Beancount 强制执行严格的库存记账:你不能卖出从未买入的股票,并且它能精确追踪成本基准。这可以防止“成本基准流失”——这是一种细微的错误,会导致你的资本利得计算偏离现实。
hledger 也可以处理商品和批次,但强制性较低。它更灵活,但也意味着对于一些可能直到报税时才会被发现的错误更加宽容。