纯文本记账真的超酷
摘要
作者讨论了他们在个人财务追踪方面的历程,并介绍了纯文本记账作为一种可靠的方法,使用纯文本文件和复式记账法,比传统的财务应用如Rocket Money和Origin更受青睐。
<p><a href="https://lobste.rs/s/i4lxyt/plain_text_accounting_is_pretty_cool">评论</a></p>
查看缓存全文
缓存时间:
2026/08/19 18:33
# 纯文本记账相当酷
来源:https://sumnerevans.com/posts/money/plain-text-accounting/
我喜欢非常虔诚地追踪自己的财务状况。我并不怎么做预算,只是极度执着地记录每一笔开销,并确保整体储蓄率足够高[1]。我最初使用 Mint(愿它安息),后来它停运了,便转向使用 Rocket Money(https://www.rocketmoney.com/)。最终我厌倦了它,因为它无法连接我的某些账户,于是有几年时间我一直在一个 git 仓库的 markdown 文件里手动记录财务[2]。去年,我开始使用 Origin(https://useorigin.com/),它相当不错。但最近,由于以下几个原因,我开始寻找新的解决方案:
1. Origin(与之前的 Rocket Money 和 Mint 一样)无法可靠地保持与我所有账户的连接。我认为连接时不时不可靠,比手动录入每一笔财务交易要烦人得多。
2. Origin 对已关闭账户的处理不太好(已注销的信用卡/银行账户/贷款)。
3. Origin 不允许我追踪总收入,并将工资中扣除的 401(k) 部分计入储蓄。作为一个有幸能存满 401(k) 额度的人,这确实影响了我每月储蓄率的计算。
4. Origin 订阅服务中包含的一项福利是免费报税。然而,它不支持我今年遇到的某个情况,因此我无法使用该服务,最终不得不为其他服务付费。
5. Origin 不断试图将一切都 AI 化。我尝试就各种财务情况向 AI 提问,但它最多给出一些相当显而易见、缺乏洞见的回复。我已经每月花 20 美元订阅 Claude,它实际上在帮助我解决过去一年遇到的一些奇怪财务状况方面更有用。
此外,出于学习目的,我想将个人财务转换为使用复式记账法。复式记账法如果你不熟悉的话(就像我开始这段旅程时那样)可能有点反直觉,但一旦习惯,它就非常直观了。我将在本文的后续部分假设你对复式记账法有基本的了解。
我短暂考虑过回到 markdown 文件,并使用 AI 来帮助我更好地自动化每月净资产计算(这是 markdown 文件方法中最烦人的部分)。我让 Claude 研究最佳实践,它提出了一个我甚至没听说过的选择:纯文本记账。
## 纯文本记账
纯文本记账(https://plaintextaccounting.org/)(PTA)是一个总称,指使用纯文本文件存储会计数据。这可能会变得乏味(正如我多年使用 markdown 文件所发现的),因此纯文本记账通常也与使用软件工具来修改和报告底层纯文本文件相关联。大多数纯文本记账程序的核心都是复式记账。
当然,因为是纯文本,你完全不需要使用任何工具,或者可以轻松创建自己的工具。你可以使用简单的文本编辑器来编辑源文件。你可以创建自定义程序来处理或报告你的财务数据。你甚至可以利用纯文本是 AI 原生这一事实,使用像 Claude Code 这样的工具来分析你的财务以获取洞察。
纯文本的另一个优势是你可以轻松地将文件存储在版本控制中。就我而言,我使用一个 git 仓库来存储我所有的财务数据。
经过进一步研究,我决定使用 hledger(https://hledger.org/)。它用 Haskell 编写,似乎得到了社区的良好支持,内置了导入交易 CSV 的工具,而且我喜欢它的日志文件格式。
在 hledger 中,你创建日志文件来记录日记账分录(交易),语法相当直观。以下是一个日记账分录示例:
```
2026-08-09 * XCEL ENERGY
liabilities:credit-cards:capitalone:venturex -$80.00 ; date:2026-08-10
expenses:home:utilities $80.00
```
第一行是交易日期,一个`*`表示该交易已过账,以及交易描述。随后的几行是构成该交易的分录。由于这是复式记账,分录的总和必须始终为零[3],hledger 在读取日志时会检查这一点。在这个例子中,我们从我的 VentureX 信用卡负债账户中取出钱,并应用于公用事业费用账户。
`hledger`程序解析文件,并允许你生成有用的报告,例如通过`balance`命令显示净资产明细,或通过`incomestatement`命令显示支出明细。每个命令都可以限定到某个日期范围,和/或显示随时间变化的趋势。
这就是 hledger 的精髓。当我转换到这个系统后,我发现了它能帮助处理的更多事情,其中一些我甚至不知道自己需要它!以下是一系列我喜欢这个系统的要点,按任意顺序排列。
## 多账户交易
交易可以涉及两个以上的账户。这对于追踪使用多种支付方式或混合多个费用类别的交易特别有帮助。最常见的情况是 Amazon 交易,我使用 Prime 奖励积分或礼品卡抵扣总额。以下是一个展示此情况的示例交易:
```
2026-08-10 * Amazon
expenses:home:decor $37.99 ; Shoe Bench
expenses:shopping:tech $5.99 ; USB Cables
expenses:taxes:sales $2.20
expenses:taxes:delivery-fee $0.31
assets:gift-cards:amazon -$17.59
income:rewards:amazon-prime -$6.29
liabilities:credit-cards:chase:amazon-prime -$22.61
```
在这笔交易中,我从 Amazon 购买了两件商品,属于两个不同的费用类别,并被收取了销售税和 Colorado Retail Delivery Fee(https://tax.colorado.gov/retail-delivery-fee)。我用我的 Amazon 礼品卡余额、信用卡奖励以及我的 Amazon 信用卡组合支付。
## 商品 + 价格信息
资产和交易可以以股票和货币单位来追踪,同时还能进行美元计价的价值计算。事实上,在 hledger 中,`$`没有什么特别之处;它只是在日志中与其他商品一起声明的一种商品(尽管有特殊的语法):
```
commodity $0.00
commodity 0.000 VOO ; Vanguard S&P 500 ETF
```
然后可以直接交易这些商品:
```
2026-08-03 * YOU BOUGHT VANGUARD INDEX FUNDS S&P 500 ETF USD (VOO) (Cash)
assets:retirement:ira:roth:fidelity -$10,450.65
assets:retirement:ira:roth:fidelity:VOO 15.000 VOO @@ $10,450.65
```
`@@`语法允许你指定这 15 股 VOO 的总成本基础[4]。
但除非知道其美元计价的市场价值,否则 15 VOO 并没有太大帮助。hledger 通过提供为商品附加来自货币汇率或市场价值的价格信息来解决这个问题。我可以添加`P`(价格)指令来追踪 VOO 相对于美元的价格。
```
; ...
P 2026-08-12 VOO $710.1699829101562
P 2026-08-13 VOO $714.9500122070312
P 2026-08-14 VOO $713.6099853515625
; ...
```
所有 hledger 命令都允许你以基础商品或这些商品的价值来进行报告。
## 多文件日志
根据你财务状况的复杂程度,可能有很多账户和商品需要追踪。幸运的是,你可以将日志拆分为单独的文件,并`include`额外的日志文件。我为每个账户创建了一个日志文件,这样我可以在单个文件中查看单个账户的历史记录,这使得日常维护变得容易。
然而,这种组织结构带来了一个挑战:与账户间转账相关的交易(信用卡还款、银行转账等)应该放入哪个账户文件?这就是下一个特性(我甚至不知道自己需要)的用武之地。
## 转账追踪
过去我在追踪财务时遇到的最大问题之一是追踪资金如何在我的账户之间流动。通常,银行转账可能需要数天才能结算,我想清楚地知道资金何时离开一家银行,何时到达另一家银行。解决方案是使用一个`equity:transfers`账户来代表过渡中的资产。(出于某些对我而言仍不完全理解的原因,像这样的暂记账户在复式记账法中属于“权益”。我被告知这只是惯例。)例如,当我支付 CapitalOne 信用卡账单时,资金从我的支票账户转出以偿还我的负债:
在支票账户日志文件中:
```
2026-08-14 * DIRECT DEBIT CAPITAL ONE CRCARDPMT (Cash)
assets:cash:fidelity:checking -$1,226.98
equity:transfers $1,226.98
```
在信用卡日志文件中:
```
2026-08-14 * CAPITAL ONE AUTOPAY PYMT
liabilities:credit-cards:capitalone:venturex $1,226.98
equity:transfers $-1,226.98
```
这使得两个日志文件都能保持线性历史记录,各自看起来像我从这些账户收到的对账单,同时保持一切平衡。
这一点更多是复式记账法的特性,而非 hledger 的特性,但拥有自动化工具使得这种会计严谨度变得可以承受。
## 可报销费用追踪
转账并不是唯一一个中间账户有用的地方。另一个例子是追踪可报销的费用。我为我在 Can/Am(https://sumnerevans.com/portfolio/#experience-canam-tech-lead)的工作创建了一个应收账款(https://en.wikipedia.org/wiki/Accounts_receivable)账户用于费用报销:`assets:accounts-receivable:expense-reimbursement:canam`。这个账户代表我为工作相关费用垫付的金额。它属于资产,因为它代表了我被欠的钱。使用这个账户可以让工作费用永远不会以费用的形式出现在我的账簿中。让我用一个例子来演示:
当我使用个人信用卡支付拜访客户的差旅费时,它不会作为`expenses:travel`的交易出现,而是变成一项资产(未来的收入):
```
2025-06-23 * COT*FLT ; DEN <-> CLT
liabilities:credit-cards:capitalone:venturex $-619.17 ; date:2025-06-24
assets:accounts-receivable:expense-reimbursement:canam $619.17
; ... 其他差旅费用
```
然后,在未来的某个时间,在我提交费用报告并获得差旅费报销后,该资产转换为我支票账户中的现金:
```
2025-07-10 * DIRECT DEPOSIT CAN-AM TECH VENDOR (Cash)
assets:cash:fidelity:checking $1,288.24
assets:accounts-receivable:expense-reimbursement:canam $-1,288.24
```
以前,使用其他系统时,我会将可报销的费用记录为“差旅”费用,而报销则作为该类别的负费用记录。这种方法有两个主要问题,而这个系统解决了它们:
1. **跨月报销看起来很奇怪。** 在一个月里,我会有大量的正“差旅”费用,而下个月则会有代表退款的大额负“差旅”费用。
2. **报销涵盖了多个费用类别。** 费用是记录在“机票”、“住宿”和“餐饮”等子类别下的,但报销是单一金额。这意味着我必须按子类别拆分报销,或者只能接受费用和后续报销只在顶层类别中抵消的事实。我发现最简单的做法是选择后者,但这相当令人不满意。
现在,记录了真实的资本流出(因此我仍然追踪信用卡上的每一笔交易),但它不是一项“费用”。相反,它立即成为一项资产,最终将转换为银行账户中的现金。
## 余额校验
hledger 允许你通过余额校验(https://hledger.org/1.52/hledger.html#balance-assertions)来指定账户的预期余额。例如,如果我知道在朋友报销餐费后,我的 Venmo 余额应该是 $82,那么我可以添加一个余额校验,如下所示:
```
2026-07-06 * Chicken Tikka masala
assets:cash:venmo $32.00 = $82.00 ; 断言最终账户余额为 $82
expenses:food:restaurants $-32.00
```
如果通过重放所有交易计算出的余额与校验的余额不同,hledger 会显示差异:
```
$ hledger check
hledger: Error: /path/to/venmo.journal:10:40
| 2026-07-06 * Chicken Tikka masala
10 | assets:cash:venmo $32.00 = $82
| ^^^^^
| expenses:food:restaurants $-32.00
Balance assertion failed in assets:cash:venmo
In commodity $ at this point, excluding subaccounts, ignoring costs,
the asserted balance is: $82
but the calculated balance is: $95.43
(difference: $-13.43)
To troubleshoot, check this account's running balance with assertions disabled, eg:
hledger reg -I 'assets:cash:venmo$' cur:'$'
```
你甚至可以在没有任何资金流动的交易中进行余额校验。例如,如果你收到银行的月末对账单,你可以记录余额校验:
```
2026-07-31 * End-of-Month Balances Based on Account Statements
assets:cash:checking 0 = $1,927.79
assets:cash:savings 0 = $10,000.00
```
或者,如果你遇到余额与实际不符的情况,并且不想找出错误发生在哪里,你可以使用余额校验来修正未来的金额:
```
2026-07-31 * End-of-Month Balance Corrections
asets:cash:checking =$1,930.00
asets:cash:savings =$10,000.00
equity:unaccounted ; 任何差异都将归于此账户
```
在此示例中,由于余额校验行省略了金额,因此金额被推断为计算金额与校验金额之间的差额。然后,`equity:unaccounted`行用于吸收这些校验中产生的任何差异。
## 其他不错的功能
以下是一些不错的功能
相似文章
Hacker News Top
作者是一名注册会计师,他认为 GnuCash 提供了正确的复式记账功能,但日常使用过于繁琐。他构建了 K-Id,一款面向 Windows 的本地优先桌面应用,在保持复式记账严谨性的同时降低了使用门槛,以一次性购买方式销售。
X AI KOLs Following
作者分享自己使用Hermes+Beancount+飞书的记账方案,通过DeepSeek模型以自然语言记账,数据校验可靠且成本极低,并能与飞书文档联动。
Hacker News Top
# Show HN: Stoke Money — 基于现金流预测的个人理财应用
---
**Stoke Money** 是一款围绕**现金流预测**而非传统预算方式构建的个人理财应用。
## 核心特点
- **自动检测经常性交易**:智能识别你的定期收入与支出,无需手动录入每笔交易。
- **逐日推演账户余额**:基于收入与固定支出,预测未来每一天的账户余额走势,让你清楚地看到资金变化趋势。
- **以现金流为核心**:不同于传统的预算分类方式,Stoke Money 聚焦于你的钱在什么时间流入和流出,帮助你更好地规划未来。
## Pro 版功能
- **MCP 集成**:Pro 版支持通过 **MCP(Model Context Protocol)** 连接 Claude、ChatGPT 等 AI 助手。
- **自然语言查询与管理**:你可以直接用自然语言询问自己的财务状况,或让 AI 助手帮助你管理财务数据。
## 为什么选择 Stoke Money?
传统的预算应用通常让你在事后记录支出并分类。Stoke Money 换了一个思路——**向前看**。通过预测你的现金流,你可以提前了解账户何时会趋紧,从而做出更明智的财务决策。
---
> 如果你对基于现金流的理财方式感兴趣,或者想用 AI 助手来管理个人财务,欢迎试用 Stoke Money!
Hacker News Top
一篇博客文章,论证纯文本凭借其简单性、可移植性、人类可读性,以及与 grep、sed 和 awk 等数十年历史的 Unix 工具链的无缝集成,仍然是计算领域中最持久、最值得信赖的技术之一。
Lobsters Hottest
本文探讨了由于智能手机和LLM等技术转变导致纯文本文件使用量下降的问题,认为这可能使纯文本编辑生态系统受到侵蚀,因为软件开发者正日益依赖基于LLM的工作流程。