Ledger CLI

2019 年 5 月 23 日 • 12:00 AM

移民办妥之后的两三个月一直在启动自己的理财计划,加上最近家里置办房产还有若干余款总要利用起来,也需要追踪花了多少、赚了多少,以及有多少流动性。我的目标大概包括以下几点,按照重要性排列:

  1. 追踪日常开销和收入
  2. 一览各个银行的储蓄投资账户的余额
  3. 为了纳税考虑,追踪应税收入、非应税收入,以及可以用于抵扣的开销和成本。加拿大所有的收入——全职、兼职、个人全资企业的营业利润,以及投资的资本利得等等——会合并使用同一个纳税梯度和税率,因此如果我有一个全职工作的话,基本上 app 开发的成本(广告、网站、软件、开发者年费等等)都能退还 20% 左右。
  4. 了解现金和类现金账户的余额,确保投资或者任何新的财务计划和大额支出等等不会出现流动性问题
  5. 方便实验各种财务计划,例如我可以测算去银行进行房屋抵押储蓄会对现金流有怎样的影响(抵押储蓄的钱进行投资,可以分散我的投资风险,同时抵押的利息成本可以抵扣投资资本利得的应税部分,基本上利息少了 10-15%)

如果把这些目标当作终点,复式记账基本上是躲不掉的。相比于简单记账方式而言,复式记账可以清楚地看到钱的流向和余额,避免出错,还能把一些欠款、大额开销进行摊销,同时反映实际的收入和支出以及账面的真实余额。

随便说说复式记账

最近发现饭否上好多人讨论 Beancount 和 Ledger CLI 的记账,但是似乎程序员们没有接触过会计 101……其实把账户比作池水就比较容易想通了——

  • 每个账户是钱所在的位置
  • Income 收入类账户可以理解为 “社会里的我可以挣的钱”,Expenses 开销类账户可以理解为 “我可以花掉的钱”
  • Income 和 Expenses 属于社会,资产和负债属于你自己
  • 钱在流动的时候,Credit/借记/减少是指钱从这一账户中流出,Debit/贷记/增加是指钱流到这一账户中去
  • 流出必然等于流入,也就是会计 101 第一句顺口溜 “有借必有贷,借贷必相等”。

Accounts as pools of water

所以一些典型的交易就变成了——

  • 信用卡买单,增加开销、减少负债,因为钱从负债的池子里流到了社会的开销池子里
  • 赚了工资存入银行卡,减少收入、增加资产,因为钱从社会的收入池子里流入了属于你的资产池子
  • 赚了一些外快,获得了现金,减少收入、增加资产,同时减少应缴税费的负债额度;之后写一张支票甩给政府,减少 “银行卡” 资产账户,增加应交税费的负债账户

由于借贷没有开始状态,我们使用 Equity 权益账户直接设定资产和负债的起始余额,方便之后对账。权益账户基本上在个人财务里没有任何用处,只是开户和偶尔调整余额会用到。

在公司财务里,复式记账的好处是可以极大避免钱突然消失的问题。在个人财务里我们自己做账没必要欺骗自己,但是复式记账也能很好地帮你检查错误,并且回答一个非常基本的问题——在某一时间点、我的每个账户里有多少钱?知道这个问题的答案之后,所有的财务信息都可以得到。

另外一个很大的好处是,单式记账要么以现金收支为依据记账,要么以权责发生为依据记账。这时候如果你缴纳保险年费,实际上每个月都会摊销 1/12 的成本,但是以现金为依据记账没法反映每个月的实际支出,而以权责发生为依据无法反映自己账户的真实情况。复式记账可以同时使用权责发生制和现金收支为依据记账,可以让你的账本准确又合理。

最近用的软件和工具

为了进行复式记账我最近尝试了不少的东西,包括——

  • Finances 2。来自🇩🇪德国的独立开发者 Matthias Hochgatterer 开发,自带程序员和功能专精的特点。Finances 秉承复式记账(Double Entry Bookkeeping)的精神,把资产、负债、收入、开销都当作账户处理,通过权益账户找平借贷数额。只要你一笔开销的借贷数额相同,想记多少个项目都可以。Finances 的复杂度和自由度把控得刚刚好,我很是喜欢。

    要说缺点,这个 app 的功能稍有欠缺,比如不能关掉重复交易的通知提醒,也不能快速找平账户余额(你需要看银行对账单和 app 现有的余额,自己用计算器做加减法)。

    诚心讲,Finances 的价格还算公道,iPhone $6.99 CAD, iPad $13.99 CAD, Mac $59.99 CAD。但我试用期都还没过就干脆删掉了,因为它根本不能稳定同步。我现在五个大项之下一共只有四五十个账户,但是同步不能稳定连续 24 小时。除此之外还有频繁的崩溃。为了保证数据安全和完整,也为了省掉那八十刀的开销,我放弃了。

  • Debit & Credit 是一个界面让人想疯的 app,渐变色干啥呢?不能用颜色干点对人类有意义的事情吗。打开就删了。(他家的 Parcel App 还挺好用的,推荐给北美的朋友们。)

  • Money Pro,一个我之前 ¥1 买下一直没好好用的记账软件。对绝大多数人而言,Money Pro 的功能全,甚至还有未给付账单的追踪功能方便你看看谁还欠你钱、你还欠谁钱。但是这个 app 的导航、操作难道让人想摔手机,审美完全停留在 iOS 7 刚出来的时候—— aka 扁平和渐变色之外没有什么审美。

    但你要是觉得我会扔掉它那就大错特错了。我用了它整整两个月,虽然记东西复杂,但后来慢慢发现你可以对一个开销指定默认的账户(比如我外出就餐从来都是 Tangerine 的 Mastercard,而超市购物、app 购买等等从来都是 TD 的 Visa),还能根据历史记录给你建议今天可能产生的开销—— Good enough! 直到后来和男朋友出去玩。

    租车、订酒店、预购汽油的 credit 什么的这种事情,往往信用卡上一笔支出要连带着多个账户和开销类别。Money Pro 这时就崩溃了!它不能让你从一个资产账户开销时增加另一个资产账户,并同时增加一笔支出——和朋友出去一起吃饭、垫付饭金你要记两笔钱,一笔是从信用卡进入自己的开销,另一笔是从信用卡进入自己的应收账款资产账户,等朋友还钱再消掉。Money Pro 做!不!到!

  • Quicken——不能用手机记账,只能看自己的账户。要你何用?另外我也不想同步我的数据到 iCloud、Dropbox 之外的云上。

  • 任何 spreadsheet 表格类工具——太复杂了。我确实没想好有什么办法能够 set up 子账户、同一 transaction 多个 posting 这样的数据结构。如果你知道欢迎告诉我 LOL

  • Ledger CLI。十分极客的纯文本+命令行工具,始于 2003 年,现在还有一个稳定的社群。不能方便进行重复性的交易,有一些小 bug 但是都能克服。重复交易就干脆每年年初设置好这一年的东西,导入就好了。同步可以使用 Github,配合 iPhone 的 Working Copy 查看编辑数据。

最后决定在找到合适的图形界面 app 之前会先用 Ledger CLI 了。

Ledger CLI

Ledger CLI 是这两天刚开始用的工具,也是调研了一下发现可能就这样才能适合我的使用需求和习惯了—— Github 同步,纯文本记账,在家里可以用 Mac 跑各个账户的余额、按月开销和累积余额的报告确实不错。

还有一点令我很欣赏的是,Ledger 的操作思路很清晰——它不会动你的文件本身,你要自己选择文本编辑器记账并保存到文本文档中,Ledger 大部分时间只是读取你的账本,帮你生成报告和计算余额。

Hassle-free 的复式记账

和 Money Pro 那套严格的记账逻辑正好相反,纯文本背景的 Ledger 可以让你记账非常自由,比如刚刚那一套复杂的租车交易就可以非常简单的描述为——

2019-05-17 Hertz
    Expenses:Travel:Car Rental   $84.20 ; 自己的费用
    Asset:AR:IOU:PayerName       $84.20 ; 待人垫付的车费,计入应收账款
    Asset:AR:Deposit:Hertz      $200.00 ; 支付押金
    Asset:Prepaid Expenses      $106.00 ; 提前支付汽油费用,之后多退少补
    Liabilities:Credit Card     $474.40 ; 实际的信用卡额度消费

我用信用卡支付了自己的车费、给朋友垫付的车费、押金和预购的汽油钱。

还车的时候会产生油钱的费用(自付+垫付),结清押金和预付费用——

2019-05-20 Hertz
    Asset:AR:IOU:PayerName        $35.00 ; 待人垫付的油钱
    Asset:AR:Deposit:Hertz      -$200.00 ; 押金解冻
    Asset:Prepaid Expenses      -$106.00 ; 预付费项目被使用或被退还
    Expenses:Travel:Gas           $35.00 ; 自己负担的油钱部分
    Liabilities:Credit Card      $236.00 ; 实际的信用卡返还

最后朋友还钱了——

2019-05-20 Payment
    Asset:AR:IOU:PayerName      -$119.20 ; 这是他实际欠款数额,我们在此将其归零
    Asset:Checking               $120.00 ; 他凑了整,给我转了 120 
    Equity:Balance Adjustment
    	; 为了保证借贷相等,使用余额找平账户
    	; 也可以使用 Income:Gift 这个账户

清晰易读,通过复制粘贴来记账也很方便。

余额报告

使用 bal 命令生成余额报告,并且通过 ^Asset ^Liabilities 过滤只显示资产和负债开头的账户。

ledger -f filename.ledger bal ^Asset ^Liabilities

这一命令可能会打印出这样的余额:

$25,000  Asset
    $45    Cash
 $1,155    Checking
   $800    Deposits:Hertz
    $55    Receivable:Ted
$22,945    Tax-Free Savings
  -$720  Liabilities
  -$110    TD Visa Credit Card
  -$575    PC Mastercard
   -$35    Payable:Robin

使用这个命令可以查看资产和负债的当前余额。也可以加入 --collapse 参数合并所有的账目,直接看总资产/总负债的各个货币/商品余额。

流水报告

使用 reg 打印流水报告,比如:

ledger -f filename.ledger reg ^Asset:Checking

可以显示——

19-jan-12    Opening Balance          $1,920        $1,920
19-jan-12    Food                       -$20        $1,900
19-jan-13    Groceries                  -$45        $1,855
19-jan-15    Salaries deposited       $1,120        $2,975

摊销费用

Ledger 可以直接在一个账目中进行成本摊销,让你不会因为支付一些年费而激增某些月份的开销。比如温哥华这边的社区中心健身房三月付更便宜,我希望能够把费用体现在每个月的账单上,还能在我的流动性分析中体现出 “这笔钱已经花出去了” 这件事。那么可以这样——

2019-03-10 Community Centre
	Expenses:Gym				 $26.00
	Expenses:Gym				 $26.00 ; [=2019-04-10]
	Expenses:Gym				 $26.00 ; [=2019-05-10]
	Liabilities:TD Visa			-$78.00

相比于传统的、建立 Prepaid Expenses 账户的做法,这个还挺方便的。

我还没探索的更多功能

  • 追踪股票和资产

货币是一种商品,股票、基金、贵金属,还有外币等等都是不同的商品。能够追踪基金涨跌来知道自己的基金账户到底有多少钱是分红来的(分红要计入当年的纳税收入)、有多少钱是价格变动的资本利得(在抛售时把价差进入当年的纳税收入)。

  • 实验一个新的财务方案

Ledger 账本可以用多个文本文档管理,然后使用 include 将多个账本关联到一起。所以如果想尝试一个新的财务方案,比如申请一个新的房贷,或者准备从全职工作状态切出到自己的事业或者自由职业等等。新的账目可以无缝衔接到你已有的账本中,还能通过建立重复性项目的开销和预算来看看自己的 burn rate 是多少、流动性会不会有问题。如果有多个方案想要并排了解和比较,Ledger 也可以双开两份命令行或者复制为两个账本库,比重新设置一个图形界面的 app 的数据库要省事一万倍。

  • 使用拓展工具直接绘图

Ledger 的可拓展性和稳定的用户社群给它带来了很多有用的工具,包括 GNU 绘图之外的 R 开发包,可以直接生成图表。

目前还在探索 ledger-analytics… More on that later!

Let’s stay in touch!

Sign up for weekly updates on this blog. No spams — I promise.

Blog Posts Archive