下面这些问题来自纯文本会计社区 —— Reddit、Hacker News、Beancount 邮件列表 —— 涵盖的是实践层面的运作方式。关于 Beancount.io 服务本身的问题(定价、套餐、支持、账户管理),请看产品常见问题。
入门
开始之前我需要了解多少会计知识?
大概五个概念,而不是一个学位。你需要知道五种账户类型(资产、负债、权益、收入、费用),知道每笔交易至少要在其中两个账户之间转移价值,以及交易必须平衡这条规则。其余的 Beancount 会帮你强制执行 —— 任何数字对不上的交易都会被标记为错误,而不是被默默接受,所以软件能抓住新手本来会漏掉的错误。
从Beancount 简介开始,把术语表开在一个标签页里,然后在快速开始中加上你的第一笔交易。
Beancount 中的借方和贷方在哪里?
为什么交易必须平衡为零?
因为钱总是从哪里来的,而零和就是把这一事实变成错误检查的机制。如果你花 40 美元买杂货,这笔钱是离开了某个银行账户 —— 把两半都记下来就意味着它们必须抵消,任何一边的金额打错字都会被标记为错误,而不是悄悄产生一个错误的余额。
这就是为什么纯文本账本比一张支出电子表格更值得信任:结构本身就是自检的。余额断言是相关的机制,用来把账本和现实核对。
我如何设置期初余额?
在你开始的那天记一笔交易,把每个账户当前的余额从 Equity:Opening-Balances 转出来,然后加一个 balance 断言把它锁定。你不需要重建自己的财务历史 —— 挑一个开始日期,把当天的余额照原样记下,然后从那里往前走。
快速开始里有一个完整的期初余额示例。
我的会计科目表应该多详细?
先粗一点,只有当更细的划分会改变某个决定时才拆分。二十来个账户起步完全够用;如果你在纠结“Expenses:Food”要不要把杂货和餐馆分开,有个实用的检验标准:知道这个拆分后,你会不会真的做出不同的举动?
以后重命名和拆分在文本文件里就是一次查找替换,所以从简单开始的成本很低。账户名可以嵌套,所以你可以先从一个宽泛的类别开始,之后再拆成子账户,而不用重写历史 —— 如果你想要一个可以照抄的结构,看如何设计会计科目表。
为什么用纯文本?
为什么用纯文本记账而不是电子表格?
复式记账对个人理财来说不是过度设计吗?
如果你只想知道自己在咖啡上花了多少钱,是的 —— 电子表格就够了。一旦你有好几个账户、一笔房贷、一个券商账户或者不止一种货币,复式记账就开始值回票价了,因为这些正是单式记账会悄悄丢钱而不告诉你的情形。
一个有用的想法是:复式记账是你财务的校验和。更长的论证看简介。
导入你的数据
如何将银行交易导入 Beancount?
大多数人会导入 80–95% 的交易,其余的靠手工录入。按可靠性从高到低大致是:从银行直接下载的 OFX/QFX、CSV 导出加导入规则、聚合器连接,以及 —— 只作为最后手段 —— 把 PDF 对账单转成 CSV。Beancount.io 的银行同步会帮你处理连接和分类。
做好为每家机构写或调整一条规则的心理准备:银行导出的 CSV 以不一致著称,而商户名里含有一个没转义的逗号是真实且常见的问题。自动化的路子看智能导入。
对于一次性的文件,有两个免费的浏览器转换器能在不上传任何东西的情况下完成机械的部分:CSV 转 Beancount 用于电子表格导出,OFX 和 QIF 转 Beancount 用于银行在完全不提供 CSV 时给的 .ofx、.qfx、.qbo 和 .qif 下载文件。
如何避免重复导入同一笔交易?
导入器会针对账本里已有的分录去重,按日期、金额和收款人匹配,并把任何模棱两可的地方标出来让你确认,而不是靠猜。通常的工作流会把不确定的导入标为待定,这样在它们成为永久记录的一部分之前你能先审阅。
OFX 在这方面比 CSV 更容易:每笔交易都带有一个银行在多次下载中保持稳定的 FITID,所以导入器可以按身份而不是靠推断来匹配 —— OFX 转换器会把它保留为一个 id: 元数据字段。
答案的另一半是转账:钱在你拥有的两个账户之间移动,会出现在两家银行的导出文件里。把它记成一笔带两条分录的交易就好。
我必须把银行登录凭据交给第三方吗?
不用 —— 对很多人来说,这正是使用纯文本会计的理由。你可以自己从银行导出 OFX 或 CSV,永远不用把凭据交给聚合器。如果你偏好自动同步,Beancount.io 使用的是银行认可的聚合器,而不是存储你的网上银行密码。
细节看安全页面。
我如何将账本与银行对账单核对?
为对账单的期末数字加一个 balance 断言,日期定在结账日之后的那一天。余额断言在其日期的开始时求值,所以第二天早上的断言才会包含截至对账单最后一天的所有交易。如果你的账本和银行不一致,bea check 会报一个 Balance failed 错误并以非零状态退出,这把核对从手工比较变成了软件每次运行都会检查的事情。
对大多数人来说每月一次就够了。要追查差异,看过滤与搜索。
货币和投资
Beancount 如何处理多币种?
我怎么让估值价格保持最新?
如何跟踪成本基础和资本利得?
用花括号里的成本记录买入 —— 10 AAPL {150.00 USD} —— Beancount 会分别追踪每一批。当你卖出时,你说明自己在减少哪一批,资本利得就会自动从算术中得出来,而不是要你手算。
Beancount 支持 STRICT、FIFO、LIFO 和 NONE 记账方法。平均成本记账能被解析,但没有完全实现 —— 如果你的税务辖区要求平均成本,就打算用插件或显式批次来追踪。看库存管理。
如何记录加密货币交易及其成本基础?
和任何其他商品完全一样:加密货币是一个带成本的单位,所以同样的批次和记账机制都适用。用一种代币换另一种,是一笔减少一批、开立另一批的单笔交易,这也正是你得到大多数税务机关想要申报的已实现利得的方式。
看加密货币投资组合追踪和现成的加密货币模板。
企业和自由职业账簿
Beancount 可以用于小型企业,还是只用于个人理财?
我应该为个人和业务保留单独的账本吗?
分开 —— 要么作为一个文件里两棵不同的顶层账户树,要么作为两个用 include 合并的文件。混在一起会让企业的利润表失去意义,让报税季更难熬,而分开几乎不花任何前期成本。
一旦企业有了自己的银行账户,两个文件通常是更干净的选择。看多文件支持。
我如何处理发票和应收账款?
工具和生态系统
Beancount、Ledger 和 hledger 有什么区别?
三者都是纯文本复式记账系统,文件格式相似。Ledger 是最早的那个,解析器也最宽松;hledger 是用 Haskell 重写的实现,以友好的 CSV 导入规则和文档著称;Beancount 的解析器最严格,对投资、批次和多币种的支持最强,还有一个 Python 插件 API。
严格才是真正的取舍:Beancount 会拒绝加载它认为有歧义的文件,代价是更挑剔,收获是更早发现错误。看Beancount 对比 Ledger CLI和 Beancount 对比 hledger。
Beancount 是否像 YNAB 那样做信封预算?
原生不行 —— 这是一个真实的缺口,而不是隐藏功能。Beancount 内置的预算能力有限,想要严格信封行为的人通常用社区插件,或者把信封建模成账户。
如果信封预算是你最看重的东西,换之前先读Beancount 对比 YNAB。至于今天确实能用的做法,看 Beancount 中的预算。
我可以把收据附加到交易上吗?
可以。document 指令把文件链接到一个账户和日期,网页界面让你上传并浏览这些文档,和它们所属的交易放在一起。收据就是磁盘上的普通文件,所以它们和账本本身一样可移植。
看界面功能。
有移动应用吗?
账本能增长到多大才会变慢?
十年的个人财务也就几兆字节,加载远不到一秒。Beancount 每次加载都会从完整交易历史重新计算余额,这一点一直到几十万条分录都还很快。超过之后,限制在于编辑和 diff 的舒适度,而不是加载时间:用 include 按年拆分能让单个文件保持小,但被 include 的文件仍然构成一个合并账本,Beancount 会完整加载并重新计算,所以这只是文件组织的便利,既不是提速,也不是用来分开记不同账目的办法。
关于怎么拆分一个不断增长的账本,看多文件支持。