返回案例库

精选案例 · 数据处理与可视化 / Agent 自动化

Beancount 平行预算插件 — parallel_budget

作者: elliot98

一款由 AI(DeepSeek-v4-flash + OpenClaw Agent)全程生成的 Beancount 预算管理插件。采用平行记账(复式分录)方式,自动在交易末尾追加 Equity:Budget:* 账户脚注,不修改原始流水,预算余额可直接在 Fava 资产负债表查看。…

案例速读

README 完整解释了平行记账的核心思路(三组复式分录:支出、预算消耗、余额扣减),并给出了具体用法示例和 AI 生成过程。该插件解决了 Beancount 内置 budget 在 Fava 中不直观的问题,且完全由 AI 从零生成,是展示 AI 赋能复式记账工具的优秀案例。 建议从 「Beancount 平行预算插件 — parallel_budget」、「背景」、「核心思路」、「什么是平行记账?」 进入正文,先确认真实任务和模型辅助过程。

  • 重点看 平行记账的设计模式可复用于其他需要额外核算的场景、AI 生成完整插件的流程(需求→代码→文档→示例)可参考、CLI 报表和 Fava Dashboard 配置可直接套用。结合 数据处理与可视化 / Agent 自动化 / beancount / plugin 和「Beancount用户、复式记账爱好者、需要直观预算视图的用户」,它更适合作为任务检索后的精读材料。
  • 正文目录和原始材料仍然是判断依据;导读只帮助你更快定位阅读重点。
首读入口
背景
读者
Beancount用户、复式记账爱好者、需要直观预算视图的用户
复用
平行记账的设计模式可复用于其他需要额外核算的场景
结构
10 个目录入口

原文内容

Beancount 平行预算插件 — parallel_budget

Type图片暂时无法显示:Type AI图片暂时无法显示:AI

用 AI 词元生成的 Beancount 预算管理插件,采用「平行记账」思路,不使用内置 budget directive。

背景

Beancount 内置的 budget 机制需要配合 bean-query 按特定语法查询,不够直观,也无法在 Fava 的资产负债表上直接看到预算执行情况。于是我用 AI(DeepSeek-v4-flash + OpenClaw Agent)全程生成了这个插件。

核心思路

什么是平行记账?

传统的预算跟踪方式往往需要修改原始交易——比如给支出加标签、分类目、或者单独记一笔预算消耗。这不仅容易破坏原始账目的干净性,还让后续审计变得麻烦。

平行记账的思路是:不动原始交易,额外增加一套"影子"账目。

你的支出还是那笔支出(Expenses:Food:Grocery 不变),但插件会自动在交易末尾追加两条脚注:

                          Assets:CreditCard:Demo  -120.50 USD    ← 原始支出不动
  Equity:Budget:Expenses:Food    120.50 USD    ← 新增:记录预算消耗
  Equity:Budget:Balance:Food    -120.50 USD    ← 新增:扣减预算余额

这三条脚注形成一组完整的复式分录,所有预算信息都沉淀在 Equity:Budget:* 账户里,不影响你原有的资产负债结构。

为什么用复式记账做预算?

传统的预算工具(如 YNAB 或 Excel 表格)通常是"单式"的——只看花了多少、还剩多少。而 Beancount 是复式记账,每一笔都有来有去。

parallel_budget 把预算也做成复式的:

账户 作用
Equity:Budget:Expenses:{name} 累计该预算下的实际支出(借方)
Equity:Budget:Balance:{name} 预算余额(贷方),周期初=预算额,周期末=剩余
Equity:Budget:Income:{name} 预算投入(贷方),周期初调整时使用

每一笔支出触发:

Expenses:Food:Grocery      +120.50     ← 你花钱了
Equity:Budget:Expenses:Food +120.50    ← 平行标记:这笔算 Food 预算
Equity:Budget:Balance:Food  -120.50    ← 平行标记:Food 余额减少

每周期初触发一次调整:

Equity:Budget:Income:Food   +X.XX     ← 预算投入
Equity:Budget:Balance:Food  +X.XX     ← 余额增加到预算金额

关键细节:调整金额 X.XX 不是硬塞预算额,而是补差值——如果上期还剩 1847.50,本期预算 2000,只补 152.50。不会因为跨期重复充值。

这样做的好处

  • 原始账本零污染 — 你的收支流水还是原来的样子,预算数据独立在 Equity:Budget:*
  • Fava 直接可见 — 在 Fava 资产负债表里展开 Equity:Budget 就能看到每个预算的余额,无需额外报表
  • 可审计 — 每一分钱怎么来的、怎么花的一清二楚,符合复式记账的完整链条
  • 零冲突 — 不与 Beancount 内置 budget directive 冲突,可以同时使用

用法示例

2026-01-01 custom "parallel_budget" "Food"       "monthly"  2000 USD
2026-01-01 custom "parallel_budget" "Renovation"  "once"    20000 USD

支出会自动匹配前缀并标记平行账脚注。

配套工具

  • Fava Dashboarddashboards.yaml 提供预算执行面板
  • CLI 报表report.py 终端表格输出预算状态
  • 示例账本examples/ 下可直接 make run 运行

AI 参与

本插件的所有代码、文档和示例均由 OpenClaw + DeepSeek-v4-flash 生成。具体过程:

  1. 需求描述 — 用户用自然语言描述"想要一个平行记账的 Beancount 预算插件"
  2. 代码生成 — AI 理解复式记账原理,生成插件核心逻辑(交易标记、周期调整、余额计算)
  3. 迭代优化 — 多轮对话中修复了:跨周期余额累计问题、一次性预算的特殊处理、前缀匹配逻辑
  4. 文档与仪表板 — AI 自动生成 README、Fava dashboard 配置、CLI 报表脚本
  5. 示例账本 — 生成可运行的示例帮助快速上手

从零到完整可用的 Beancount 插件,全程未手写一行代码。

链接

  • GitHub:https://github.com/ertuil/beancount_parallel_budget
  • 镜像:https://git.elliot98.top/elliot/beancount_parallel_budget

返回顶部