普通人如何正确记账
为什么要记账?
记账是投资入门的首要前提,如果不能在投资过程中随时了解自己的资金情况和分配于各个投资策略之间的仓位比例,那么你就像一个在战场上高度近视还丢了眼镜的战士,所有行为和操作基本都是睁眼瞎。
记账是一个人开始认真对待自己资产的开始。
所以,记账的目的是什么?是为了在搞明白自己的收入、支出、负债、现金流等财务数据之后,来更好地指导我们的投资行为。因为你真实的记账数据能反映你真实的财务状况,那从这些数据中产生的丰富洞察和分析,可以指导我们进行正确的资产配置和财务管理。我们记账系统的所有设计都应该围绕这个目的而展开。
为什么不直接用 Beancount?
市面上不错的记账软件已经汗牛充栋了,其中有名的当属 Beancount。
它采用复式记账的理念,用一套简单、高度抽象又一致的底层规则和数据模型解决了记账中会遇到的大多数问题。我很早就了解过 Beancount 的记账方法,但一直没有真正实践起来,原因是我觉得它对于想要坚持长期记账、但又不那么 Geek 的普通用户还是有一定的使用门槛和要求。如果我需要一套长期、稳定、可持续、且能让自己一直坚持记账的系统,我可能不太会考虑使用 Beancount。
在我看来,Beancount 对于普通用户而言存在这些问题:
- 基于纯文本文件,基本只适合在电脑上进行文本输入记账,不适合随手记。
- 有一定的上手门槛,需要了解这个系统运作设计的基本概念和记账语法,比较适合 Geek 或 Nerd,但不适合普通人。
- 因为复式记账的天然特性,你需要事无巨细地记录每一笔资金的流动才能使账本的账目是平的,这是典型的 Nerd 思维,更多的普通人其实只关注大头资金的流向。比如,当你需要记录货币基金的利息收入这一项时,使用 Beancount 你需要单独给「利息」开出一个外部账户,用这个账户给自己的某个账户转钱,这个操作本身有一些繁琐,且这个利息的资金量可能又不是很大,有点维护成本大于收益的感觉。
- 原生的时间记录不够精确,交易只记录日期。虽然影响不是很大,但是无助于用户回忆以往某个交易的一些细节。
- 因为其文本记账的特性,无法简单地自动记录一些元信息,比如交易的位置信息,可能得需要借助插件才能实现这一点。
- 记录与展示分离,对普通用户而言不够直观,比如即便交易记录了位置信息,但当用户需要查看交易的精确位置时,往往需要进一步的 UI 插件来呈现。
- 过于开放和自由,定制化程度很高,比如账户分类可以很灵活,用户需要自行摸索出一套自己的具体记账实践。这种自定义的开放程度对喜欢折腾且有小众需求的 Geek 用户很友好,但另一方面,在缺少规则约束和限制路径的情况下,增加了普通用户上手记账的门槛,也会损害记账的初始化体验。
- 周期性的交易无法简单做到自动化记录,比如信用卡分期交易。
- 因为无法对账户的基础属性进行分类,容易把交易分类和账户分类混为一谈,也会比较难清晰地抽离出与投资行为相关的交易来进行更深入的分析。这一点其实对于投资而言非常重要,记账是为了更好地进行投资,如果不能充分从账本中记录的投资交易和操作中分析投资行为,那记账的价值就会大打折扣。
总结下来,Beancount 稍微有一点「为了记账而记账」的感觉:虽然它足够抽象、统一且强大的底层原则设计得确实非常优雅,很吸引 Geek 群体,但它依然还是有点像「我拥有了一把漂亮的锤子,看到任何问题都是钉子」的感觉。我希望的是,我能以尽可能低的维护成本进行记账,记录必要的信息,从而辅助我更好地进行投资行为。
设计更简易的记账工具
为了能达到我的记账要求,需要做一些取舍,简化复式记账的模型,使用户体验更加友好,并让「随手记」变得简单可行。
⚠️ 为什么一定要「随手记」?
因为我觉得让一个人能长期持续坚持记账的方式就是这件事足够简单易行,如果我每天或者每周还需要单独划出一定的时间来做这个事情,(至少对我来说)很难让人长期坚持下来。
而且,记账时间距实际交易发生的时间越长,积累的工作量就会越大,这是反人性的,很容易让人放弃坚持。为了能坚持下去,最好就是在交易发生时,立刻记录下来。
一般人一天的交易数据其实并没有想象中那么多,通过「随手记」的方式记账不会额外花费很多精力,把可能本需要静下心来好好梳理的账目工作分散于日常之中,却又能记录下了必要的账目信息,方便进一步的统计和分析。
养成习惯之后,这会是一件很自然的事情。
首先,复式记账的原则(也就是「会计恒等式」)——「每一笔交易都是账户之间的金额流动,且它们金额变化的总和为 0」——不能丢,因为这可以用底层规则保证你的账户金额不会出现系统错误(整个系统平白无故多出或少出一笔钱),让每一笔交易都与你的账户关联起来,使账户的余额总是最新且准确的。
那么,基于这个基本原则,我们应该如何设计这个简化的复式记账工具呢?
首先,我需要回答一些关键的问题。
工具如何实现简单的「随手记」?
为了能足够方便的触达,做到随时随地记录,最好的方式还是实现成一个移动端的 App。
如何记录利息这样的小额收入?
类似于货币基金这样的账户的利息(或资本利得)往往是每日更新并可计提的,如果需要每天都记录这样的利息收入往往变得繁琐且没必要。为了满足这样的收入记录需求,我们可以设计一个专门用于更新账户余额的内部系统账户(也可认为是系统交易分类,详见后文章节「账户就代表了交易分类?」和「现金类账户 - 如何划分逻辑账户(心理账户)」)来定期更新账户的余额,同时也可以用于补偿一些忘记记录的小额交易或更正账户余额的误差。
多账户(大于两个)的单笔交易?
Beancount 是天然支持记录涉及多个账户(大于两个)的单笔交易的,但在我的日常实践中,这种场景并不多,而且几乎所有涉及多账户的单笔交易都可以拆分成多笔两账户的交易来记录,为了让记录交易这个高频操作足够简洁直观,也不增加系统设计和实现的复杂度,我决定让每一个交易都只涉及两个账户之间的金额流动。
关于汇率与多币种
汇率和多币种其实是一个很复杂的问题,因为货币汇率和币种设置都是可能会随着时间变化的。如果历史交易涉及到多币种之间的换算,需要记录每一笔交易发生时的汇率,方便未来进行换算。在记录时这还相对简单,麻烦的是涉及汇率转换的账户间的图表展示、比较和对交易的分析,这不可避免的会让图表展示的 UI 变得复杂和不直观。无论如何,在某一个时刻,系统都需要一个主货币来进行操作和展示,相当于系统账目数据在那个时刻的度量衡。
大部分主流币种的汇率相对稳定,如果不稳定它甚至可以在记账系统中被当成一种投资品来记录它相对于主货币的涨跌。
基于以上分析,我决定只记录每笔交易的币种和金额数值,不记录当时的实时汇率。这样的设计可以覆盖大多数多币种场景,而用户可以在需要时进行汇率结算。至于图表统计展示的场景,永远都使用当前主货币来进行展示,从而保持图表展示和金额比较的简洁一致。
AI 自动记账?
AI 在今天确实已经可以干很多事情了,虽然我依然怀疑它是否能在没有任何人为干预的情况下做到准确地把每一笔交易记录到我想要的分类中去,除非这个 AI 能针对个人的记账习惯进行特定的训练,因为不同人的记账习惯千差万别。市面上有一些记账软件做了图片识别自动记账的功能,但我截图、识别、记录的功夫(即使有快捷指令)不一定比直接提供桌面小插件一键直达输入页面手动输入金额保存花的时间少。尤其如果 AI 的记录有错,我需要手动改正确的过程可能比简单的纯手动记账要更慢,所以识别的准确性其实是个很关键的指标,否则有这样的功能还不如没有。
目前我觉得在记账系统中合理引入 AI 可能得达到这样的三个要求:
- 在 App 权限允许的范围内,能快速获取到用户发生的账目信息,比如自动快速截图识别。
- 为了隐私考虑,最好能只使用离线的 AI 大模型。
- AI 能针对用户的记账习惯进行自适应训练。
可能这样才能让体验足够好,但目前来看还是有点难以实现。
虽然可能无法做到很完美的 AI 记账体验,但一些快捷记账方式依然还是能加快记账的速度。比如借助 iOS 的快捷方式自动化截图识别并记账,又或是借助操作系统能提供的 AI 模型接口,实现端侧离线大模型对于图片、语音或自然语言的识别和准确记录。这些都值得尝试,前提是 AI 被唤起识别的速度能足够快,对于信息的分析和理解能足够准确。
不过不管怎样说,加快记账速度的任何快捷方式对整个记账系统而言都只是 nice to have 的功能,并不影响记账这件事本身的核心功能路径。
从记账习惯养成的角度来说,这本身甚至是有点悖论存在的:如果我只是片面追求记账速度,很难说记账人是否真的在意自己的财务数据、是否真的会严肃客观地回顾自己的历史财务数据。这就回到了前面所说的有点「为了记账为记账」的感觉。而每天打开 App 记账的过程本身,其实可以给我一个对自身财务健康程度的初步印象,这种印象可能会让我产生一些财务方面的思绪,比如思索我这个月是不是花超了、我是不是有不应该的大额消费、我之前的某笔投资行为是不是恰当合理等等。这些在记账过程中悄然产生的想法同样会让我更高频率地打开记账软件的统计和分析页面,也许能产生更深入的财务洞察,从而更好地指导我未来的财务和投资实践。
自动更新投资账户余额?
有些软件能自动用外部数据更新你的投资品类的最新净值,比如你买入的某个指数基金,可以做到自动根据当天公布的净值和你的持有数量更新你的资产余额。但这种自动化很难覆盖到所有投资品类,比如某些投顾类品种、或者某些私募基金、小众加密货币、甚至是实物收藏品等等,如果我不得不手动更新部分投资品种的最新资产余额,那自动更新的意义也会大打折扣,因为只要有部分资产不是最新的,你都会对资产统计分析产生的结论有一定的疑虑。
反过来,完全的手动更新反而可以给用户提供了一些资产聚合上的自由度,因为我总是可以手动将按某一投资策略买入的多个投资品种自行用逻辑账户(心理账户)进行归类。当然,这种聚合也可以通过给投资品种分类或打标签聚合来实现。
但这种自由度不仅仅针对投资类型的账户,其他类型的账户也可以做适当聚合,比如现金可能存在于各个分散的银行、交易平台之中,甚至可能还有纸币现金,它们也是很难做到自动更新资产余额的。这种在作用和逻辑上没有什么区别的分散资产,我都会用一个统一的逻辑账户来记账。当然,为了长期的记账账目更准确、详细和丰富,也不妨碍把这些分散资产按照真实的实际账户拆分成得更细致来记账(详见下文章节「如何划分逻辑账户(心理账户)」)。
不过,我其实非常想做能自动更新投资账户净值的功能,这也是我最初的设计目标之一,目前看比较难跟已有的记账功能整合得非常好,因为那大概率会让涉及投资账户的日常记账过程变得繁琐和冗长。但我很可能会设计一个其他的 App 来实现这个功能,目前也已经有了一些初步的想法。
账户就代表了交易分类?
在 Beancount 中其实没有交易分类的概念,所有的资金流动都是在不同账户之间的,或者说从账本主人的视角来看,外部账户就代表了交易的分类。这个设计确实非常优雅巧妙,但有一个小问题,内部账户之间的转账就失去了一个可用于分析的固定交易分类。比如还信用卡或者投资操作的买入卖出,在 Beancount 中我可能不得不给这样的每一笔交易都手动打上相同的 tag 来进行分析,但实际上它可以是一个固定可选择的分类。
但复式记账的原则不能丢,所以我们在实际实现中可以虚拟出一个系统保留的外部账户,再用额外引入的不同的交易分类绑定每一笔交易,便于之后进行数据分析。这样的交易分类可以是多级的。
实现我们的记账工具
基于以上的想法和初步设计,我实现了一个 iOS App 来满足我自身的基本需求,叫 BeanLedger,目前可以从 App Store 中下载使用。
如何更好地记账
记账本身是一个个性化程度很高的事情,不同人可以根据自身习惯找到适合自己的记账方式。这里只是根据我自身这些年的记账经验,分享一些我认为可以更好地记账的经验和原则。
一个最基本的大原则是,不管你按什么习惯来记账,你都应该客观地面对自己已产生的真实账目数据,不管它有多难看。我偶尔看到社交媒体上有些年轻的朋友说自己在过度消费之后会粉饰自己的记账数据,甚至从此放弃坚持记账的行为,这是不理智的。实事求是面对自己的财务情况,才能在未来做得更好。财务数据是个人的,我们不是上市公司,无需向投资人公布可能需要被会计师粉饰过的财报,不妨真诚面对真实的自己,才有开始从行动上改善财务情况的可能。自欺欺人没有意义。
其次,我只会记录真正发生在我自己真实账户上的交易数据,比如购物消费永远记录实际付款的金额值,而不管商品原价是多少、是否有折扣优惠等等,再比如工资收入就只记真实的到账数值,而不是记税前数值再扣除税、社保、公积金等(更具体的描述见下文章节「如何记录资产和负债」)。
每一笔交易都记录还是只记录账户金额变化?
市面上有些记账软件只让你一次性记录一段时间账户的资金变化,比如每月固定更新一次各个账户的当前余额,BeanLedger 也完全支持这样的使用方式,并提供了一些便利操作。对于那些不关心日常收支详情的用户,这样做更省事,也同样可以在数据更新后看到各个账户之间的资金比例、投资仓位的大小等等。
对我个人而言,我其实还是好奇我的日常收支、消费的细节信息,而且每笔交易分类聚合后,可以提供各个类目在某个时间周期内的占比信息,比如我可能会好奇今年哪些类目的消费占据了大头,这也会有助于我掌控和改善自己的财务健康度。
如何划分逻辑账户(心理账户)
前文已经提到,为了简化记账,通常我们都不会一五一十按照你实际在不同银行、平台的物理账户都在记账软件中创建对应的账户来记账,而是把它们聚合为合理的逻辑账户(或称心理账户),更有助于账目的清晰直观。
按资产属性划分,通常可以把账户类型划分为三类:现金类、债务类和投资类。个人净资产 = 总现金 + 总投资 - 总债务。为了方便理解和使用,也为了与大多数金融软件的惯例保持一致,我们在系统中把债务总是记为正值。
现金类账户
现金类账户指的是能随时取用的钱,这包括现金以及那些可以在短时间内变现的资产,比如货币基金、现金类理财等。虽然它们可能也可以产生一定的收益,但短期内几乎可以忽略不计,我们主要还是看重这些账户流动性足够强的特点。
对于现金类型的账户,其实最开始记账我只记为一个账户,各处的现金、货币基金、现金理财加起来就是这个逻辑账户的余额。但在一段时间的记账实践后,我发现把现金账户拆分得更细一些,有助于不遗漏任何的交易记账。在记录与其他账户的交易过程中,你可以更方便地直接核对账户的当前余额,而不需要再自行手动加减。所以后来我按不同平台对总现金账户进行了拆分,各个平台一般都直接有现成的汇总金额来方便我核对账本账户的当前余额,通过简单的核对便可以及时发现是否有遗漏的交易没有记账(如果核对后发现有差值但金额差值不大,我有时也会用前文所说的系统保留分类来直接更新账户余额)。这样拆分的代价是现金类型账户之间的转账也需要一一记录下来。
债务类账户
债务类账户顾名思义,是你个人已经产生但需要在未来偿还的债务。
对于债务类型的账户,与现金类账户类似,通常也可以按平台或用途划分逻辑账户,比如各个银行的信用卡都可以划分为独立的债务账户,房贷也可以单独划分为一个债务账户等等(具体记账方式见下文章节「如何记录资产和负债」)。
投资类账户
投资类账户指的是那些真正被我们当作投资属性的资产,比如股票、权益类基金、用于投资用途的房产等。
对于投资类型的账户,通常我会按照某个投资策略或投顾计划划分逻辑账户,这个策略可能包含各种各样的投资品种,比如股票、场内基金、场外基金,它们也可能会在不同的投资平台和券商进行,但它们在逻辑上属于同一个投资策略,那么在记账中就应该划为一个逻辑投资账户。这样做可以方便计算这个策略总的投资收益以及直观对比不同投资策略之间的投资收益率,有助于我们的投资决策。
有些记账软件会把投资类账户按资产属性划分得更细致,但我觉得可以用账户标签来实现这一点。而且有些非投资用途的固定资产我认为并不需要作为账户来记录(详见下文章节「如何记录资产和负债」)。投资类型账户的总金额占净资产的比例可以让我们明确自己目前的投资仓位处于什么样的水平。
如何记录资产和负债
对于资产账户的记账,就我个人而言,我不会记录本来就不把它当作投资属性的资产,这意味着:
- 我不会记录任何无法再提现的资产,比如储值卡、优惠券等,而把储值行为、购买消费券的行为记为一笔消费,如果未来有二手卖出再记一笔收入。
- 我不会记录只是用来用作消费用途的固定资产,比如仅用来自住的房产、自用的汽车等,同样把购买行为记为消费,未来有二手卖出再记收入。
- 对于消费型保险、社保、公积金等,只要是从我个人账户出资的,一律记为消费,而把未来的回报(比如养老金账户未来能提供的养老金)记为未来发生时的收入。如果我好奇我社保、公积金的现值,直接去政务网站上查就好。
这样做的原因是,我希望尽可能以一种谨慎、客观的记账方式来面对自己真实的现金流,并时刻关注这个指标,而不是用流动性极差的固定资产的市值让自己产生资产数量上的错觉。这不仅对投资的资产配置、仓位比例非常重要,同时也杜绝任何需要变卖本身就没打算卖的固定资产来弥补现金流短缺的可能,比如因某些意外事件突发临时需要一笔超出你当前现金流的钱,即便你可能有很大市值的固定资产,你也很可能无法让固定资产快速变现,这很可能还会导致你投资上的受迫亏损卖出。在我看来,这是无法被接受的。
与之相对应的,我也会把时间跨度很长、且稳定的个人债务记录为未来的周期性支出交易计划,而不是一次性把债务总额记为某个债务账户的当前债务金额。最典型的例子是房贷,它可能数额巨大且时间跨度非常长,如果一次性记录债务总额则可能会一下子吞没你的所有现金流,这并不能反映实际的现金流情况。实际上,我们只需要把它看成一笔超长期限的分期支付(一系列债务账户的未来「支出」交易),每个月支付相对小额的资金还款(从现金账户转移到债务账户的「转移」交易)即可。如果这样记大额或长期贷款,那么未来债务量也会是我们需要格外关注的指标,因为它也会影响我们未来的现金流。
如何记个人借出的款项(应收账款)
于我而言,所有借出款项均应记为支出交易,因为资金一旦离开你自己的掌控,都应被当作是不可控的,即便对方的信用再好。
实际上,就人际交往而言,任何你借出的款项在心态上就应当当作是你的送出款项,否则势必会影响你们之间的关系、相处时的心态。永远不要试图考验人性,在投资中也是。
这些可能分类为「个人借款」的支出交易同样可以作为你应收款项的记录能被随时查阅。未来真正收款后再记一笔收入,或者直接把原来的支出记录删除,具体选哪种方式通常取决于借出到还款的时间跨度是否跨越了个人记账统计的周期,以及款项的大小。如果是短时间、小资金,通常直接删除原来的支出记录就好。
这样做的原因同样是为了让记账数据以最谨慎的姿态反映出你最真实的现金流状态。
如何进行周期记账
很多时候我们需要记录一些周期性的账目数据,比如信用卡还款、信用卡某笔大额交易的分期支付、某笔贷款的周期还款、保险扣款、房租等等。
BeanLedger 目前已支持设置未来周期性的交易计划,可以等到计划当天进行交易确认(适用于信用卡还款,同时在确认后更新那一次具体的还款金额),也可以一次性生成未来的多笔已确认的交易记录(适用于信用卡某笔账单的分期支付)。
如何对某一事件的交易进行聚合分析
有时候,我们希望对某一段时间内发生的所有交易数据进行聚合分析,比如某次旅行的花费、举办某一活动的开支账目等等。在 BeanLedger 中,我们可以对所有相关的交易记录关联一个固定的交易事件,这样在对应的统计页面就可以看到针对这一事件的聚合分析数据。
如何记录退款
很多情况下,交易会产生退款行为,比如购物的退货退款、银行在消费后的返现等,这些退款可能只是原来金额的一部分。BeanLedger 目前也支持了这种场景的记录,每笔交易的最终金额 = 原始金额 - 退款金额。
如果退款金额等于原来的金额,通常我会直接删除这笔交易。
记账数据如何多设备同步和备份
基于隐私和数据安全考虑,BeanLedger 本来想设计成一个完全离线运行的 App 终端,但为了方便数据进行同步和备份(这很重要,数据不丢失同样是数据安全的一方面),还是会需要获取网络权限。同样基于隐私和安全的考虑,BeanLedger 目前只会通过 iOS 系统的 iCloud 服务进行多设备间的数据同步,未来也会实现基于 iCloud 的数据备份和导出功能。
BeanLedger 的其他小功能
- BeanLedger 目前支持记录交易发生的地点,可以映射到地图上进行查看,方便用户回忆一些关于某笔或某地交易的细节。
- 有时候我会有一些与财务相关的待办事项,它们无法被记录为交易,比如招行信用卡需要每月报名微信支付积分活动才会获得微信上的消费积分。因为它也是财务相关的事项,我希望也能在这个 App 里记录并在当天及时提醒我完成。BeanLedger 目前支持设置待办事项和待办计划(类似于前文章节「如何进行周期记账」提到的交易计划,可以设置周期性的待办计划,也可以一次性生成多个不同时间的待办事项),也支持通知提醒功能。
- 通过资产桑基图可以让你对资金流向、现金流、负债情况、各个类型账户间的资金比例一目了然,这是我高频使用的统计功能。
- 为了方便用户从任何时间点都可以开始记账,给账户增加了「初始金额」的概念,也就是开始记账时逻辑账户的当前余额。
- 债务类型账户可以显示各自的未来债务和总的未来债务,适用于分期支付、房贷等场景,做到对未来债务情况的心中有数。
- 投资类型账户可以显示各自的收益、收益率和年化收益率,以及投资账户总的收益、收益率和年化收益率。
- 基于资产、负债、现金流、投资收益等指标的简单资产等级评估,方便对自己的现金流和资产水平有个大概的了解。
- 支持快速更新账户的当前余额,通过自动创建一笔金额为前后余额差值的交易的方式来完成,保证复式记账的原则不被打破。
还有哪些可以改进的地方
目前,BeanLedger 在我自己近半年的使用下来,可能还可以在这些方向上有所改进:
- 探索一些体验好的快捷记账方式,前文「AI 自动记账」章节已经提到了一些。
- 支持 iOS 的页面小组件,更好地在桌面展示一些财务数据。
- 支持数据备份和导出,进一步加强数据安全。
- 支持给账户打标签,增加对账户聚合分析的维度。
- 增加财务预算和目标功能。
- 更多好用直观的统计分析图表。
- 因为 App 除了数据同步以外的功能都在本地运行,同时也为了让数据呈现务必准确,本地数据库其实只会记录最必要的底层数据。比如账户是不会直接记录当前余额的,因为在复式记账的要求下,账户的当前余额势必等于初始金额和所有相关交易金额的矢量和,如果直接记录,很有可能导致底层数据间的不一致。为了彻底杜绝这种情况,很多统计类数据都是页面呈现时实时计算产生的,如果页面交互设计和具体代码实现设计得不够好,可能会造成一些性能问题。另外,一开始的数据框架选型选用 SwiftData 也为数据操作制造了很多障碍(不得不吐槽很多苹果官方的开发框架和工具链居然能如此的不稳定和不成熟)。这是性能上可以优化的点,目前也已经优化了不少 1.0 版本中的问题。
- 由于我之前几乎没有交互设计和前端开发的经验,未来这方面也是一个有很大空间可以提升的部分。
总结
以上就是我对记账这件小事的思考、设计和工具实现的过程。为了投资而记账,如果你认同我以上的设计和思考,不妨试用一下 BeanLedger,也欢迎给出使用反馈和意见建议。如果你还从未开始过记账,强烈建议你找个安静的独处时间认真思考一下这件事,梳理自己的财务情况并开始记账,这将是你能改善财务情况的开始。
年关将近,正是一个复盘前路、重新出发的好时机!