跳转到内容

账户

open 指令创建一个账户,并让它从指令的日期起可以使用。close 指令结束它的使用。交易记账的每个账户都必须先开立。

YYYY-MM-DD [HH:MM[:SS]] open <Account> [<Commodity>[, <Commodity> …]]
[<key>: <value>]
YYYY-MM-DD [HH:MM[:SS]] close <Account>
部分 必填 说明
日期和时间 是 账户开立或关闭的时间,可以附带一天中的时刻。
<Account> 是 账户名,例如 Assets:Bank:Checking。
<Commodity>, … 否 这个账户打算持有的商品,用逗号分隔。每种商品都必须已经定义。
<key>: <value> 否 元数据行。张记账读取的键见元数据。

账户名以五种账户类型之一开头:Assets、Liabilities、Equity、Income 或 Expenses,后面跟一个或多个用 : 分隔的部分。每个部分可以是任何不含空格、引号、冒号、括号或逗号的文本,所以 Expenses:Food:餐饮 是有效的账户名。

2024-01-01 commodity USD
2024-01-01 budget Food CNY
2024-01-01 open Assets:Bank:Checking CNY
alias: "Main checking"
2024-01-01 open Assets:Broker USD
booking_method: "STRICT"
2024-01-01 open Expenses:Food CNY
budget: Food
2024-01-01 open Equity:Opening-Balances
2024-12-31 close Assets:Broker
键 作用
alias 账户的显示名称。账户列表显示这个名称,并在它下方显示账户的全名。
booking_method 账户的记账方法,见记账方法。
budget 把账户关联到一个预算:它的记账行计入该预算的支出。重复这个键可以关联多个预算。

其他元数据会被保留。在查询中,#accounts 以 open.meta 给出 open 指令的元数据。

记账方法决定减仓(例如 -5 AAPL {})从哪个批次中扣除数量。没有这项元数据时,账户使用 default_booking_method 选项(未设置时为 FIFO)。

与 Beancount 相同,减仓匹配其成本所指定的批次,成本中没有写出的部分可以匹配任何值:{100 USD} 匹配所有以 100 USD 持有的批次,不论取得日期;{100 USD, 2024-01-01} 只匹配在该日取得的批次;{} 匹配所有按成本持有的批次。批次的取得日期是其成本中写明的日期,否则是建立该批次的交易的日期。

  • STRICT:Beancount 的默认方法。减仓必须只匹配一个批次,或者把匹配到的每个批次全部减完。否则账本报告 AmbiguousLotMatch 错误,并在匹配的批次中按 FIFO 记账。
  • FIFO:先进先出,先减取得日期最早的匹配批次。
  • LIFO:后进先出,先减取得日期最晚的匹配批次。

AVERAGE、AVERAGE_ONLY 和 NONE 尚未实现。使用其中之一的账户,或者值不是记账方法的账户,会在其 open 指令上得到一个错误(UnsupportedBookingMethod 或 ParseInvalidMeta),并按默认的记账方法记账。账本仍然可以加载。批次的用法见批次与成本。

  • 账户从 open 起可用,直到 close 当天结束。在同一日期和时间内,open 排在其他所有指令之前,所以 open 当天的交易没有问题。
  • 记到从未开立的账户、或者开立日期更晚的账户的记账行,会报告 AccountDoesNotExist。日期在账户 close 当天之后的记账行会报告 AccountClosed。两者对每个账户和交易各报告一次,交易仍会记账。
  • 开立一个账户不会开立它的父账户。不开立 Assets:Bank 也可以使用 Assets:Bank:Checking,但对 Assets:Bank 的余额断言需要 Assets:Bank 已经开立。
  • 在 close 之后再写 open 会重新开立账户。

open 中列出的商品必须在它之前定义;未定义的商品会在 open 上报告 CommodityDoesNotDefine。同一日期内,把 commodity 指令写在 open 上方。这个列表并不限制账户:张记账不会用它检查账户记账行的商品。查询在 #accounts 中以 open.currencies 读取这个列表。

  • close 检查账户自身在每种商品上的余额,不含子账户。余额不为零时报告 CloseNonZeroAccount。账户仍会被关闭。
  • 关闭从未开立的账户会报告 AccountDoesNotExist,关闭已关闭的账户会报告 AccountClosed。
  • 已关闭的账户保留它的余额和历史。账户列表把它标记为已关闭,并且可以隐藏它。
  • close 之后可以有 note,不会报错。
错误 触发条件
CommodityDoesNotDefine open 中列出的商品未定义。
ParseInvalidMeta booking_method 不是一种记账方法。
UnsupportedBookingMethod booking_method 为 AVERAGE、AVERAGE_ONLY 或 NONE。
CloseNonZeroAccount 账户关闭时仍持有某种商品。
AccountDoesNotExist 指令使用了尚未开立的账户,或者关闭了从未开立的账户。
AccountClosed 交易记到已关闭的账户,或者已关闭的账户再次被关闭。
  • Beancount 把记账方法写成商品之后的带引号字符串。张记账在 Beancount 文件中读取这种写法,并把它存为 booking_method 元数据。在 zhang 文件中请改用元数据:商品后面的字符串是语法错误。

    2024-01-01 open Assets:Broker USD "FIFO"
  • Beancount 拒绝商品不在 open 列表中的记账行。张记账不做这项检查。

  • Beancount 的默认记账方法是 STRICT;张记账的是 FIFO。

  • CloseNonZeroAccount 是张记账自己的检查:Beancount 关闭这样的账户时不会报错。