为什么要写这篇博客?
个人财务管理的痛点
- 人力有穷
- 只靠记忆来保持收支状态的清醒,对我而言最后必定是习惯性超支。
- 对记忆中的数字没有直观感受(没有威慑力),况且记忆还不是那么可靠和持久的。
- 无法对收入支出进行有效统计,只能估计。
- 低效的工具
- 笔纸记录是最低效的,难以做各种有效统计
- 使用过手机 app 进行财务管理,但是最终都没有坚持下来,我认为这个锅不在我身上 (拖延症加懒惰只是一小部分原因),这些 app 太难用了!如果记录一条账目需要在 手机上进行5次以上的触屏操作,无论是谁都难以坚持下来。
- 很多工具的功能实在太多,可以说是过度设计,花里胡哨,但是它却没有做好最基础 的记账功能,甚至有些莫名其妙设计的功能使得记账并不那么顺畅。
就是你了,Ledger !
- 被安利了。搜索各大论题,发现很多了不起的人都推荐 Ledger 这个命令行财务管理工 具。
- 日常使用 Emacs 进行各类工作,ledger-mode + emacs + ledger 这个工具组合可以无 缝衔接进我的工作流中1。
- 确实体验到了 Emacs,orgmode 等开源工具带来的工作、生活上的便利,对开源软件 Ledger 和 Emacs 第三方包 ledger-mode 有信心
博客记录 Ledger 学习过程
- 现在 Ledger 的中文资料还是很少,添砖加瓦,造福他人。
- 学习过程中进行笔记记录,加强学习效果。
- 大脑相当于内存,笔记相当于硬盘,内存容量有限、昂贵、数据易失。
- 以前完成一项任务或者学习一门工具,目的性总是很强;现在想起来,解决事情的过程 往往比结果更重要。
Youtube Ledger 讲座学习总结
本文说是 A Brief Introduction to Ledger 其实是对两部 Youtube 上视频的知识点总 结,分别是:
两者内容有重叠,重叠的部分是 Ledger 的介绍内容,其中第一部讲得比较详细。 第二部在后面还简单介绍了 Emacs + ledger-mode 的使用。
Ledger 基础知识点归纳
Ledger 术语解释
- Ledger 的理论基础是 Double-entry accounting 复式簿记,每笔交易都至少记录在两个不同的账户当中。每 笔交易的结果至少被记录在一个借方和一个贷方的账户,且该笔交易的借贷双方总额相 等2。
- Account 账户,一个描述了某种东西数量的标签,即使这个数量是0,可以是钱包、银行 账户、信用卡、投资、信用卡流水、花销;对于个人财务管理,共有5类主要账户,且这 五类账户余额之和应为0:
- Debit, the deduction of value from account. 账户的扣除数量
- Credit, the addition of value to an account. 账户的增加数量
- Transaction
- A collection of credits and debits with a timestamp to describe when the transaction is effective.
- 使用账户扣除量、账户增加量和时间戳来描述交易,如果我从某人那买东西,那我的 账户就要扣款,卖方的账户就收款;如果我用我的银行存款账户还信用卡,那我的银 行账户就要扣款,信用卡账户就会收款。
- 一次交易可以有一次或多次扣款,收款也一样。
- 一次交易中收款和扣款必须平衡,即相加的值为0。
Ledger 交易记录
- 时间戳,最前面
- 交易对象
- 收款方账户及一个正数值,因为是收款,账目数字增加
- 付款方账户及一个负数值,因为是付款,账目数字减少
- 可选:注释
- 例子如下,可以看到一条交易是这样的,其中收款方和付款方的账户都是树状结构,树 叶以冒号分隔,冒号前面的账户是后面的父账户
例子6中收款项或付款项有一项是可以留白的,Ledger 会自动算出
1 2 3
2018/01/19 CommonPlace Coffee Expenses:Restaurants:Coffee 3.00 Assets:Cash:Wallet -3.00
Ledger 常用查询命令
ledger -f somefile.ledger balance
- -f 后需指定文件
- balance 表示本条命令查询 交易余额
- 最终得出的结果并不是五个主要账户的余额,而是包括所有嵌套账户,嵌套关系用缩 进表示
ledger -f somefile.ledger accounts
- accounts 表示本条命令查询 当前所有账户
- 最终得出的结果是当前指定文件内有记录的所有账户,包括嵌套账户。每个账户都是 完整的,即包括所有节点,所以不需要缩进来表示嵌套关系
- 常用在 Ledger 的非 strict mode 下,用来检查账户名是否有笔误7
ledger -f somefile.ledger payees
- payees 表示本条命令查询 所有交易对象
- 最终得出的结果式当前指定文件内有记录的所有交易对象
- 当然也可以用来查找笔误
ledger -f somefile.ledger register
- register 表示本条命令查询 当前所有交易记录
- 最终得出的结果式当前指定文件内有记录的所有交易,包括交易时间、交易对象、收 款账户、付款账户以及账户余额流水
Ledger 查询命令进阶
上述简单命令单独使用的结果只是展示了当前状态,并不是那么有用
- Cashflow 现金流
- 支出减去收入
- 正数表示花销支出大于收入
- 负数表示收入大于花销支出
ledger -f somefile.ledger balance ^Income ^Expenses
- Net worth 净值
- 资产减去负债
- 没什么好解释的,当然,净资产为负也没什么问题,大部分人有贷款要还,比如房贷
ledger -f somefile.ledger balance *Assets ^Liabilities
- 投资增值查询
- 比如使用人民币购买美元
ledger -f somefile.ledger --price-db somfile.pricedb bal -V --end 10/1
- –price-db 后需指定包含周期内美元汇率数据的文件
- bal 是 balance 的缩写,Ledger 可以识别
- -V 命令表示需要给出所有账户的当前价值
- –end 后指定日期,表示此报告引用此日期前的数据
Ledger 交易通货
- 什么货币都可以!
- 真实货币:美元,欧元,人民币……
- 虚拟货币:比特币,莱特币……
- 甚至可以用来做时间管理:时间(年 月 日 时 分)8
虚拟货币举例:
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 2 3 4
~ Monthly Expenses:Restaurants:Coffee 30.00 USD Expenses:Restaurants:Lunch 100.00 USD Assets
这样就可以表示我们打算在这个周期内,在特定的分类下的预算支出,所有支出从 Assets 扣除
ledger -f somefile.ledger --monthly register --add-budget -p june 2017
- june 2017 两边应加上双引号
- –monthly 表示以月为周期统计数据
- –add-budger 表示将表较真实交易记录和预算
- -p 指定一个时间段
- 输出报告中显示随着交易的进行,各项预算的剩余情况
- 高亮的数字表示由于相关交易,该项预算额还剩下多少
Ledger 使用过程的一些建议
- 建议将 Assets 这个账户分类,Cash 账户包括银行账户、钱包等一切方便提取的流动资 金;Investments 账户包含退休金账户、股票账户;Reimbursement 账户包括返现、飞 行点数(这个有点难以理解)
- 就算只有一张信用卡,也必须将此信用卡单独建立为 LIabilities:CreditCards 下的一 个账户。如果不为此建立账户只使用 Liabilities:CreditCard 这样的账户的话,将来 新增信用卡账户再来对 Ledger 文档进行修改的话非常麻烦
- 当前只使用一种货币的话,可以不用在文件中显式指出币种,如果某次交易涉及多种货 币,就必须明确币种9,币种最好使用三字母缩写,比如 CNY,容易识别
Emacs ledger-mode 简单使用
- “C-c C-a” 快捷键加入一条交易记录
- 在输入交易数额时不用担心对齐问题
- ledger-mode 提供了 ledger-mode-clean-buffer 函数来做文件全局对齐工作
- “C-c C-o C-r” 快捷键打开当前 ledger 文档的报告选项,可以输出对应的报告:
- prices
- bal
- reg
- payee
- account
- 在 Emacs 的 ninibuffer 处会显示该报告选项对应的命令行命令,可以改变这条命令 并按 Enter 来获得更特定的输出报告!
- 输入这些快捷键后可以自定义报告名与特定命令行命令绑定,以后就可以使用该定义 名输出不同的报告
- “C-c C-b” 快捷键将使用 Emacs calc-mode 来编辑数字
- 官方 github 上的 windows 编译版本3.1.1不能正常识别 windows 路径,可以正常 识别路径的2.6.1版本太旧了;网上有高手编译好的基于 windows 的3.0.3版本,可以正常 识别 windows 路径:Ledger Binaries Windows [return]
- 复式簿记 [return]
- Liabilities 账户中数值应该都为负数 [return]
- 在 Ledger 中无论何时,无论做什么,都和以上四类账户相关。 [return]
- 有这样一种情况,其余四个账户的某条记录由于疏忽导致总数出现问题,该错误影 响不大且查找错误成本太高的话,可以使用 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]
- 注意,账户和数值之间必须空两格,不然数值无法识别,会报错 [return]
- Ledger 的 Strict Mode 下要求显式创建账户,也就是说不可以在交易记录中随便 写一个账户,如果在非 Strict Mode 下工作,账户名容易出现笔误 [return]
- 关于时间管理,有兴趣的同学可以去观看第一部视频,该部分内容在视频46分43秒 处开始,本文主要关注财务管理,就不详细讨论了 [return]
- 那 Ledger 如何判断文件中没有明确指定币中的数字呢?这个是根据某种逻辑自动 识别?应该是这样 [return]