Ledger CLI

2019 年 5 月 23 日 • 12:00 AM

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

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

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

随便说说复式记账

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

Accounts as pools of water

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

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

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

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

最近用的软件和工具

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

最后决定在找到合适的图形界面 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!