税务在个人理财领域常常被视为一种特殊而复杂的难题。但如果它们不是呢?如果你能像处理账簿中任何其他资金流一样对待它们,会怎样?好消息是:你可以。通过将税务视为简单的价值流动,你的 Beancount 账簿将保持整洁、易于查询,并且——最重要的是——易于理解。
以下是一种实用、直接的模式,你可以将其直接用于个人或小型企业的 Beancount 文件中。这是一个处理工资单、纳税甚至跨年退税的简单系统。我们将介绍你需要的核心账户,通过实际示例进行讲解,并展示确切的查询语句以获得你需要的答案。
核心原则
在我们深入研究代码之前,让我们先达成几个简单的共识。这些原则有助于保持逻辑清晰并避免未来的麻烦。
-
将“它是什么”与“现金何时流动”分开。 🗓️ 这是最重要的概念。一项税务支出属于你赚取收入的年份(例如 2024 年),即使你在 2025 年 4 月才向税务局缴清这笔款项。如果你不将支出的时间与现金支付的时间分开,你的逐年报告将会变得混乱且具有误导性。
-
保持你的账户层级简单乏味。 📁 根据税务_类型_(例如
IncomeTax、SocialSecurity)清晰地命名你的账户。这将使你的查询变得极其简单。不要在账户名称中混入供应商名称或“W-2”、“1099”等表格编号;将这些细节放在元数据和标签中。 -
在年末调整中采用权责发生制。 ⚖️ 即使对于个人账簿,在年末使用简单的应计条目也是使报告准确的最清晰方法。这意味着在正确的年份确认一项支出或退税,即使资金直到下一年才流动。这是一个小的额外步骤,可以避免你日后费尽心思。
-
为未来的自己而写。 🧠 你的目标是清晰。只有在确实使查询更简单时,才在账户名称中添加额外的细节(例如纳税年度)。除非有令人信服的理由,否则避免每年创建一套新的账户(
Expenses:Taxes:2024:Federal、Expenses:Taxes:2025:Federal等)。扁平结构通常更易于管理。
最小账户框架
以下是一组基本的账户,可助你入门。此结构以美国为中心,但你可以轻松地根据你所在国家的税收制度调整名称。只需将这些 open 指令放入你的 Beancount 文件中。
; --- 美国联邦所得税与工资税 ---
; 用于从你工资中预扣的税款
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Withheld USD
; 用于你直接支付的预估税款或报税日账单
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Payments USD
; 用于你收到的退税
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Refunds USD
; 你的 FICA 缴款
2024-01-01 open Expenses:Taxes:Federal:SocialSecurity USD
2024-01-01 open Expenses:Taxes:Federal:Medicare USD
; --- 其他常见税种 ---
; 用于你在购买时支付的销售税/使用税
2024-01-01 open Expenses:Taxes:Sales USD
; --- 年末调整账户(可选但推荐!) ---
; 用于你尚未缴纳的应缴税款的临时持有账户
2024-01-01 open Liabilities:AccruedTaxes:Federal:Income USD
; 用于你尚未收到的应退税款的临时持有账户
2024-01-01 open Assets:Tax:Receivable USD此设置将预扣税款与直接支付和退税分开,使你能够轻松了解资金去向。Liabilities 和 Assets 账户是我们在年底保持报告准确的秘密武器。
示例 1:工资单
让我们记录一张典型的工资单,其中税款被自动预扣。关键是首先记录你的总收入,然后显示其在税款和实际到达你银行账户的现金之间是如何分配的。
2025-07-15 * "Employer Inc." "7 月上半月工资"
Income:Work:Salary -6,000.00 USD
Expenses:Taxes:Federal:IncomeTax:Withheld 1,200.00 USD
Expenses:Taxes:Federal:SocialSecurity 372.00 USD
Expenses:Taxes:Federal:Medicare 87.00 USD
Assets:Cash:Checking 4,341.00 USD这笔单一交易讲述了完整的故事:
- 你赚取了 $6,000 的总收入。
- 其中 $1,200 被发送给 IRS 用于联邦所得税。
- $372 用于社会保障,$87 用于医疗保险。
- 剩余的 $4,341 是你的实得工资。
专业提示: 你可以将工资单上的元数据(例如 pay_period_end: "2025-07-15")附加到交易中,以便轻松进行审计跟踪。
示例 2:申报纳税申报表(跨年问题)
这是一个让许多人困惑的场景:现在是 2025 年 4 月,你正在申报 2024 年的税款。你发现在所有预扣之后,你仍需额外支付 $3,000。
你如何记录这笔费用?你希望这笔支出计入 2024 年,但现金支付发生在 2025 年。以下是两种很好的处理方法。
选项 A:手动两步应计法
此方法是纯 Beancount 操作,无需插件。这是一个清晰的两步过程。
第 1 步:在纳税年度结束时确认支出。 在 2024 年的最后一天,你创建一个“调整”条目。此时没有现金流动;你只是在确认支出并将其暂存于临时负债账户中。
2024-12-31 * "2024 年联邦所得税调整"
Expenses:Taxes:Federal:IncomeTax:Payments 3,000.00 USD
Liabilities:AccruedTaxes:Federal:Income -3,000.00 USD现在,你的 2024 年损益表正确显示了这笔 $3,000 的支出。
第 2 步:在实际支付时记录现金支付。 在 2025 年 4 月,当你实际将款项发送给 IRS 时,你会结清该负债。
2025-04-15 * "IRS" "支付 2024 年税款"
Liabilities:AccruedTaxes:Federal:Income 3,000.00 USD
Assets:Cash:Checking -3,000.00 USD你的 2024 年报告是正确的,你的 2025 年现金流也是正确的。完美!同样的模式也适用于退税,只需使用 Assets:Tax:Receivable 而不是负债账户。
选项 B:使用插件自动化
如果你希望将支付保留在单笔交易中,一个名为 beancount_reds_plugins.effective_date 的优秀社区插件可以提供帮助。它允许你为单个条目分配不同的“生效日期”。
首先,在你的主 Beancount 文件中启用插件:
plugin "beancount_reds_plugins.effective_date"
现在,你可以编写一个单笔交易。该插件将在后台自动拆分,以确保你的报告准确。
; 单一条目;插件处理其余部分
2025-04-15 * "IRS" "支付 2024 年税款"
Assets:Cash:Checking -3,000.00 USD
Expenses:Taxes:Federal:IncomeTax:Payments 3,000.00 USD
effective_date: 2024-12-31在此,现金部分记录于 2025 年 4 月 15 日,但支出部分被追溯至 2024 年 12 月 31 日。它通过与选项 A 不同的工作流程实现了相同的结果。
那销售税呢?
对于大多数个人账簿,销售税很简单。如果你不申请退还,只需在购买时将其作为单独的支出拆分出来。
2025-07-19 * "本地杂货店"
Expenses:Groceries 12.32 USD
Expenses:Taxes:Sales 1.28 USD
Assets:Cash:Checking -13.60 USD这使你可以轻松跟踪一年中在销售税上的支出。如果你经营涉及增值税的企业,你将使用带有应付和应收账户的更正式的系统,但原则是相同的。
你会实际运行的查询
这套结构的全部意义在于使获取答案变得容易。以下是一些用于查看税务状况的 BQL 查询。
1. 我在 2024 年的联邦所得税总额是多少?
SELECT cost(sum(position))
WHERE account ~ "Expenses:Taxes:Federal:IncomeTax"
AND date >= 2024-01-01 AND date < 2025-01-01;2. 该总额在预扣、支付和退税之间是如何分配的?
SELECT account, cost(sum(position))
WHERE account ~ "Expenses:Taxes:Federal:IncomeTax"
AND date >= 2024-01-01 AND date < 2025-01-01
GROUP BY account
ORDER BY account;3. 我是否有任何未清的税务债务或应收款项? (这对于检查你的工作很有用!)
SELECT account, units(sum(position))
WHERE account ~ "Liabilities:AccruedTaxes" OR account ~ "Assets:Tax"
GROUP BY account
ORDER BY account;如果此查询返回非零余额,则表示你还有未结清的应计项目。
快速问答
-
我真的需要像
Expenses:Taxes:2024这样的按年账户吗? 可能不需要。应计法(或插件)可以保持扁平的账户结构清晰易读。仅在你发现按年账户使你的特定查询更容易编写时,才创建它们。 -
Beancount 能为我计算税款吗? 不能直接计算,但它可以准备数据。一些高级用户会编写脚本将 BQL 查询结果导入税务计算软件,这对于在年内估算你的负债非常有用。
-
这是税务建议吗? 不是。 这是一种用于组织数据的簿记模式。会计是合理的,但你应始终就具体情况咨询税务专业人士。
你的直接采用清单
准备好开始了吗?
- ✅ 将账户框架 添加到你的 Beancount 文件中(并根据你所在国家调整名称)。
- ✅ 记录工资单,从总收入开始,并拆分出税务条目。
- ✅ 在年末,使用负债/资产账户(或使用
effective_date插件)为任何支付或退税进行应计调整。 - ✅ 将退税记录为应收款项,并在现金到达时结清。
- ✅ 运行上述 BQL 查询,在申报前验证你的总额。
保持简单,保持一致,你的税务季节最终将感觉像是你财务故事的另一部分——而不是一个需要解决的谜团。