为什么要写这篇博客?

个人财务管理的痛点

  1. 人力有穷
    • 只靠记忆来保持收支状态的清醒,对我而言最后必定是习惯性超支。
    • 对记忆中的数字没有直观感受(没有威慑力),况且记忆还不是那么可靠和持久的。
    • 无法对收入支出进行有效统计,只能估计。
  2. 低效的工具
    • 笔纸记录是最低效的,难以做各种有效统计
    • 使用过手机 app 进行财务管理,但是最终都没有坚持下来,我认为这个锅不在我身上 (拖延症加懒惰只是一小部分原因),这些 app 太难用了!如果记录一条账目需要在 手机上进行5次以上的触屏操作,无论是谁都难以坚持下来。
    • 很多工具的功能实在太多,可以说是过度设计,花里胡哨,但是它却没有做好最基础 的记账功能,甚至有些莫名其妙设计的功能使得记账并不那么顺畅。

就是你了,Ledger !

  1. 被安利了。搜索各大论题,发现很多了不起的人都推荐 Ledger 这个命令行财务管理工 具。
  2. 日常使用 Emacs 进行各类工作,ledger-mode + emacs + ledger 这个工具组合可以无 缝衔接进我的工作流中1
  3. 确实体验到了 Emacs,orgmode 等开源工具带来的工作、生活上的便利,对开源软件 Ledger 和 Emacs 第三方包 ledger-mode 有信心

博客记录 Ledger 学习过程

  1. 现在 Ledger 的中文资料还是很少,添砖加瓦,造福他人。
  2. 学习过程中进行笔记记录,加强学习效果。
  3. 大脑相当于内存,笔记相当于硬盘,内存容量有限、昂贵、数据易失。
  4. 以前完成一项任务或者学习一门工具,目的性总是很强;现在想起来,解决事情的过程 往往比结果更重要。

Youtube Ledger 讲座学习总结

本文说是 A Brief Introduction to Ledger 其实是对两部 Youtube 上视频的知识点总 结,分别是:

两者内容有重叠,重叠的部分是 Ledger 的介绍内容,其中第一部讲得比较详细。 第二部在后面还简单介绍了 Emacs + ledger-mode 的使用。

Ledger 基础知识点归纳

Ledger 术语解释

  1. Ledger 的理论基础是 Double-entry accounting 复式簿记,每笔交易都至少记录在两个不同的账户当中。每 笔交易的结果至少被记录在一个借方和一个贷方的账户,且该笔交易的借贷双方总额相 等2
  2. Account 账户,一个描述了某种东西数量的标签,即使这个数量是0,可以是钱包、银行 账户、信用卡、投资、信用卡流水、花销;对于个人财务管理,共有5类主要账户,且这 五类账户余额之和应为0:
    • Assets 资产:银行账户,钱包,投资,别人欠你的钱
    • Income 收入:工资,收到的礼物,分红,利息
    • Expenses 花销:杂物,税,送出的礼物,捐款
    • Liabilities3 亏空:房贷,信用卡,学生贷款,欠款4
    • Equity:For everything else, there’s Equity, 可以是初期余额,返现,并不是 收入(Income),可以是并不需要交税的东西5
  3. Debit, the deduction of value from account. 账户的扣除数量
  4. Credit, the addition of value to an account. 账户的增加数量
  5. Transaction
    • A collection of credits and debits with a timestamp to describe when the transaction is effective.
    • 使用账户扣除量、账户增加量和时间戳来描述交易,如果我从某人那买东西,那我的 账户就要扣款,卖方的账户就收款;如果我用我的银行存款账户还信用卡,那我的银 行账户就要扣款,信用卡账户就会收款。
    • 一次交易可以有一次或多次扣款,收款也一样。
    • 一次交易中收款和扣款必须平衡,即相加的值为0。

Ledger 交易记录

  1. 时间戳,最前面
  2. 交易对象
  3. 收款方账户及一个正数值,因为是收款,账目数字增加
  4. 付款方账户及一个负数值,因为是付款,账目数字减少
  5. 可选:注释
  6. 例子如下,可以看到一条交易是这样的,其中收款方和付款方的账户都是树状结构,树 叶以冒号分隔,冒号前面的账户是后面的父账户
  7. 例子6中收款项或付款项有一项是可以留白的,Ledger 会自动算出

    1
    2
    3
    
    2018/01/19 CommonPlace Coffee
        Expenses:Restaurants:Coffee  3.00
        Assets:Cash:Wallet  -3.00

Ledger 常用查询命令

  1. ledger -f somefile.ledger balance
    • -f 后需指定文件
    • balance 表示本条命令查询 交易余额
    • 最终得出的结果并不是五个主要账户的余额,而是包括所有嵌套账户,嵌套关系用缩 进表示
  2. ledger -f somefile.ledger accounts
    • accounts 表示本条命令查询 当前所有账户
    • 最终得出的结果是当前指定文件内有记录的所有账户,包括嵌套账户。每个账户都是 完整的,即包括所有节点,所以不需要缩进来表示嵌套关系
    • 常用在 Ledger 的非 strict mode 下,用来检查账户名是否有笔误7
  3. ledger -f somefile.ledger payees
    • payees 表示本条命令查询 所有交易对象
    • 最终得出的结果式当前指定文件内有记录的所有交易对象
    • 当然也可以用来查找笔误
  4. ledger -f somefile.ledger register
    • register 表示本条命令查询 当前所有交易记录
    • 最终得出的结果式当前指定文件内有记录的所有交易,包括交易时间、交易对象、收 款账户、付款账户以及账户余额流水

Ledger 查询命令进阶

上述简单命令单独使用的结果只是展示了当前状态,并不是那么有用

  1. Cashflow 现金流
    • 支出减去收入
    • 正数表示花销支出大于收入
    • 负数表示收入大于花销支出
    • ledger -f somefile.ledger balance ^Income ^Expenses
  2. Net worth 净值
    • 资产减去负债
    • 没什么好解释的,当然,净资产为负也没什么问题,大部分人有贷款要还,比如房贷
    • ledger -f somefile.ledger balance *Assets ^Liabilities
  3. 投资增值查询
    • 比如使用人民币购买美元
    • ledger -f somefile.ledger --price-db somfile.pricedb bal -V --end 10/1
    • –price-db 后需指定包含周期内美元汇率数据的文件
    • bal 是 balance 的缩写,Ledger 可以识别
    • -V 命令表示需要给出所有账户的当前价值
    • –end 后指定日期,表示此报告引用此日期前的数据

Ledger 交易通货

  1. 什么货币都可以!
    • 真实货币:美元,欧元,人民币……
    • 虚拟货币:比特币,莱特币……
    • 甚至可以用来做时间管理:时间(年 月 日 时 分)8
  2. 虚拟货币举例:

    1
    2
    3
    
    2018/01/20 Vanguard
      Assets:Cash:Bank:Checking  -1000 USD
      Assets:Investments:Vanguard:RothIRA  8.03534 VTI @ 124.45 USD

    ’@’ 后是当前汇率

Ledger 做预算

  1. 将周期性的预算块放置于文件的开头

    1
    2
    3
    4
    
    ~ Monthly
        Expenses:Restaurants:Coffee  30.00 USD
        Expenses:Restaurants:Lunch  100.00 USD
        Assets

    这样就可以表示我们打算在这个周期内,在特定的分类下的预算支出,所有支出从 Assets 扣除

  2. ledger -f somefile.ledger --monthly register --add-budget -p june 2017

    • june 2017 两边应加上双引号
    • –monthly 表示以月为周期统计数据
    • –add-budger 表示将表较真实交易记录和预算
    • -p 指定一个时间段
    • 输出报告中显示随着交易的进行,各项预算的剩余情况
    • 高亮的数字表示由于相关交易,该项预算额还剩下多少

Ledger 使用过程的一些建议

  1. 建议将 Assets 这个账户分类,Cash 账户包括银行账户、钱包等一切方便提取的流动资 金;Investments 账户包含退休金账户、股票账户;Reimbursement 账户包括返现、飞 行点数(这个有点难以理解)
  2. 就算只有一张信用卡,也必须将此信用卡单独建立为 LIabilities:CreditCards 下的一 个账户。如果不为此建立账户只使用 Liabilities:CreditCard 这样的账户的话,将来 新增信用卡账户再来对 Ledger 文档进行修改的话非常麻烦
  3. 当前只使用一种货币的话,可以不用在文件中显式指出币种,如果某次交易涉及多种货 币,就必须明确币种9,币种最好使用三字母缩写,比如 CNY,容易识别

Emacs ledger-mode 简单使用

  1. “C-c C-a” 快捷键加入一条交易记录
    • 在输入交易数额时不用担心对齐问题
    • ledger-mode 提供了 ledger-mode-clean-buffer 函数来做文件全局对齐工作
  2. “C-c C-o C-r” 快捷键打开当前 ledger 文档的报告选项,可以输出对应的报告:
    • prices
    • bal
    • reg
    • payee
    • account
    • 在 Emacs 的 ninibuffer 处会显示该报告选项对应的命令行命令,可以改变这条命令 并按 Enter 来获得更特定的输出报告!
    • 输入这些快捷键后可以自定义报告名与特定命令行命令绑定,以后就可以使用该定义 名输出不同的报告
  3. “C-c C-b” 快捷键将使用 Emacs calc-mode 来编辑数字

  1. 官方 github 上的 windows 编译版本3.1.1不能正常识别 windows 路径,可以正常 识别路径的2.6.1版本太旧了;网上有高手编译好的基于 windows 的3.0.3版本,可以正常 识别 windows 路径:Ledger Binaries Windows [return]
  2. 复式簿记 [return]
  3. Liabilities 账户中数值应该都为负数 [return]
  4. 在 Ledger 中无论何时,无论做什么,都和以上四类账户相关。 [return]
  5. 有这样一种情况,其余四个账户的某条记录由于疏忽导致总数出现问题,该错误影 响不大且查找错误成本太高的话,可以使用 Equity 账户来配平总数。不过这个账户的概念 确实难以理解,官方文档的解释是: > But what is equity? You may have heard of equity when people talked about house > mortgages, as “the part of the house that you own”. Basically, equity is like > the value of something. If you own a car worth $5000, then you have $5000 in > equity in that car. In order to turn that car (a commodity) into a cash flow, or > a credit to your bank account, you will have to debit the equity by selling it. > > When you start a ledger, you are probably already worth something. Your net > worth is your current equity. By transferring the money in the ledger from your > equity to your bank accounts, you are crediting the ledger account based on your > prior equity. That is why, when you look at the balance report, you will see a > large negative number for Equity that never changes: Because that is what you > were worth (what you debited from yourself in order to start the ledger) before > the money started moving around. If the total positive value of your assets is > greater than the absolute value of your starting equity, it means you are making > money. [return]
  6. 注意,账户和数值之间必须空两格,不然数值无法识别,会报错 [return]
  7. Ledger 的 Strict Mode 下要求显式创建账户,也就是说不可以在交易记录中随便 写一个账户,如果在非 Strict Mode 下工作,账户名容易出现笔误 [return]
  8. 关于时间管理,有兴趣的同学可以去观看第一部视频,该部分内容在视频46分43秒 处开始,本文主要关注财务管理,就不详细讨论了 [return]
  9. 那 Ledger 如何判断文件中没有明确指定币中的数字呢?这个是根据某种逻辑自动 识别?应该是这样 [return]