重启手工记账
上回用beancount来手工记账是2018年的事,当时想要这么做的原因是贵厂的Waze Carpool项目当时并没有提供非常方便理解的记账系统,因此结合每月的对账单和Waze记录的数据来统计一下相关的数据,同时也把手中的现金一类没有对账单的小额资金给管起来。后来又逐渐加入了一些其他的类似PayPal之类的付款记录,但是随着疫情的发展,到2020年初的时候已经不再有新的记录,慢慢也就把记账的事情给搁置下来了。
今年出于计算个税的需要,我又重新开始了记账。最初的想法是只把工资单的自动导入做好,但后来想到既然 #来都来了索性就把相关的解析全都做了好了。
我目前使用的导入工具是贵厂员工维护的 beancount-import。目前我使用的金融机构大致上可以分为三类:第一类是提供了 OFX (有些银行或券商称作Quicken,导出一个QFX文件,这是Intuit扩展的一种OFX格式)格式的导出,主流银行多半属于此类;第二类是不提供OFX但是提供某种格式的CSV,这包括了PayPal、Discover,以及某些credit union;第三种是两种格式都不提供。
除此之外,工资单的PDF如果包含规整的文本数据的话,也可以使用该工具导入。
简便起见,我在导入时只处理了2022年以来的数据。不过,一些跨越多年的财务数据,例如房贷还款,仍然需要做一些更好的处理(目前的做法是未做按月的明细记账,而是以年为单位记录汇总的利息和本金偿还记录)。在整理数据的过程中,我发现银行在关闭账户之后,往往就不再提供访问对账单或是税表的功能了。
目前发现的问题主要有:
- 银行提供的数据描述不适合人类理解。例如,它可能会将一笔交易记录为
COSTCO WHSE #0423而不是容易理解的Costco, Sunnyvale CA。这属于可以用sed轻易解决的问题。 - 有些银行的
FITID是不唯一的,多次相关交易会使用同一个FITID,这会给数据处理带来一定的困难。 - 贵厂工资单的格式发生了变化,需要使用这个PR。
- 太平洋瓦斯及电力公司提供的数据明细很多,但其PDF是点阵字而不是可以比较容易解析的文本。目前还没找到很好的方法来处理这些数据。
- 涉及外币及基金的交易有舍入误差的问题。目前是使用
@@ XX.XX USD的方法强行抹平,但这种做法存在一定的隐患(因为这样一来美元部分的帐目平了,但持仓数据可能由于录入问题导致不平)。此外,beancount在处理基金交易时的计税单位处理存在一些bug(使用FUND { price USD }语法时,后续的扣费交易有时无法对应到正确的计税单位)。
除此之外,并非所有交易的明细都可以从银行获得。一些机构可能使用了赊帐-缴费,比较具有代表性的是学校、电力公司。我目前的做法是给这些机构分别设置了一个 Liability 账户。以PG&E为例,我目前的做法是将耗电 (KWH) 作为一种货币,这样相关的记账类似于:
| |
最终这些费用会从一个叫做 Liabilities:Utilities:PGE 的账户中支出。这样一来,相关的PayPal交易(从 Liabilities:PayPal 到 Liabilities:Utilities:PGE 的付款)和信用卡交易(从信用卡的Liability账户到PayPal账户的付款)就可以直接从银行数据中导入了。
下载银行的数据可以用 Selenium 来大部分实现自动化。
我目前暂时还没有研究如何把Costco的小票数据导入进来,因此大部分非药物的交易仍然只是简单的一笔Grocery expense,这会给数据带来一些误差(例如,本应计入消费税的部分可能也算作grocery expense了)。
话说回来,正如 yegle 说的:数豆子的伟大之处就在于帮助人们意识到自己没几个豆子可以数。