写在前面:由于日常消费都是通过信用卡完成支付,对金钱实在是“没得概念”,只有在每个月还款日才会一拍脑袋感到懊悔!也是正好在玩儿OpenClaw,有在想怎么通过这玩意儿进行记账呢,于是便有了OpenClaw + Beancount的玩法。
1. Beancount是什么?
官方文档的说法是 Beancount 是一个强大的、基于 Python 的纯文本会计工具。
然而其实它就是一个纯文本文件,命名叫 main.beancount / main.bean 的文件,然后内容大概就长这样
beancount 文件模板
option "title" "My Ledger"
option "operating_currency" "USD"
; ===== 账户 =====
2026-01-01 open Assets:Cash
2026-01-01 open Assets:Bank
2026-01-01 open Expenses:Food
2026-01-01 open Income:Salary
2026-01-01 open Equity:Opening-Balances
; ===== 初始余额 =====
2026-01-01 * "Opening Balances"
Assets:Cash 100 USD
Assets:Bank 1000 USD
Equity:Opening-Balances
; ===== 示例交易 =====
2026-01-05 * "Salary"
Assets:Bank 2000 USD
Income:Salary
2026-01-06 * "Lunch"
Expenses:Food 15 USD
Assets:Cash
它的核心概念一共是五个
- Assets(资产): 你“拥有”的东西,比如 现金(Cash)、银行存款(Bank)、支付宝/微信余额、投资账户
- Liabilities(负债): 你“欠别人的钱”,比如 信用卡欠款、花呗 / 借呗、贷款(房贷、车贷)
- Income(收入): 钱“从哪里来”,比如 工资、奖金、利息、副业
- Expenses(支出): 钱“花到哪里去”,比如 吃饭、房租、交通、旅游
- Equity(权益): 用来“平账”的账户,本质是你的净资产来源,可以理解成用来对帐的,不太理解可以忽略,因为具体使用下来一般也不看它 ^-^
最核心的理念就是 整个账本中所有过账的总和等于零,也就是说
Assets(资产)+ Liabilities(负债)+ Income(收入)+ Expenses(支出)+ Equity(权益)= 0
(所以说 Equity 一般是用来平账的)
用一张AI画的图来看

到这里不理解 Equity 也没关系 后面会有具体的例子来解释展示它
但是这样记录只是纯文本,怎么做可视化呢? 通过Fava!
Fava 是一个出色的基于 Web 的界面,用于可视化你的账本。当你使用该平台时,你将直接与账本文件(例如,main.bean)的文本编辑器进行交互,并实时查看 Fava 生成的报告更新。Fava 将你编写的纯文本转换为交互式图表、财务报表和可过滤的交易列表,让你清楚地了解你的财务报告。
安装方式很简单,像安装Python的第三方库一样安装它,我习惯于用uv来管理Python的项目
uv add fava
然后运行它
uv run fava main.bean
然后你就可以得到一个Web页面



这里就先看个样子 后面会稍微解释一下每个字段
2. OpenClaw登场!
前面已经知道Beancount记账本质上就是在往一个纯文本文件里写内容,然后再通过Fava进行可视化展示。往一个文件里写内容 这不是正好是OpenClaw的基础能力吗!听懂自然语言 这不也是OpenClaw的基础能力吗!
那么 通过自然语言描述记账信息 → 往main.bean里写内容 → 可视化展示 一条龙!
我一般用它做两件事 一件事是记录日常开销 另一件事是更新每天的基金情况从而更新资产情况 对应两段简单的Prompt
Beancount 记账(自用的内容,需根据自身账户信息修改)
## Beancount 记账
> 老板使用 Beancount 记账,这是日常重要的任务之一。每次老板说「帮我记账」,立刻去操作,无需询问文件位置。
### 账本路径
- **主文件**:`/beancountbill/main.bean`
- 操作货币:CNY
### 负债账户
| 账户 | 说明 |
|------|------|
| `Liabilities:CreditCard:CMB:UnionPay` | 招商银行银联信用卡 |
| `Liabilities:CreditCard:BOCOM:Amex` | 交通银行运通信用卡 |
### 支出分类体系
| 账户 | 用途 |
|------|------|
| `Expenses:Init` | 初始状态(期初待还款) |
| `Expenses:Food` | 餐饮食材 |
| `Expenses:Utilities` | 自来水费、电费、通信费、燃气费 |
| `Expenses:Transport` | 交通出行|
| `Expenses:Shopping` | 购物消费(网购、实体店等) |
| `Expenses:Healthcare` | 医疗健康 |
| `Expenses:Entertainment` | 娱乐休闲 |
| `Expenses:Travel` | 旅游 |
| `Expenses:Uncategorized` | 暂未分类 |
### 收入账户体系
- `Income:Investment:PnL` — 投资盈亏
- `Income:Interest:Deposit` — 活期利息(支付宝/微信每月手动对账)
- `Income:Salary` — 工资账户
### 记账规则
- 老板说记账 → 直接操作,无需询问文件位置
- 根据描述自动匹配分类,无法判断时用 `Expenses:Uncategorized` 并提示
- 记账后列汇总表方便核对
- 工资条:实发进银行账户
基金净值更新
## 基金净值更新
> 老板说「帮我更新今天的基金」或类似表达,立刻更新,无需询问。
- 功能:从东方财富抓取7只基金最新净值,计算市值,并更新 beancount 中的每日 balance 断言
- 关键规则:**基金每次查出来只做更新,不插入一条新的交易记录**
- 最终执行逻辑:**从账本注释读取每只基金的份额,抓最新净值后,用 份额 × 净值 算出最新市值,直接覆盖 beancount 里基金账户当前金额;并把基金专属分录的日期同步改成最新净值日期**
- **不要追加 balance 断言,不要生成“市值调整”分录,不要在文件末尾再新增基金更新区块**;账本里基金金额只保留一处真值
- 基金名称:xxx
3. 简单案例解释
就拿前面的beancount 文件模板来对照解释。
2026-01-01 open Assets:Cash
2026-01-01 open Assets:Bank
2026-01-01 open Expenses:Food
2026-01-01 open Income:Salary
2026-01-01 open Equity:Opening-Balances
这里对应涉及到的元素就是Assets Expenses Income,Equity先不看,如果有像信用卡、花呗这种负债属性的,那就可以直接加
2026-01-01 open Liabilities:CreditCard:BOCOM:Amex CNY
2026-01-01 open Liabilities:HuaBei CNY
这相当于就是"账户"开户,以后所有的流水都是从这些"账户"里流转。

; ===== 初始余额 =====
2026-01-01 * "Opening Balances"
Assets:Cash 100 USD
Assets:Bank 1000 USD
Equity:Opening-Balances
在最开始使用时肯定有一个初始金额吧 ^-^,这个的意思就是直接往"Assets:Cash""Assets:Bank"账户中分别加入100和1000,因为这两笔是凭空产生出来的,因此需要用Equity:Opening-Balances来平账!
; ===== 示例交易 =====
2026-01-05 * "Salary"
Assets:Bank 2000 USD
Income:Salary
这个写法等价于
; ===== 示例交易 =====
2026-01-05 * "Salary"
Assets:Bank 2000 USD
Income:Salary -2000 USD
意思是你的工资是发到银行卡里,"Income:Salary"账户就是少了2000,"Assets:Bank"账户多了2000。相当于"Assets:Bank"才是你钱最终的归宿,"Income:Salary"只是记录了这2000是工资!
2026-01-06 * "Lunch"
Expenses:Food 15 USD
Assets:Cash
意思是你用了15现金吃了一顿午饭。"Assets:Cash"账户少了15,"Expenses:Food"账户多了15,代表这15是用来吃饭的!有没有有一点感觉,虽然是有点抽象,但是好像也有点道理 ^-^
这个时候来汇总一下
初始"Assets:Bank"账户是1000,发了2000工资,所以"Assets:Bank"账户现在是3000,"Income:Salary"是-2000
初始"Assets:Cash"账户是100,吃了15,所以"Assets:Cash"账户现在是85,"Expenses:Food"账户是15
分别对应


现在在回头来看 Equity。

Equity(权益): 用来“平账”的账户,本质是你的净资产来源。
初始金额时我们用"Equity:Opening-Balances"账户平了凭空出现的1100,"Equity:Earnings"账户正好是我们发的工资2000 - 吃了一顿饭15 = 1985。"Equity"账户的总额是3085 = 初始金额1100 + 工资2000 - 吃了一顿饭15。
大概就是这个样子了。
要是各位佬们有兴趣 还是可以去看看官方文档的。
实在懒得看 要AI帮忙看看也成 ^-^