跳转到主要内容

可运行的账本示例

直接复制六种经过实盘验证的 Beancount 账本模式:家庭财务、信封预算、自由职业开票、出租房产、加密货币和股票成本基础。

从下面六个真实运行的 Beancount 账本中复制一套经过验证的账户结构,然后重命名账户,把虚构的金额替换成你自己的。每一个嵌入的账本都是公开的、在 Git 中做了版本管理,并且通过 bea check 校验。想用同样的方式重建一家上市公司的财报,请参阅在 Beancount 中为上市公司建模

从下载文件开始

跳过复制粘贴:家庭、信封和自由职业这三种模式各自附带一份可直接运行的入门账本,里面是虚构的示例数据。

  1. 从下面选一种模式:家庭用于现金和银行卡,信封用于预算目标,自由职业用于发票。
  2. 从该模式旁边的链接下载文件。
  3. bea --file <file> check 校验保存的文件。一份干净的账本执行 bea check 会以 0 退出;有错误时退出码非零并列出错误。
  4. fava 打开它,然后在浏览器中使用它打印出的地址。

日常个人财务

每张银行卡用一个资产账户,每张信用卡用一个负债账户,再为你希望报表回答的问题设置相应的费用账户。完整示例还展示了工资、福利、转账、余额断言和投资持仓。

在新标签页中打开 日常个人财务账本

当你想要一套记录现金、银行卡、收入和日常支出的账簿时,复制这个结构:

option "operating_currency" "USD"
 
2026-01-01 open Assets:Bank:Checking USD
2026-01-01 open Liabilities:CreditCard USD
2026-01-01 open Equity:Opening-Balances USD
2026-01-01 open Expenses:Food:Groceries USD
 
2026-01-01 * "Opening balance"
  Assets:Bank:Checking          3,000.00 USD
  Equity:Opening-Balances      -3,000.00 USD
 
2026-01-18 * "Corner Market" "Weekly groceries"
  Liabilities:CreditCard          -71.90 USD
  Expenses:Food:Groceries          71.90 USD
 
2026-01-25 * "Credit card" "Statement payment"
  Liabilities:CreditCard           71.90 USD
  Assets:Bank:Checking            -71.90 USD

信用卡账户把购买日期和现金还款日期分开。给每个真实世界的账户加一条每月的 balance 断言,这样导入错误就无法藏身。

把这个模式下载为 household-starter.bean,然后运行 bea --file household-starter.bean checkfava household-starter.bean。该文件与上面的代码块一致:活期账户最终为 2928.10 USD,食品杂货为 71.90 USD,信用卡余额为零。把 Corner Market、3,000.00 的期初余额和 71.90 的金额换成你自己的银行、银行卡和支出。

可以滚存的信封预算

把每个信封建模为叠加在真实银行账户之上的权益子账户。分配一笔工资是在权益内部转移价值,而一次消费同时记录现金变动和预算决策。

在新标签页中打开 信封预算账本

复制 Equity:Budget 树,让计划和资金保持分离:

option "operating_currency" "USD"
 
2026-01-01 open Assets:Bank:Checking USD
2026-01-01 open Income:Salary USD
2026-01-01 open Expenses:Groceries USD
2026-01-01 open Equity:Budget:Unallocated USD
2026-01-01 open Equity:Budget:Groceries USD
 
2026-01-05 * "Acme Corp" "January salary"
  Assets:Bank:Checking          4,100.00 USD
  Income:Salary                -4,100.00 USD
 
2026-01-05 * "Budget" "Fund groceries"
  Equity:Budget:Unallocated      -550.00 USD
  Equity:Budget:Groceries         550.00 USD
 
2026-01-08 * "Whole Foods" "Weekly shop"
  Assets:Bank:Checking           -128.44 USD
  Expenses:Groceries              128.44 USD
  Equity:Budget:Groceries        -128.44 USD
  Equity:Budget:Unallocated       128.44 USD

消费中的这两对分录各自独立平衡。这种分离让你可以在不改变已对账银行余额的情况下重置或重新分配一个信封。若要用 Fava 显示目标对比实际,请改用更简单的预算指令

把这个模式下载为 envelope-budgeting-starter.bean,然后运行 bea --file envelope-budgeting-starter.bean checkfava envelope-budgeting-starter.bean。该文件与上面的代码块一致:活期账户最终为 3971.56 USD,Groceries 信封持有 421.56 USD,对应 Unallocated 的 -421.56 USD。把 Acme Corp、4,100.00 的工资和 550.00 的分配换成你自己的收入和信封。

自由职业开票与应收款

在你赚得收入时记录一张发票,然后在客户付款时结清应收账款。为每个客户设置单独的应收账款账户,能让未付和部分支付的发票作为普通余额显示出来。

在新标签页中打开 自由职业者开票账本

复制应收账款树,并在两个事件上都写上发票号:

option "operating_currency" "USD"
 
2026-01-01 open Assets:Bank:Business USD
2026-01-01 open Assets:Receivable:Northwind USD
2026-01-01 open Income:Consulting USD
 
2026-01-09 * "Northwind Traders" "January retainer"
  invoice: "2026-001"
  due: 2026-02-08
  Assets:Receivable:Northwind    6,000.00 USD
  Income:Consulting             -6,000.00 USD
 
2026-02-05 * "Northwind Traders" "Payment — invoice 2026-001"
  invoice: "2026-001"
  Assets:Bank:Business           6,000.00 USD
  Assets:Receivable:Northwind   -6,000.00 USD

把销售税记入负债而不是收入,并在缴纳之前把预估税款现金转入储备资产。这个真实账本展示了这两种模式、部分付款、转开成本以及一笔坏账核销。

把这个模式下载为 freelance-starter.bean,然后运行 bea --file freelance-starter.bean checkfava freelance-starter.bean。该文件与上面的代码块一致:Business 最终为 6000.00 USD,Consulting 为 -6000.00 USD,应收账款为零。把 Northwind Traders、发票 2026-001 和 6,000.00 的金额换成你自己的客户和发票。

出租房产与按揭本金

把房产当作资产,把房贷当作负债,把租户的押金当作你欠对方的钱。把每笔房贷还款拆分为利息、本金和托管账户,让资产负债表和利润表讲述不同的真相。

在新标签页中打开 出租房产账本

在添加每月活动之前,先复制房产、债务和运营账户组:

option "operating_currency" "USD"
 
1970-01-01 commodity PROP123MAIN
2024-01-01 open Assets:RealEstate:Property PROP123MAIN
2024-01-01 open Assets:Bank:Checking USD
2024-01-01 open Assets:Bank:EscrowImpound USD
2024-01-01 open Liabilities:Mortgage USD
2024-01-01 open Income:RealEstate:Rent USD
2024-01-01 open Expenses:RealEstate:MortgageInterest USD
 
2024-03-15 * "Escrow" "Buy rental property"
  Assets:RealEstate:Property       1 PROP123MAIN {400,000.00 USD}
  Assets:Bank:Checking                       -80,000.00 USD
  Liabilities:Mortgage                      -320,000.00 USD
 
2024-04-01 * "Bank" "Mortgage payment"
  Expenses:RealEstate:MortgageInterest         1,866.67 USD
  Liabilities:Mortgage                           262.39 USD
  Assets:Bank:EscrowImpound                      566.67 USD
  Assets:Bank:Checking                        -2,695.73 USD

让土地、可折旧建筑价值、资本改良、累计折旧和托管账户活动各自独立。出租房产指南解释了这些余额如何进入报表。

加密资产批次与成本基础

给每次购买加上大括号中的成本,并在卖出时指明同一个批次。这样 Beancount 就能在钱包、交易所和应税处置之间携带取得日期和成本基础,而不是把一项投资压缩成一个混合余额。

在新标签页中打开 加密货币成本基础账本

复制该商品、交易所账户和明确的已实现收益分录:

option "operating_currency" "USD"
 
1970-01-01 commodity BTC
2024-01-01 open Assets:Crypto:Coinbase:BTC BTC
2024-01-01 open Assets:Crypto:Coinbase:USD USD
2024-01-01 open Expenses:Crypto:Fees:Trading USD
2024-01-01 open Income:Crypto:CapitalGains:ShortTerm USD
 
2024-02-15 * "Coinbase" "Buy 0.10 BTC"
  Assets:Crypto:Coinbase:BTC     0.10 BTC {43,800.00 USD, 2024-02-15}
  Assets:Crypto:Coinbase:USD   -4,380.00 USD
 
2024-08-20 * "Coinbase" "Sell the February lot"
  Assets:Crypto:Coinbase:BTC    -0.10 BTC {43,800.00 USD, 2024-02-15}
  Assets:Crypto:Coinbase:USD    5,900.00 USD
  Expenses:Crypto:Fees:Trading      8.85 USD
  Assets:Crypto:Coinbase:USD       -8.85 USD
  Income:Crypto:CapitalGains:ShortTerm -1,520.00 USD

在自己的钱包之间转账会保留批次,而不会产生收入。这个真实账本还继续涵盖质押、挖矿、去中心化金融和 NFT;存货指南解释了记账方法和批次减少。

加密货币示例使用静态的带日期价格,这样你可以复现它的报表。若要在托管账本中管理你自己支持的持仓,请设置实时价格以自动维护估值报价。符号和报价货币的匹配很重要;行情源不会改变这些交易示例。

股票批次、股息与拆股

一股股票不是一个数字,而是一个批次:在已知日期以已知成本持有的数量。把每笔券商买入都写成明确的 {cost, date},之后的一次卖出就能指明它处置的确切批次,于是 Beancount 会计算已实现收益及其持有期,而不是把两个批次平均在一起。股息会作为收入显示出来,而不会消失在调整后的股价中。

在新标签页中打开 股票成本基础与股息账本

复制券商账户表、带日期的批次和指定批次的卖出:

option "operating_currency" "USD"
option "booking_method" "STRICT"
 
1970-01-01 commodity ACME
2024-01-01 open Assets:Brokerage:Cash USD
2024-01-01 open Assets:Brokerage:ACME ACME
2024-01-01 open Equity:Opening USD
2024-01-01 open Income:Dividends:Qualified USD
2024-01-01 open Income:CapitalGains:LongTerm USD
2024-01-01 open Expenses:Brokerage:Commissions USD
 
2024-01-08 * "Broker" "Wire funding to taxable brokerage account"
  Assets:Brokerage:Cash                  50,000.00 USD
  Equity:Opening                        -50,000.00 USD
 
2024-06-18 * "Broker" "Buy 150 ACME @ $68.20"
  Assets:Brokerage:ACME                        150 ACME {68.20 USD, 2024-06-18}
  Expenses:Brokerage:Commissions              4.95 USD
  Assets:Brokerage:Cash                 -10,234.95 USD
 
2025-03-14 * "Broker" "ACME quarterly cash dividend"
  Assets:Brokerage:Cash                      63.00 USD
  Income:Dividends:Qualified                -63.00 USD
 
2026-02-20 * "Broker" "Sell 60 ACME from the 2024 lot — long-term gain"
  Assets:Brokerage:ACME                        -60 ACME {68.20 USD, 2024-06-18}
  Assets:Brokerage:Cash                   5,778.00 USD
  Expenses:Brokerage:Commissions              4.95 USD
  Assets:Brokerage:Cash                      -4.95 USD
  Income:CapitalGains:LongTerm           -1,686.00 USD
 
2026-02-21 balance Assets:Brokerage:ACME              90 ACME
2026-02-21 balance Assets:Brokerage:Cash      45,601.10 USD

收益分录是算术结果,不是凑出来的数字:卖出 60 股、每股 96.30 USD,即 5,778.00 USD 的收入,对应 4,092.00 USD 的成本基础,而这个批次 2024-06-18 的日期正是它成为长期持有的原因。这个真实账本还继续涵盖一次再投资的 ETF 分红、一次保留总成本基础的 4 拆 1、一次从第二个批次卖出的短期交易,以及年末股数断言。option "booking_method" "STRICT" 正是把“卖出 40 ACME”变成错误而不是悄悄取平均的原因;选项指南介绍了其他可选方案。

股票示例使用诸如 ACME 这样的虚构符号和静态价格文件。不要用真实的股票代码行情源去替代虚构的商品。为你的自有持仓通过实时价格选择受支持的货币对,同时为这个可复现的示例保留手工价格。

来源:https://beancount.io/zh/docs/examples