跳转到主要内容

Beancount 语法参考:指令、账户、金额

Beancount 语言语法参考:指令、交易、账户命名、标签、元数据和纯文本账本的格式化。

这里提供了 Beancount 语言语法的简明而全面的参考,融合了实用结构、规则和示例。更多细节,请参阅速查表。

概述​

Beancount 是一个纯文本复式记账系统。它的语言围绕三个主要构建块:

  • 商品(货币、股票、积分等)
  • 账户(分层的、分类的账本)
  • 指令(记录事件或配置的带日期条目)

商品​

商品总是用大写书写,例如 USD、EUR、AAPL、BTC、MILES、HOURS。

账户​

账户是用冒号分隔的、首字母大写的分层名称。它们必须以五种根账户类型之一开头:

名称类型典型内容示例
Assets+现金、银行、投资Assets:Checking
Liabilities-信用卡、贷款Liabilities:CreditCard
Income-工资、利息Income:EmployerA
Expenses+购物、账单Expenses:Food:Dining
Equity-期初/期末余额Equity:Opening-Balances
  • 各组成部分必须首字母大写,用冒号(:)分隔,不含空格。
  • 组成部分中允许使用数字和短横线。
  • 根账户名称可以通过选项自定义(见下文)。

指令​

指令是 Beancount 文件中的核心语句。大多数以日期开头,后跟指令类型和参数。它们按时间顺序(按日期)处理,而不是按文件顺序。

通用格式:

YYYY-MM-DD <directive> <arguments...>

常见指令及示例​

开立和关闭账户​

2023-01-01 open Assets:Checking USD,EUR  ; Optionally specify allowed currencies
2023-12-31 close Assets:Checking

声明商品​

2020-07-22 commodity AAPL
  name: "Apple Inc."

价格声明​

2022-04-30 price AAPL 150.00 USD

如需在托管账本中自动获取估值报价,请设置实时价格。托管的价格源提供普通的带日期 price 指令。它们不会替代交易价格(@、@@)或批次成本({})。

备注与文档​

2022-03-20 note Assets:Checking "Asked about refund"
2022-03-20 document Assets:Checking "statements/2022-03.pdf"

交易​

2024-01-05 * "Coffee Shop" "Morning coffee"
  Expenses:Food         4.50 USD
  Assets:Cash         -4.50 USD
 
2024-01-06 ! "Phone Bill" "Monthly payment" #utilities ^phone
  id: "INV12345"              ; Metadata
  Expenses:Utilities  60.00 USD
  Assets:Checking

分录特性​

; With cost basis
  Assets:Stocks    1 AAPL {150.00 USD}
; With price annotation
  Assets:Cash   -100 USD @ 1.25 CAD
; With total price
  Assets:Cash   -100 USD @@ 125.00 CAD
; Implicit balance
  Assets:Cash   -100 USD
  Assets:Bank

余额断言与填充​

pad 的日期必须早于它所补给的 balance,因为断言会在其日期开始时被检查:

2024-06-01 pad Assets:Checking Equity:Opening-Balances
2024-06-02 balance Assets:Checking 1000.00 USD

事件​

2024-06-01 event "location" "San Francisco, CA"

选项​

设置文件级配置:

option "title" "My Ledger"
option "operating_currency" "USD"
option "documents" "docs/"
option "name_assets" "Vermoegen"

更多内容请参阅选项参考。

插件与文件组织​

plugin "beancount.plugins.module_name"
plugin "beancount.plugins.module_name" "config-string"
include "other/file.beancount"
pushtag #project
; ...
poptag #project

托管版 Beancount.io 还会解析受支持的托管价格 URL include。这是对上游 Beancount 的扩展:请使用实时价格设置指南以实现托管和本地的兼容性。

重要规则​

  • 所有交易都必须平衡:所有分录的权重之和为零。一条分录的权重是其金额,或是在存在成本({})或价格(@)时转换为另一种货币后的值。
  • 账户必须先开立才能使用;已关闭的账户不能接受分录。
  • 余额断言只检查指定的货币,可用于父账户,并且在其日期的开始时求值(因此会排除当天的交易)。
  • 价格注解(@ 表示每单位,@@ 表示总额)确实会影响平衡:它们会设置该分录在另一种货币中的权重。-100 USD @ 1.25 CAD 的权重为 125 CAD,可抵消一条 125 CAD 的分录;去掉价格后,交易就不再平衡。

常见模式​

以初始余额开立账户​

开立两个账户,在开始日期使用 pad,并在次日断言余额(断言的检查发生在它日期的开始时):

2024-01-01 open Assets:Checking USD
2024-01-01 open Equity:Opening-Balances
2024-01-01 pad Assets:Checking Equity:Opening-Balances
2024-01-02 balance Assets:Checking 1000.00 USD

投资交易​

2024-01-01 * "Buy stock"
  Assets:Broker:Stock   10 AAPL {150.00 USD}
  Assets:Broker:Cash -1500.00 USD

多币种交易​

2024-01-01 * "Currency exchange"
  Assets:USD   -100.00 USD @ 1.25 CAD
  Assets:CAD    125.00 CAD

注释​

poptag  #trip-to-peru
; inline comments begin with a semi-colon
* any line not starting with a valid directive is also ignored silently

来源:https://beancount.io/zh/docs/Basics/syntax