15. 真实场景会计 cookbook

15.真实场景会计 cookbook

在掌握了复式记账的基本原理和核心语法之后,我们终于可以将理论应用于实践了。本章将不再纠结于“什么是借方和贷方”,而是直接切入日常生活中遇到的真实财务场景,展示如何用 Beancount 精确地记录每一笔交易。这就像一本菜谱,当你想做一道菜时,直接翻到对应的页面,照着配料和步骤操作即可。

这些例子不仅会教你如何记账,更重要的是,它们会帮你建立一种“Beancount 思维”——看到任何财务活动,脑海中就能自动浮现出对应的账户和交易结构。我们将从最常见的个人收入和支出开始,逐步深入到更复杂的场景,如货币转换和共同开销。

薪资入账 (Salary transaction booking)

对于大多数工薪阶层来说,每个月最期待的就是发薪日。但在 Beancount 的世界里,工资单上那些密密麻麻的条目,其实是一笔笔清晰的交易。我们不只记录最终到手的净收入,而是要完整地还原整个薪资发放的过程。

首先,我们需要为薪资相关的活动设立专门的账户。一个良好的账户命名习惯至关重要,它能让你的账本结构清晰,易于查询。例如,我们可以这样定义:

; 账户定义
2022-01-01 open Assets:Bank:Checking
2022-01-01 open Income:Salary:CompanyA
2022-01-01 open Expenses:Taxes:Federal
2022-01-01 open Expenses:Taxes:State
2022-01-01 open Expenses:Insurance:Health
2022-01-01 open Expenses:Retirement:401k

现在,假设你收到了一份工资单,上面显示你的税前总收入是 6000 美元,扣除联邦税 750 美元、州税 300 美元、医保 100 美元,以及 401k 退休金账户扣款 600 美元,最终存入你支票账户的净收入是 4250 美元。

在复式记账中,这笔交易必须平衡。总收入是你的“来源”,而所有扣款和最终入账则是这笔钱的“去向”。因此,这笔交易可以这样记录:

2023-02-15 * "CompanyA" "PAYROLL"
  Income:Salary:CompanyA                 -6000.00 USD
  Expenses:Taxes:Federal                   750.00 USD
  Expenses:Taxes:State                     300.00 USD
  Expenses:Insurance:Health                100.00 USD
  Expenses:Retirement:401k                 600.00 USD
  Assets:Bank:Checking                    4250.00 USD

让我们来分析一下这笔交易。Income:Salary:CompanyA 账户记录了你的总收入,金额为负。这初看可能有些反直觉,但请记住我们之前讨论过的会计方程:资产 = 负债 + 所有者权益。收入会增加你的净资产(所有者权益),而在 Beancount 的账户类型体系中,增加所有者权益的账户(如收入)通常用负数来表示其发生额,以确保交易的借贷平衡。所有费用账户(Expenses:*)记录了你为了生活而消耗掉的价值,它们是正数,代表你获得的“服务”或“商品”。最后,你的资产账户(Assets:Bank:Checking)收到了净收入,所以是正数。整个交易加起来:-6000 + 750 + 300 + 100 + 600 + 4250 = 0,完美平衡。

401k 退休金账户供款 (401k contribution accounting)

401k 是一种常见的税前退休储蓄计划。在你的工资单上,它通常被列为一项扣除额。但从会计角度看,这笔钱并没有消失,它只是从一个资产类别(现金)转移到了另一个资产类别(退休投资账户)。

处理 401k 供款时,我们不仅要记录资金的流动,还要考虑其税务影响。通常,401k 供款是税前的,这意味着它减少了你的应税收入。因此,除了记录资金转移,我们还需要一个账户来追踪这部分“节省下来”的税款。

假设你的工资单显示,你个人供款了 600 美元到你的 401k 账户,同时你的公司也为你匹配供款了 600 美元。

首先,记录你个人的供款部分(这通常已经包含在上面的薪资交易中,但我们可以单独拎出来看):

2023-02-15 * "CompanyA" "401k Employee Contribution"
  Assets:Bank:Checking                   -600.00 USD
  Assets:Investment:401k                  600.00 USD

但这并不完整。为了追踪税务优惠,我们还需要记录这笔供款带来的税务影响。一个更精确的做法是,将这笔钱视为税前收入的一部分,并立即分配到退休账户,同时确认一项税务节省。

; 更完整的 401k 供款记录
2023-02-15 * "CompanyA" "PAYROLL with 401k"
  Income:Salary:CompanyA                -6000.00 USD
  Expenses:Taxes:Federal                  750.00 USD
  Expenses:Taxes:State                    300.00 USD
  Expenses:Insurance:Health               100.00 USD
  ; 个人 401k 供款部分
  Assets:Investment:401k                  600.00 USD
  ; 公司匹配供款部分
  Assets:Investment:401k                  600.00 USD
  Income:EmployerMatch:401k              -600.00 USD
  ; 净收入部分
  Assets:Bank:Checking                   4250.00 USD

在这个更复杂的例子中,我们为公司匹配部分单独创建了一个收入账户 Income:EmployerMatch:401k。这样做的好处是,你可以清晰地看到公司福利在你总收入中的占比。同时,个人供款部分直接从你的税前收入中扣除,最终体现在你的净收入里。这笔 600 美元的供款,虽然没有直接进入你的支票账户,但它以资产的形式保留在了你的退休账户中。

现金取款与支出 (Cash withdrawal and expense recording)

在数字支付普及的今天,现金交易似乎变得越来越少,但它依然存在。处理现金的关键在于,你需要决定在多大程度上追踪它。对于一些微不足道的小额消费,比如买杯咖啡,事无巨细地记录可能会让你不堪重负。

一个实用的策略是:将现金视为一个独立的“小金库”账户。

第一步:从银行取现 当你从 ATM 机取出现金时,这仅仅是资产形式的转换,从银行存款变成了手头现金,你的净资产没有变化。

2023-03-01 * "ATM Withdrawal"
  Assets:Bank:Checking                  -200.00 USD
  Assets:Cash                            200.00 USD

第二步:记录现金支出 对于现金支出,你可以选择两种方式:

  1. 逐笔记录:如果你愿意,可以像记录信用卡消费一样记录每一笔现金支出。

    2023-03-02 * "Coffee Shop"
      Assets:Cash                          -5.50 USD
      Expenses:Food:Coffee                  5.50 USD
    
  2. 定期估算与调整:更常见也更省力的方法是,保留所有收据,但只在月底或某个固定时间点一次性录入。或者,如果你根本不保留收据,可以定期(比如每季度)检查你的钱包里还剩多少现金,然后用“余额断言”和“调整分录”来平衡账户。 假设你在 3 月 1 日取了 200 美元现金,到了 3 月 31 日,你发现钱包里还剩 120 美元。这意味着你本月实际花费了 80 美元现金。你可以这样记录:

    ; 3月1日取现
    2023-03-01 * "ATM Withdrawal"
      Assets:Bank:Checking                  -200.00 USD
      Assets:Cash                            200.00 USD
    
    ; 3月31日进行现金支出调整
    2023-03-31 * "Monthly Cash Adjustment"
      Assets:Cash                           -80.00 USD
      Expenses:Food:Groceries                50.00 USD
      Expenses:Dining:Restaurants            30.00 USD
    

    在这里,我们根据自己的判断,将这 80 美元的现金花费分配到了不同的费用类别中。这种方法虽然不那么精确,但对于非关键性的现金支出,它在精确度和便利性之间取得了很好的平衡。

货币转换 (Currency conversion transactions)

对于有跨境活动(如出国旅行、海外购物或持有外币资产)的人来说,处理多币种交易是一项必备技能。Beancount 通过 price 指令和交易中的成本(Cost)信息来处理这个问题。

假设你去欧洲旅行,从你的美元账户取了 1000 美元,并兑换成了 920 欧元。此时,你需要记录这笔兑换交易,并注明汇率。

; 定义欧元为一种商品
2023-01-01 open Assets:Cash:EUR
2023-01-01 commodity EUR

; 记录兑换交易
2023-04-10 * "Currency Exchange" "USD to EUR"
  Assets:Cash:USD                       -1000.00 USD
  Assets:Cash:EUR                         920.00 EUR @ 1.086956 USD

这里的 @ 1.086956 USD 是可选的,但它记录了这笔交易发生时的汇率(1 欧元 = 1.086956 美元)。这有助于你追踪兑换成本。

当你在欧洲消费时,比如在一家咖啡馆花了 5 欧元,你可以这样记录:

2023-04-12 * "Cafe in Paris"
  Assets:Cash:EUR                         -5.00 EUR
  Expenses:Dining:Coffee                   5.00 EUR

现在,如果你想将这笔消费换算回美元来统一查看你的总支出,你可以使用 price 指令来记录一个通用的汇率,或者在查询时使用当时的汇率。一个更系统的方法是,在你的账本中维护一个价格数据库,或者在交易时就记录下美元等值价值。

例如,如果你在消费时就知道当天的汇率是 1.1,你也可以选择直接用美元记账,但保留欧元的原始金额作为参考:

2023-04-12 * "Cafe in Paris"
  Assets:Cash:EUR                         -5.00 EUR
  Expenses:Dining:Coffee                   5.50 USD ; 5 EUR @ 1.1

或者,更推荐的做法是,始终用交易的原始货币记录,然后通过 price 指令维护一个汇率数据库,让报告工具在需要时进行换算。

; 记录汇率
2023-04-10 price EUR 1.086956 USD
2023-04-12 price EUR 1.100000 USD

这样,你的账本中就有了完整的汇率历史,可以进行更精确的多币种资产分析。

共同开销追踪 (Shared expense tracking)

与朋友或伴侣共同生活、旅行或合租时,共同开销的追踪和结算往往令人头疼。复式记账法可以优雅地解决这个问题,核心思想是:将所有共同开销都视为由一人垫付,然后通过虚拟账户进行内部结算。

假设你和室友 Alice 共同承担房租和水电费,所有账单都由你支付。

第一步:设立虚拟往来账户 为你和 Alice 之间的资金往来设立一个资产/负债账户。对你来说,如果 Alice 欠你钱,这个账户就是资产;如果你欠 Alice 钱,它就是负债。我们不妨叫它 Assets:Receivable:Alice。

2023-01-01 open Assets:Receivable:Alice
2023-01-01 open Expenses:Rent
2023-01-01 open Expenses:Utilities:Electricity

第二步:记录共同开销 当你支付一笔共同开销时,只记录你实际支付的金额,并将 Alice 应承担的部分记入往来账户。

例如,你支付了 2000 美元的房租,其中 Alice 应承担 1000 美元。

2023-02-01 * "Landlord" "February Rent"
  Assets:Bank:Checking                  -2000.00 USD
  Expenses:Rent                          1000.00 USD ; Your half
  Assets:Receivable:Alice                1000.00 USD ; Alice's half

这笔交易平衡了。你的银行账户减少了 2000 美元,你的房租费用增加了 1000 美元,同时你拥有了向 Alice 索要 1000 美元的权利(资产)。

同样,支付 120 美元的电费,Alice 承担 60 美元:

2023-02-15 * "Utility Company" "February Electricity"
  Assets:Bank:Checking                   -120.00 USD
  Expenses:Utilities:Electricity           60.00 USD
  Assets:Receivable:Alice                  60.00 USD

第三步:结算 月底,Alice 通过 Venmo 或银行转账把她的部分还给你。你收到 1060 美元(1000 房租 + 60 电费)。

2023-02-28 * "Alice" "Reimbursement"
  Assets:Bank:Checking                   1060.00 USD
  Assets:Receivable:Alice               -1060.00 USD

现在,Assets:Receivable:Alice 账户的余额为零,说明这笔共同开销已经结清。通过这个方法,你的财务报表准确反映了你的个人支出(1000 房租 + 60 电费),同时也清晰地追踪了你与 Alice 之间的债权债务关系。

医疗保健费用 (Health care expense accounting)

医疗费用的会计处理比较特殊,因为它通常涉及保险、免赔额(Deductible)、共付额(Copay)和自付上限(Out-of-pocket maximum)。简单地将每次支付的金额记为费用,可能无法准确反映医疗服务的真实成本。

一个更合理的做法是,将医疗服务的总成本视为你的支出,而保险支付的部分则视为一种“折扣”或“补贴”。

假设你去看了一次专科医生,总账单是 300 美元。你当时支付了 50 美元的共付额,保险公司随后支付了剩余的 250 美元。

方法一:简单记录实际支出 如果你不关心医疗服务的总成本,只关心自己花了多少钱,可以这样记:

2023-03-10 * "Doctor's Office" "Specialist Visit"
  Liabilities:CreditCard:Visa             -50.00 USD
  Expenses:Health:Medical                  50.00 USD

这种方法简单,但缺点是你的费用报表只显示了 50 美元,而不是这次服务的真实成本 300 美元。

方法二:记录完整成本和保险赔付(推荐) 这种方法更全面,能让你了解医疗服务的真实开销。

首先,你需要一个账户来追踪你和保险公司之间的关系,比如 Liabilities:Insurance:Receivable,或者更简单地,直接将保险赔付视为费用的减少。

2023-03-10 * "Doctor's Office" "Specialist Visit - Total Cost 300"
  Liabilities:CreditCard:Visa             -50.00 USD
  Expenses:Health:Medical                 300.00 USD ; 记录总成本
  Income:Insurance:Payment               -250.00 USD ; 保险支付的部分

这笔交易平衡了:-50 + 300 - 250 = 0。你的费用报表显示这次医疗服务的总成本是 300 美元,而你的实际现金支出是 50 美元。Income:Insurance:Payment 账户在这里被用作一个“负费用”账户,用来抵消总费用。

对于有免赔额的情况,逻辑也类似。在达到免赔额之前,你支付的每一笔钱都是 100% 自付的,记账方式和方法二一样。一旦达到免赔额,保险开始按比例支付,你仍然记录总成本,然后将保险支付的部分记为收入(或费用的抵减)。

这种方法让你能够回答“我今年在医疗上总共花了多少钱?”(查看 Expenses:Health:Medical 的总和)以及“我实际付出了多少现金?”(查看相关资产账户的流出)这两个重要的问题。


本章通过一系列真实世界的案例,展示了如何将 Beancount 的理论知识应用到实践中。从薪资、退休金到现金、外币,再到共同开销和医疗费用,我们看到,复式记账法的核心原则是不变的:每一笔交易都必须平衡,并且清晰地反映资金的来源与去向。掌握了这些模式,你就能自信地应对未来遇到的任何财务场景,将你的个人财务管理提升到一个新的高度。下一章,我们将探讨如何从这些日常记录中,计算和分析你的投资组合收益。