账户
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 USD2024-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: Food2024-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),并按默认的记账方法记账。账本仍然可以加载。批次的用法见批次与成本。
账户何时可用
Section titled “账户何时可用”- 账户从
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 兼容性
Section titled “Beancount 兼容性”-
Beancount 把记账方法写成商品之后的带引号字符串。张记账在 Beancount 文件中读取这种写法,并把它存为
booking_method元数据。在 zhang 文件中请改用元数据:商品后面的字符串是语法错误。2024-01-01 open Assets:Broker USD "FIFO" -
Beancount 拒绝商品不在
open列表中的记账行。张记账不做这项检查。 -
Beancount 的默认记账方法是
STRICT;张记账的是FIFO。 -
CloseNonZeroAccount是张记账自己的检查:Beancount 关闭这样的账户时不会报错。
