跳转到主要内容

在 Beancount 中为上市公司建模

使用 Open Ledger 约定,将上市公司的资产负债表和利润表转换为平衡的 Beancount 账本,附有百事公司一个季度的完整示例和入门模板。

按照每一家 Open Ledger 公司都采用的同一套约定,把财报中的资产负债表和利润表转换为一本平衡的 Beancount 账本。

本指南以百事公司 2026 年第二季度财报中的季度利润表和部分资产负债表摘录为例进行建模。使用印刷页 A-1(PDF 第 6 页)截至 2026 年 6 月 13 日的 12 周列,以及 A-4(PDF 第 9 页)同一日期的资产负债表。该财报发布于 2026 年 7 月 9 日。所有数字均以百万美元(MUSD)为单位。

你将获得什么​

最终你会得到五个余额断言和一笔零和利润表交易。bea check 通过。利润表复现了合并净利润;资产负债表摘录涵盖流动资产和一条合并流动负债行。它不是一份完整的公司资产负债表。同样的模式支撑着 Open Ledger 上的每一家公司,以及 open-ledger 标签下的每一篇文章。

选择单位和财政年度​

将 operating_currency 设为与财报一致的百万单位。对于以美元申报的公司使用 MUSD。当财报以其他货币申报时,使用 MEUR、MJPY 或其他 M<CCY> 形式。

1 MUSD 等于 1,000,000 美元。余额 10251 MUSD 表示 102.51 亿美元现金。

所报告的季度包含截至 2026 年 6 月 13 日的 12 周,即 84 天。按包含首尾计算,为 2026 年 3 月 22 日至 6 月 13 日。使用这些财年日期,而不是 4 月至 6 月。资产负债表的上年同期列为 2025 年 12 月 27 日;不要用 12 月 31 日替换财年结束日。

把每个财年期间放在年份目录下的独立文件中。年度文件命名为 FY2025/FY2025.bean。季度文件命名为 FY2026/FY2026Q2.bean。在 main.bean 中按从旧到新的顺序包含它们。

开设会计科目表​

main.bean 存放选项、账户开立和 include。它不存放余额,也不存放收入分录。

在 1970-01-01 以 MUSD 开立每个账户。保持核心名称在各公司之间完全一致,以便读者能够将一本账本与另一本进行对比。

option "title" "PepsiCo, Inc. FY2026Q2 income statement and partial balance sheet"
option "operating_currency" "MUSD"
 
; Currency convention:
;   MUSD = Millions of USD (custom unit for readability)
;   1 MUSD = USD 1,000,000
;   Example: "1000 MUSD" means USD 1,000,000,000
;   Source: PepsiCo Q2 2026 earnings release, A-1 and A-4.
;   Fiscal quarter: 2026-03-22 through 2026-06-13 (12 weeks).
;   Partial balance sheet: current assets and combined payables only.
 
; ── ASSETS ──────────────────────────────────────────────────────────────────
1970-01-01 open Assets:Current:Cash                        MUSD
1970-01-01 open Assets:Current:ShortTermInvestments        MUSD
1970-01-01 open Assets:Current:AccountsReceivable          MUSD
1970-01-01 open Assets:Current:Other                       MUSD
1970-01-01 open Assets:NonCurrent:PropertyPlantEquipment   MUSD
1970-01-01 open Assets:NonCurrent:Goodwill                 MUSD
1970-01-01 open Assets:NonCurrent:IntangibleAssets         MUSD
1970-01-01 open Assets:NonCurrent:Other                    MUSD
 
; ── LIABILITIES ─────────────────────────────────────────────────────────────
1970-01-01 open Liabilities:Current:AccountsPayable        MUSD
1970-01-01 open Liabilities:Current:ShortTermDebt          MUSD
1970-01-01 open Liabilities:Current:DeferredRevenue        MUSD
1970-01-01 open Liabilities:Current:Other                  MUSD
1970-01-01 open Liabilities:NonCurrent:LongTermDebt        MUSD
1970-01-01 open Liabilities:NonCurrent:Other               MUSD
 
; ── EQUITY ──────────────────────────────────────────────────────────────────
1970-01-01 open Equity:OpeningBalance                      MUSD  ; opening balances when needed
1970-01-01 open Equity:Adjustments                         MUSD  ; balancing offset for this statement model
1970-01-01 open Equity:CommonStockAndAPIC                  MUSD
1970-01-01 open Equity:RetainedEarnings                    MUSD
1970-01-01 open Equity:OtherComprehensiveIncome            MUSD
 
; ── INCOME ──────────────────────────────────────────────────────────────────
1970-01-01 open Income:Revenue                             MUSD
1970-01-01 open Income:OtherNet                            MUSD  ; net other income (interest income, etc.)
 
; ── EXPENSES ────────────────────────────────────────────────────────────────
1970-01-01 open Expenses:CostOfRevenue                     MUSD
1970-01-01 open Expenses:ResearchAndDevelopment            MUSD
1970-01-01 open Expenses:SellingGeneralAdministrative      MUSD
1970-01-01 open Expenses:OtherNet                          MUSD
1970-01-01 open Expenses:IncomeTax                         MUSD
 
include "FY2026/FY2026Q2.bean"

该科目表为其他公司及后续扩展提供了账户名称。未使用的账户并不意味着报告了零。在本例中,只有下面过账的账户映射了金额。…:Other 账户需要明确的来源行或残差计算;它们不是凭空捏造拆分的许可证。

使用 pad 和 balance 验证资产负债表​

在期末前一天从 Equity:Adjustments 进行 pad。在期末日期断言财报中的数值。为每个账户写一对 pad 和 balance。

资产余额为正。负债余额为负。以下五个断言映射了 A-4 中 2026 年 6 月 13 日的列:

账户来源映射(MUSD)
Assets:Current:Cash现金及现金等价物:10,251
Assets:Current:ShortTermInvestments短期投资:465
Assets:Current:AccountsReceivable应收账款及票据,净额:13,496
Assets:Current:Other流动资产合计 32,775 − 10,251 − 465 − 13,496 = 8,563;存货 6,734 + 预付及其他流动资产 1,829
Liabilities:Current:Other应付账款及其他流动负债合计:−24,504

该财报未将最后一行拆分为单独的应付账款和其他负债。保持汇总在一起;不要向 Liabilities:Current:AccountsPayable 过账一个捏造的金额。

; PepsiCo, Inc. FY2026Q2 — 2026-03-22 through 2026-06-13; MUSD
; Source: https://investors.pepsico.com/docs/pepsico-5v9wci20/media/Files/investors/q2-2026-earnings-release.pdf
; A-4, 2026-06-13 column: partial balance-sheet snapshot
2026-06-12 pad Assets:Current:Cash                        Equity:Adjustments
2026-06-13 balance Assets:Current:Cash                     10251 MUSD
 
2026-06-12 pad Assets:Current:ShortTermInvestments        Equity:Adjustments
2026-06-13 balance Assets:Current:ShortTermInvestments     465 MUSD
 
2026-06-12 pad Assets:Current:AccountsReceivable          Equity:Adjustments
2026-06-13 balance Assets:Current:AccountsReceivable       13496 MUSD
 
2026-06-12 pad Assets:Current:Other                       Equity:Adjustments
2026-06-13 balance Assets:Current:Other                    8563 MUSD  ; 32775 - 10251 - 465 - 13496 = 6734 + 1829
 
2026-06-12 pad Liabilities:Current:Other                  Equity:Adjustments
2026-06-13 balance Liabilities:Current:Other               -24504 MUSD  ; combined payables and other current liabilities

Beancount 在其日期的开始检查余额。前一天的 pad 创建的是合成快照分录,而不是 6 月 12 日实际的现金变动。本例在 6 月 13 日没有后续的资产或负债过账,因此断言的金额也仍然是其期末余额。

该摘录省略了非流动资产、短期债务以及其余的负债和权益。完整的模型也必须映射这些行,包括库存股和非控股权益。该财报的完整总计为资产 112,189 = 负债 89,919 + 权益 22,270 MUSD;该摘录并未复现这些总计。Equity:Adjustments 是平衡性抵销,而非报告的股东权益。在每个期间文件的开头放置一个横幅,注明公司、财年区间、单位和来源 URL。

将利润表记录为一笔交易​

将交易日期定为财年期末。收入过账为负。费用过账为正。Equity:Adjustments 吸收净利润,使分录总和为零。

将算术检查放在交易上方的注释中。在信任该分录之前,该检查必须求值为零。

; Check: -24181 + 11070 + 9088 + 171 + 848 + 3004 = 0
 
2026-06-13 * "PepsiCo, Inc." "FY2026Q2 Income Statement"
  Income:Revenue                         -24181 MUSD
  Expenses:CostOfRevenue                   11070 MUSD
  Expenses:SellingGeneralAdministrative     9088 MUSD
  Expenses:OtherNet                         171 MUSD  ; 230 expense - 59 pension income
  Expenses:IncomeTax                        848 MUSD
  Equity:Adjustments                       3004 MUSD  ; consolidated net income offset

按如下方式映射 A-1 的季度列:收入 24,181 减去销售成本 11,070 得到毛利 13,111。减去销售、一般和管理费用 9,088 得到营业利润 4,023;减值行为零。该财报未披露单独的季度研发行,因此让 Expenses:ResearchAndDevelopment 保持未使用。

养老金和退休人员医疗福利收入 59 抵销净利息费用及其他 230。将其净费用 171 过账到 Expenses:OtherNet。这样得到税前利润 3,852。税费 848 之后,合并净利润为 3,004 MUSD。如果同样的汇总在其他期间得出的是净利润,则使用 Income:OtherNet 表示汇总,并让 Expenses:OtherNet 保持未使用。

该财报还报告了归属于百事公司的净利润 2,981 MUSD。其桥梁是 3,004 − 23 归属于非控股权益 = 2,981。本交易建模的是合并口径;这 23 是利润的分配,而不是另一项费用。不要用 2,981 作为其平衡性抵销。

验证并阅读报告​

对根账本运行检查:

bea --file main.bean check

干净的账本退出码为 0 且无输出。当你需要机器可读的有效性并要求 data.valid: true 时,优先使用 bea --json --no-input --file main.bean check。

阅读该公司财年区间的利润表,而不是恰好共用该标签的日历季度:

bea --json --no-input --file main.bean report income-statement --time '2026-03-22 - 2026-06-13'

在 Fava 中打开同一文件以浏览资产负债表和利润表。分别检查算术和来源一致性:; Check: 注释总和为零,每个过账金额与其映射的来源一致,且报表显示合并净利润为 3,004 MUSD。如果抵销也错了,错误的收入金额仍然可能平衡。只有在本摘录扩展为完整模型之后,其资产负债表总计才应等于财报的总计。

从模板开始​

在你发明新的科目表之前,先克隆其形态。下面这个实时模板是一本虚构的 Example Industries Inc. FY2025 账本,单位为 MUSD。它使用相同的账户名称、pad 和 balance 模式,以及单笔利润表交易。

在新标签页中打开 Example Industries Inc. 上市公司模板

将真实的百事公司摘录下载为 public-company-starter.bean,然后运行 bea --file public-company-starter.bean check。它把上面三个 Beancount 代码块组合在一起,与虚构的实时模板分开。现金期末为 10251 MUSD,应付账款及其他流动负债合计为 -24504 MUSD,收入为 -24181 MUSD,所得税为 848 MUSD。五个 pad 将 32775 − 24504 = 8271 MUSD 抵销到 Equity:Adjustments;加上合并利润抵销后,那里剩下 -5267 MUSD。该抵销不是财报中的一行。该下载是部分资产负债表示例,不是百事公司的完整账本。用你自己的来源映射替换其数字和财年日期。

浏览 Open Ledger 上的每一家真实公司。复制模板的结构,然后用你财报中的数字替换虚构金额。

下一步​

  • 在 Open Ledger 上研究更多实时公司账本。
  • 阅读 open-ledger 标签下的财报演练。
  • 当你需要家庭或自由职业者起步账本而不是 10-K 时,从工作账本示例复制个人理财模式。
  • 查看财务报告模板,了解较小账本中利润表和资产负债表的报表形态。

来源:https://beancount.io/zh/docs/model-a-public-company-in-beancount