跳转到主要内容

Beancount和Fava如何驱动实时仪表盘

Beancount和Fava将纯文本账簿转化为实时仪表盘:可查询的余额、图表和实时财务分析。

介绍​

Beancount 是一个开源复式记账系统,使用纯文本文件作为账本。它强调简洁、透明和灵活地追踪财务。Fava 是 Beancount 的一个强大网页前端,提供交互式界面,用于查看报表、可视化和管理你的账本。在本报告中,我们探讨 Beancount 和 Fava 的核心能力,以及如何用这些工具实现实时或近实时的财务分析。我们会涵盖自动化与数据刷新的配置技巧、Fava 的可视化功能(即时现金流视图和趋势发现)、与外部仪表盘(Grafana、Metabase 等)的集成、自定义仪表盘和插件的示例、在个人和小型企业财务中的用例、与其他平台(Power BI、QuickBooks)的对比,以及使用 Fava+Beancount 进行数据驱动洞察的优缺点。

探索一个实时示例账本:

在新标签页中打开 示例账本

beancount.io 上的加密货币投资组合仪表盘,追踪比特币、以太坊和 Solana 余额,并配有净资产图表

探索实时账本 →

Beancount 和 Fava 的核心功能​

Beancount(纯文本记账引擎)​

  • 纯文本复式账本: Beancount 将交易存储在单个 .beancount 文本文件中(或者多个文件一起包含)。每笔交易必须在各账户之间平衡(借方合计 = 贷方合计),从而强制保证会计完整性。纯文本格式意味着你的数据可读、可版本控制,且不被任何供应商锁定。
  • 灵活的分层账户: 你可以在层级中定义任意账户(例如 Assets:Bank:Checking、Expenses:Food:Coffee)。Beancount 对你的会计科目表没有强加偏好,因此它适用于个人财务、小型企业账目、投资等——它_“很灵活:适用于个人财务、小型企业记账、加密货币、股票投资等。”_
  • 多币种和多商品: Beancount 原生支持多种货币和商品(例如股票、加密货币)。你可以用不同货币记录交易、定义汇率(价格指令),并追踪成本基础。如果有价格数据,它还能生成“按成本”或“按市值”的报表。这使它适合投资组合和国际财务。
  • 自动化检查与平衡: 系统支持余额断言(你可以声明某账户在某日期的余额_应该_是多少,如果不匹配 Beancount 会报错)以及用于结账的余额交易。它还支持权益期初/期末分录以及用于期间结账的留存收益计算。这些有助于确保你的账目保持一致并尽早发现错误。
  • 强大的查询与报表引擎: Beancount 附带查询语言 BQL(Beancount 查询语言)。在终端中使用 bea query 运行 BQL,使用 bea report 生成标准报表;请安装 CLI 快速入门,而不是较旧的上游控制台脚本。你可以查询账本以生成自定义报表(例如按收款人列出支出、某期间的现金流)——本质上把账本当作数据库。即使有数千笔交易,它依然很快。用 bea query -f csv -o report.csv "BQL" 导出 CSV,将 BQL 替换为你的查询。完整示例见财务报告模板。
  • 通过插件扩展: Beancount 用 Python 编写,允许自定义插件来扩展其功能。插件可以在处理文件时强制执行额外的规则或计算。(例如,有些插件用于处理税务批次,或确保没有购买记录缺少成本。)插件系统和 Python API 让高级用户能够编写自定义行为,或将 Beancount 与其他系统集成。
  • 外部数据导入器: 一个关键的实用功能是独立 beangulp 包中的导入器框架(Beancount 3.2.3 中没有 beancount.ingest 模块)。你编写一个导入器类,继承 beangulp.Importer 并实现 identify、extract 和 account。它解析下载的文件(CSV、OFX、PDF 对账单等)并将其转换为 Beancount 分录。这对自动化至关重要(稍后详述)。
  • 可审计且对版本控制友好: 因为是纯文本,你可以把账本保存在 Git 或其他版本控制中。每次变更都是透明的,你有完整的编辑历史。这让审计或审查变更变得简单直接(许多用户把每天的变更提交到 Git 仓库,提供一份防篡改的所有财务分录日志)。这种透明度水平是它与封闭记账软件的主要区别——“没有 SaaS 锁定——只有干净、透明的记账和强大的报表。”

Fava(Beancount 的网页界面)​

  • 交互式网页 UI: Fava 提供一个本地网页服务器,将你的 Beancount 账本渲染成丰富的 UI。它在浏览器中显示核心报表(利润表、资产负债表等)、账户明细和日记账,并配有交互式控件。相比命令行,UI 是动态且用户友好的。你只需运行简单的 fava yourfile.beancount,就能为你的账目得到一个网页应用。
  • 内置图形和图表: Fava 生成图形来帮助可视化你的数据。例如,它包含随时间的净资产折线图、每月收入与支出的柱状图,以及支出构成的饼图/树状图。这些可视化会随你的数据更新,并支持不同视图(例如投资的“按成本”与“按市值”)。我们稍后会详细探讨这些可视化功能。
  • 筛选和搜索: Fava 页面顶部有一个筛选栏,让你实时切分和组合数据。你可以按时间(例如年、季度、月)、账户正则表达式、收款人、摘要或标签/链接筛选。这让_实时数据检查_变得容易——例如,快速筛选“Tag=Travel”和“Year=2025”,查看 2025 年所有旅行支出及其合计。该界面支持通过这个筛选栏或 Query 页面(你可以直接执行 BQL 查询)进行复杂查询。
  • 多文件支持与合并: Fava 可以一次加载多个 Beancount 文件(如果你拆分账本会很有用),并在它们之间切换。它还可以在需要时合并它们(例如同时查看个人和企业账本)。
  • 数据录入与编辑: 独特的是,Fava 并非只读——它有一个编辑器和交易录入表单。你可以通过网页表单添加新交易(它会把分录插入你的 .beancount 文件)。你还可以从 Fava 在外部编辑器中打开源文件。Fava 还支持面向高级用户的键盘快捷键。这把 Fava 变成了一个轻量记账系统,你可以在同一界面输入和查看数据。
  • 报表和账户下钻: Fava 提供标准会计报表:利润表(损益)、资产负债表、试算平衡表,以及投资的持仓列表。资产负债表和利润表是交互式的——你可以点击账户下钻到其明细,或在资产按成本与按市值视图之间切换。如果你有价格数据,Fava 还会显示投资的“未实现收益”。它会生成所有分录的日记账视图,并允许按各种条件筛选该日记账(非常适合查找特定交易)。
  • 文档管理: 如果你附上收据或对账单,Fava 能帮你整理。Beancount 有文档文件夹的概念,Fava 允许你把文件拖放到账户或交易上——它会存储文件并在账本中添加一条文档分录。这对于把支持性文档与账本数据关联起来很有用。
  • 通过扩展自定义: Fava 可以用(Python 编写的)插件扩展,以添加新报表或功能。有些扩展是内置的(例如用于投资的portfolio list报表)。我们稍后会讨论自定义扩展,但本质上 Fava 的设计允许通过其扩展 API 注入新页面,甚至自定义 JavaScript。这意味着如果某个分析或仪表盘不是内置的,高级用户可以自己添加。
  • 性能: Fava 很高效——它在内存中重新加载数据并快速提供页面。底层的 Beancount 解析很快,所以典型的个人账本一两秒就能加载。实践中,Fava 能处理多年的个人账本,尽管超大文件(数万笔交易)可能受益于一些优化(例如归档旧分录)。
  • 网页访问与移动性: 通过在服务器甚至你的笔记本上运行 Fava,你可以从任何浏览器访问你的财务数据。有些用户在私有服务器或树莓派上托管 Fava,以便随时查看财务(可能会加上密码或 VPN 保护,因为 Fava 没有内置认证)。这本质上为你提供了一个自托管的财务“网页应用”,而不把数据交给第三方。

总而言之,Beancount 为透明、基于文本的记账提供了坚实的基础,具备严格的复式规则和多币种支持。Fava 在此基础上提供了一个易用的界面,带有即时洞察(报表、图表)和与数据交互的能力。两者共同构成一个高度灵活的记账和分析系统,由你端到端地掌控。

使用 Beancount & Fava 实时(或近实时)分析​

用 Beancount 和 Fava 实现实时或近实时分析,需要自动化数据流入账本的过程,并确保工具显示最新信息。默认情况下,Beancount 是一个批处理过程(你把分录添加到文件,然后查看报表),Fava 会检测变更并要求刷新。不过,只要配置得当,你可以简化更新流程,让新交易和变更几乎即时出现。

文件变更检测: Fava 监视账本文件的变化。如果你在编辑器中编辑 .beancount 文件(或包含的文件),页面会显示“检测到文件变更。点击重新加载。”的通知。Fava 轮询它的 get_changed 端点。当监视器报告变更时,Fava 在服务器端重新加载账本,通知提供一键刷新视图。实践中,这种重载非常快(典型账本通常不到一秒)。这意味着_如果_你的账本文件被频繁更新,Fava 就能充当实时仪表盘。默认情况下它会等待你点击,以免干扰你的视图。

持续导入/更新管道: 要获得实时数据,你需要自动化向 Beancount 文件添加交易。有几种常见策略:

  • 定时导入任务(Cron): 许多用户设置 cron 任务(或计划任务)定期(比如每晚或每小时)从金融机构获取新交易并追加到账本。例如,你可以对最新的银行下载文件(CSV 或 OFX)运行 beangulp 导入器。一位 Beancount 用户构建了自动化管道,让账目自行更新:“看着我的账簿在开放格式中自行更新,而我无需触碰,给我带来纯粹的喜悦”。这是通过连接银行 API 并安排定期更新实现的。一个使用银行 API(例如 Plaid)的自定义 Python 脚本可以按计划运行,把新分录写入账本。每次运行后用 bea check 验证,再让它接触你的主文件。每次定时导入后,如果你有 Fava 在运行,只需刷新 Fava 就能看到新数据。

  • 文件监视器和触发器: 除了基于时间的计划,你还可以用文件监视器对事件作出反应。例如,如果你的银行能每天给你发对账单邮件,或者你把 CSV 放进某个文件夹,脚本可以检测到该文件(在 Linux 上用 inotify 或类似工具)并立即运行导入程序,然后通知 Fava 重新加载。虽然 Fava 尚不支持向浏览器推送实时重载,但至少数据会更新,这样你下次查看页面或点击重新加载时,它就是最新的。一些社区项目走得更远:对于 ledger(Beancount 的近亲),有用户创建了一个小型服务器,把 ledger 数据实时暴露给 Grafana,表明对 Beancount 也可以采取类似方法——本质上构建一个持续向你的仪表盘喂数据的守护进程。

  • 直接 API 集成: 高级用户可能不经过文件,而是直接连接银行 API(如 Plaid 或区域性的开放银行 API)以频繁拉取交易。有动力的人可以编写循环中的“实时”导入(配合适当的速率限制)——有效地每隔几分钟向银行轮询新数据。没有什么能阻止你_“注册 Plaid API 并在本地做同样的[自动化]”_。每笔新交易到达时都可以追加到 Beancount 文件。用这种方法,Fava 真正成为你账户的实时仪表盘,媲美商业应用中的最新动态流。

Fava 中的数据刷新: 一旦你的数据被更新,让 Fava 显示它就很简单:浏览器刷新(F5)或点击重新加载通知,就会加载最新的账本状态。注意 fava --debug 不会把账本变更推送到浏览器。它的帮助文本是“开启调试”。它为 Fava 自身的代码运行 Werkzeug 调试器和代码重载器,并设置 Jinja 模板自动重载。那是在扩展开发期间重新加载服务器代码和页面模板。它与检测账本变更的文件监视器无关。或者,如果你在构建自定义前端,可以让它轮询 Fava 的 get_changed 端点,并在报告有新数据时刷新。

即时计算: Beancount 的快速解析意味着即使你每隔几分钟更新账本文件,从数据获取 → 文件更新 → Fava 重载的往返也很快。例如,一位用户指出,编辑文件后重新加载 Fava“几乎察觉不到……肯定不到一秒”,对于大小合理的账本而言。因此,你可以让一个 Fava 窗口保持打开并定期刷新,来模拟实时仪表盘。(要获得真正实时的体验,可以编写一个小脚本自动刷新浏览器,或使用浏览器每隔 N 秒刷新的功能。)

对账和警报: 要信任实时数据,你还需要频繁对账余额。Beancount 通过余额断言和_“最新”_指示器让这变得容易。事实上,当 open 指令带有 fava-uptodate-indication 元数据时,Fava 会将账户标为绿色、黄色或红色。颜色反映最近的余额检查是否覆盖了账户的最新分录。这可以用来快速查看账本中的账户余额是否与银行最新对账单匹配。在近实时设置中,你可以自动化每日余额检查(这样每天早上,账本中都有银行提供的每个账户昨日收盘余额)。Fava 的指示器随后会告诉你自动导入是否遗漏了什么,或者是否存在差异,从而让你对看到的“实时”数据准确无误充满信心。

自动化示例: 假设你想要每日现金流更新。你可以设置一个 cron 任务,每晚 3 点运行:它执行一个 Python 脚本,使用你的银行 API 获取最后一天的交易,写入 import_today.beancount,然后把该文件追加到你的主账本。它还会写入一条日终余额断言。当你醒来时,打开 Fava——它显示截至昨天的所有交易,你能看到当月收入/支出的更新。如果你白天有一笔支出,可以手动添加(例如通过手机上 Fava 的新交易表单),或等夜间导入。这种混合方法(大部分自动,加上手动添加临时项的能力)给出接近实时的画面。另一种方法是让 Fava 的日记账页面保持打开并当作流水账使用:当你消费时,快速记录交易(就像记支票簿)——那_你_就是实时数据流。这更手动,但有些用户喜欢它带来的觉察感。要真正无手动步骤的_流式_更新,你需要投入脚本编写,并可能使用前面讨论的第三方 API。

总之,通过把 Beancount 的导入自动化与 Fava 的快速刷新结合起来,你可以获得近实时的财务数据。要达到像 QuickBooks 那样(自动拉取银行数据流)的实时数据流,可能不是“一键轻松”的,但它确实可能——而且重要的是,你保留了整个过程的完全控制和透明度。正如一位纯文本记账倡导者所说,前期的一点努力可以换来一个自动化系统,它_“比商业解决方案好得多,而且更加灵活和可扩展”_。在下一节,我们会看到 Fava 的可视化能力如何让你立即理解这些最新数据,把原始交易转化为洞察。

托管估值的管理价格​

实时价格为托管的 Beancount.io 账本提供受支持的估值报价。加载器会在五分钟刷新窗口后加载账本时检查新数据;提供商的观测值可能更旧。这不是流式推送。

这里描述的 Fava 控件属于 Fava。添加托管包含项不会把这些控件加到托管查看器,也不会把成本视图变成市值视图。上游 Fava 需要本地价格文件。兼容的 bea 版本可以导出它们;兼容性见设置指南。

Fava的可视化功能(现金流、趋势、实时检查)​

(GitHub - beancount/fava: Fava - Beancount 的网页界面)Fava 的利润表报表(在网页 UI 中)支持丰富的可视化,如树状图(如图)和旭日图,让你快速洞察收入和支出的构成。在这张树状图中,每个矩形代表一个支出类别,按其金额大小显示——你可以一眼看出房租(大的绿色块)在支出中占主导地位。顶部的筛选栏和控件(右上角)允许更改货币、图表类型和时间段(例如查看月度数据)。Fava 还提供折线图(例如随时间的净资产)和柱状图(例如每月收入与支出),帮助你发现财务数据中的趋势。

Fava 最大的优势之一,是即时把账本数据变成可视化、交互式的报表。账本一加载,Fava 就生成图表,让你一眼看懂现金流和趋势:

  • 收入和支出树状图/旭日图: 在利润表页面,Fava 可以把你的收入和支出显示为_树状图_或_旭日图_。这些非常适合“一眼看清”的现金流可视化。例如,如果你的月度支出以树状图显示,每个矩形的面积对应每个支出类别的量级。大块立即显示你的大部分钱去了哪里(例如房租或按揭、税费等),而较小的块显示次要支出。这对于_发现支出趋势_极为有用——如果“外出就餐”块每个月都在增长,你会从视觉上注意到。你可以切换到旭日图查看分层明细(例如外环可能显示食品类别下的子类别,如杂货与餐厅)。这些图表会按你筛选的任何期间(一个月、年初至今等)更新,为你提供该期间的即时现金流可视化。一位纯文本记账论坛用户指出:“我大量使用收入和支出树状图。它们让我对我们的财务动态有很好的视觉感受。”——这种即时理解正是 Fava 图表的目标。

  • 随时间的净资产和余额: Fava 提供随时间的净资产折线图(在“资产负债表”或“统计”页面)。该图绘制每个时间点(按日、周或月)你的资产减负债之和。它对趋势发现非常宝贵——你可以看到财务的轨迹(例如稳步上升,或在某些时候下跌)。如果你有投资,可以在按成本与按市值显示之间切换(如果记录了价格数据)——例如,你可能会看到按市值的净资产随股价波动,而按成本则更平滑。Fava 还能显示账户余额随时间的变化。如果你点击一个账户(比如 Assets:Bank:Checking),账户页面会显示该账户余额历史的图表。你可以立即检查你的现金账户如何变动——这实际上就是现金流图(余额线的斜率表示净现金流)。如果它呈下降趋势,你就知道在该期间你花的比赚的多。通过检查这些趋势,你可能会发现诸如“每年 12 月我的储蓄下降(假期支出)”或“本季度我的投资大幅增长”这样的模式。

  • 用于周期性对比的柱状图: 在利润表视图中,Fava 有“月度利润”“月度收入”“月度支出”等标签页。选择这些会按月显示柱状图。例如,月度净利润会把每个月的盈余/赤字显示为柱,便于跨月比较表现。你可以快速识别异常值(例如 4 月的一根大负柱意味着那个月有不寻常的亏损/支出)。同样,“月度支出”柱状图按月堆叠或分组显示各类别的支出,让你看出哪些类别在波动。这对于跨时间发现趋势很有用——例如,你可能会注意到“旅行”支出每年夏天激增,或“水电费”在冬天更高。Fava 本质上给了你一些预算应用的能力(追踪趋势),但完全可自定义(因为你定义类别及其汇总方式)。

  • 实时筛选和数据检查: Fava 中的可视化不是静态的;它们与 Fava 的筛选协同工作。假设你想检查某个特定场景:“只看我的企业账户,季度现金流如何?”你可以把时间筛选设为 2025 年第一季度,把账户筛选为你的 Business 层级——Fava 会立即更新图表,显示净收入、支出树状图等,但只针对那个子集。这种交互式切分意味着你可以非常快速地进行临时分析,而不必编写查询。日记账视图也支持实时筛选:你可以按收款人或摘要子串搜索,并立即看到筛选后的交易列表。如果你在看实时数据(比如你刚导入了上周的交易),你可以按 #uncategorized 这样的标签筛选,查看可能需要分类的新交易;或按 @pending(如果你标记待处理分录)查看哪些尚未结清。这种实时检查能力也有助于确保数据质量——因为你可以即时隔离并处理异常。

  • 现金流量表(间接): 虽然 Beancount/Fava 开箱即用不生成正式的现金流量表(经营/投资/筹资分类),但你可以用自定义查询或通过组织账户结构来模拟。例如,你可以给某些交易打标签,或为投资和筹资使用特定账户,然后查询合计。Fava 的查询界面运行 BQL,例如 SELECT sum(position) WHERE account ~ 'Assets:Bank:Checking'。它返回图表背后的支票余额。下面的实例展示了完整的往返过程。话虽如此,大多数个人用户发现余额趋势与收入/支出图表的组合已足够理解现金流。

  • 持仓和投资组合可视化: 在持仓页面,Fava 列出你当前持有的商品(例如股票、债券、加密货币),包含数量、成本、市值和未实现收益。虽然这是表格而非图表,但它对实时检查投资组合状态非常有用。一些社区扩展(如稍后讨论的 fava-investor)为投资组合添加更多可视化,例如配置饼图或表现图。即使没有扩展,你也能看到例如你的股票组合价值随最新价格变化——如果你定期更新报价(可以每日自动化),Fava 的图表会反映最新可得的带日期价格,这些价格可能比你打开报表时更旧。

例子演示:两个月的支出​

这个示例在 Beancount 3.2.3 与 beanquery 0.2.0 上端到端运行。把账本保存为 example.beancount。它包含两笔工资和四笔支出。

option "title" "Analytics example"
option "operating_currency" "USD"
 
2024-01-01 open Assets:Bank:Checking USD
2024-01-01 open Expenses:Food:Groceries USD
2024-01-01 open Expenses:Food:Dining USD
2024-01-01 open Expenses:Housing:Rent USD
2024-01-01 open Income:Salary USD
2024-01-01 open Equity:Opening-Balances USD
 
2024-01-05 * "Employer" "January salary"
  Income:Salary  -3000.00 USD
  Assets:Bank:Checking  3000.00 USD
 
2024-01-08 * "Grocery Store" "Weekly groceries"
  Expenses:Food:Groceries  120.00 USD
  Assets:Bank:Checking  -120.00 USD
 
2024-01-12 * "Restaurant" "Dinner out"
  Expenses:Food:Dining  80.00 USD
  Assets:Bank:Checking  -80.00 USD
 
2024-02-01 * "Landlord" "February rent"
  Expenses:Housing:Rent  1000.00 USD
  Assets:Bank:Checking  -1000.00 USD
 
2024-02-05 * "Employer" "February salary"
  Income:Salary  -3000.00 USD
  Assets:Bank:Checking  3000.00 USD
 
2024-02-10 * "Grocery Store" "Weekly groceries"
  Expenses:Food:Groceries  150.00 USD
  Assets:Bank:Checking  -150.00 USD

先检查它。然后运行按类别统计支出的查询。

bea --file example.beancount check
bea --file example.beancount query "SELECT account, sum(position) WHERE account ~ 'Expenses' GROUP BY account ORDER BY account"

干净的账本从 bea check 退出码为 0;错误会以非零退出码列出。查询为每个支出账户返回一行。

        account          sum(position)
-----------------------  ------------
Expenses:Food:Dining        80.00 USD
Expenses:Food:Groceries    270.00 USD
Expenses:Housing:Rent     1000.00 USD

再两个查询就补全了全貌。总收入与总支出:

SELECT sum(position) WHERE account ~ 'Income'
SELECT sum(position) WHERE account ~ 'Expenses'

它们返回 (-6000.00 USD) 和 (1350.00 USD)。所以这个家庭赚了 6,000.00 USD,花了 1,350.00 USD,储蓄率达 77.5%。支票余额证实了这一点:

SELECT sum(position) WHERE account ~ 'Assets:Bank:Checking'

它返回 (4650.00 USD)。同样的查询在 Fava 的 Query 页面中不加改动即可运行。Fava 1.30.16 把同样的三行支出渲染成交互式表格。

实践中,Fava 的可视化报表更新速度与底层数据一样快。新交易一添加、页面一重新加载,图表就重新计算。不需要漫长的重新处理。这意味着如果你有一条半自动的管道全天喂入数据,你可以让 Fava 保持打开并定期点击刷新以获得更新后的图表——有效地进行_实时财务监控_。

例如,假设你经营一家小型企业,想监控手头现金和每日支出。你可以让 Fava 打开到一个自定义仪表盘(也许使用扩展或查询屏幕),显示“今日现金账户余额”和“支出——今日对比昨日”。每次有新数据进来后刷新,你都会看到这些数字更新。这类似于昂贵的实时仪表盘所提供的,但用的是开源工具。区别在于你可能需要手动刷新或安排刷新,而那些工具会自动推送更新。但功能上,你得到的洞察是一样的,还有一个额外好处:你可以下钻 Fava 上的任何数字(点击它查看底层交易)——这是许多 BI 仪表盘缺少的。

总之,Fava 把你的会计数据变成即时的视觉洞察:现金流构成、趋势线、跨时间对比和交互式筛选都帮助你看到数字背后的故事。无论你是在检查上周支出中的异常,还是在审查多年的净资产趋势,Fava 的图表和报表都能实时(只要数据到位)提供清晰度。接下来,我们会看看如果你需要更多自定义分析,如何扩展这些能力或将它们与外部工具集成。

与外部仪表板和可视化工具的集成​

虽然 Fava 提供了丰富的内置报表和图表,但你可能想把 Beancount 的数据与其他商业智能(BI)或仪表盘工具集成,例如 Grafana、Metabase,或自定义网页前端(例如 React 应用)。动机可能是把财务数据与其他数据源结合、使用高级图表能力,或以不同格式与他人共享仪表盘。得益于 Beancount 的开放性,有多种方法实现集成:

  • 数据库集成(BeanSQL / Beanpost): 一个直接的方法是导出或同步你的 Beancount 账本到 SQL 数据库。一旦进入 SQL,任何 BI 工具都能查询数据。事实上,社区成员已经为此创建了工具。例如,Beanpost 是一个实验,把 Beancount 账本镜像到 PostgreSQL 数据库,将 Beancount 的大部分逻辑实现为 SQL 函数。这提供了一个_“灵活的后端,可以与其他工具(如网页应用或报表系统)集成。”_ 你可以运行 Beanpost 持续把文本账本同步到 Postgres。然后,Metabase 或 Tableau 这样的工具可以连接到那个 Postgres 数据库,你可以构建任何你喜欢的图表或仪表盘(随数据库更新而实时更新)。一位用户报告使用 Postgres + PostGraphile 自动为账本数据暴露 GraphQL API,然后在其上编写自定义 React 前端——本质上把账本当作网页服务。这种方法解决了 Fava 界面可能不够的情况(例如多用户访问,或更移动友好的 UI)。它更偏工程,但显示了潜力:你可以相对容易地把 Beancount 与现代网页技术栈集成。更轻量的变体是把查询结果导出到 SQLite——运行 bea --file ledger.beancount query "SELECT ..." 打印一个表格,你可以粘贴或通过管道传递,而 CLI 的电子表格 CSV 还有待 bea query 的原生导出选项。有些人用 SQLite 作为中间层,接入 Metabase 这样的工具(它可以通过连接读取 SQLite 文件)。

  • Grafana(时间序列仪表盘): Grafana 在监控和时间序列数据方面很流行。随时间变化的财务数据(支出、余额)可以当作时间序列。社区曾讨论把 Beancount 连接到 Grafana。一个想法是做一个 Grafana 数据源插件,能对 Beancount 文件实时运行 BQL 查询。这将允许 Grafana 面板直接显示,比如“支票账户余额”作为仪表,或“过去 30 天支出”作为图形,通过查询账本实现。截至目前(2025 年),还没有专门的插件发布,但爱好者们已经构建了临时方案。例如,Reddit 用户 aquilax 构建了一个简单服务器,把 Ledger CLI 数据提供给 Grafana,并作为 grafana-ledger-datasource-server 分享。类似概念可以应用于 Beancount:你用 Python 写一个小型 HTTP 服务器,加载 Beancount 账本(用 Beancount 的 API 查询数据)并暴露返回 JSON 数据帧的端点供 Grafana 使用。Grafana 有一个通用 JSON 数据源插件,可以从这个 API 拉取数据。实践中,这意味着你可以设计一个 Grafana 仪表盘,面板如“月度收入(柱状图)”或“每日现金余额(折线图)”,这些面板从你的 Beancount 驱动 API 获取数据。Grafana 会提供丰富的可视化选项(标注、阈值、与服务器指标结合等)。Andreas Gerstmayr(Fava 的维护者之一)正是建议了这种方法,甚至提到他创建了一个名为 fava-dashboards 的 Fava 扩展(下面详述)来从 BQL 查询渲染图表,作为完整 Grafana 设置的替代。如果你更喜欢 Grafana 的 UI,集成是可行的——只需构建数据桥梁。

  • Metabase(临时查询和仪表盘): Metabase 是一个用户友好的 BI 工具,让你无需代码就能运行查询和制作仪表盘。如果你把账本导出为关系格式(通过 Beanpost 或写出交易、过账等表格),你可以让 Metabase 指向那个数据库。你可以从账本创建自定义表,如 expenses (date, category, amount),然后在 Metabase 中轻松生成图表(例如上个月按类别支出的饼图)。好处是非技术用户(或同事)随后可以通过 Metabase 的 GUI 与数据交互,而无需接触 Beancount 文件。缺点是你要维护导出/同步。有些用户自动化每晚把 Beancount 账本转换为 SQLite,然后让 Metabase 读取 SQLite;其他人可能用前面提到的 Postgres 方法。关键在于 Beancount 的数据可移植性使这成为可能——你可以自由地把数据复制成外部工具需要的任何形式。

  • 自定义前端/应用: 如果你有特定需求,你总是可以在 Beancount 之上编写自定义应用。Beancount 的 Python 库让你访问所有解析后的分录、余额等,因此可以用 Python 网页框架(Flask、Django、FastAPI)构建定制应用。例如,一家小型企业可能构建一个仪表盘,通过查询账本并可能与非账本数据(如服务的客户数量)结合,显示 KPI 指标(如毛利率、每日销售额等)。一位社区成员构建了一个移动友好的网页 UI,因为 Fava 对他们的配偶来说不够直观——他们利用数据库中的账本驱动这个自定义 UI。如果你更喜欢 JavaScript/TypeScript,你可以用工具把账本转换成 JSON 再构建。Fava 本身通过 JSON 查询 API 暴露其 Query 页面,所以自定义前端可以向它发送 BQL 并渲染返回的表格,而不必构建新的查询后端。

  • Excel/PowerBI 集成: 值得注意的是,你甚至可以与 Excel 或 PowerBI 集成。在 bea query 获得原生 CSV 导出之前,使用 Fava 的 Query 页面导出 Excel 可直接打开的电子表格文件。一个工作流可以是:每晚任务从 Beancount 生成关键财务数据的 CSV 文件,PowerBI 设置为导入该文件。这有点间接,但对于已经大量使用 Excel/PowerBI 的组织来说,这是一个低摩擦的集成。PowerBI 也支持 Python 数据源,所以可以写一个简短的 Python 脚本运行 BQL 查询,并把它作为 PowerBI 中的数据源,实现直接连接。

案例研究——Grafana 集成想法: Josh,一位 Beancount 用户,在邮件列表上询问把 Beancount 指标推送到 Prometheus 并在 Grafana 中查看。核心开发者回应说,与其在 Prometheus 中重复数据,更好的方法是做一个 Grafana 插件或服务,直接查询 Beancount 账本。Andreas 分享了他的 fava-dashboards 扩展,它在 Fava 自身内部渲染自定义图表,作为一个示例解决方案。要点是:你有选择——要么通过现有 BI 基础设施(Prometheus+Grafana 或 SQL+Metabase)集成,要么扩展 Fava 来满足你的需求(下一节会深入探讨)。

安全和多用户考虑: 如果集成到外部工具,注意数据敏感性。Beancount 的纯文本通常包含私人财务信息,所以任何暴露它的服务器都应加安全保护(认证)。如果你把数据移到云 BI 工具,可能会失去一些隐私。自托管工具(Grafana/Metabase 开源版)可以在本地运行以减轻这一点。另外,如果多人需要查看仪表盘,外部只读仪表盘可能比给每个人 Fava 访问权(不小心的话他们可以编辑数据)更可取。例如,一家初创公司可以在内部使用 Beancount,但用 Metabase 让部门负责人查看支出与预算的对比,而不接触账本文件。

总之,Beancount 和 Fava 与其他工具配合良好。只要一点胶水代码,你就能利用整个数据工具生态:把账本数据推送到 SQL 数据库供 BI 工具使用、通过 API 提供给网页应用,甚至用专门的库把它流式传输到时间序列系统。这种灵活性意味着,如果 Fava 的内置可视化不能满足某个小众需求,你永远不会被困住——你总是可以集成到另一个平台,同时继续把 Beancount 作为你的真相来源。接下来,我们会看看用插件和自定义仪表盘扩展 Fava 本身,如果你只需要几个额外功能,这通常比外部集成更容易。

自定义仪表盘和使用插件扩展 Fava(代码示例)​

Fava 被设计为可扩展的:你可以用 Python 编写 **Fava 插件(扩展)**来添加新页面、图表和行为。这让你无需构建整个独立应用就能定制网页界面。我们将探讨两条关键定制途径:(1) 使用或编写 Fava 扩展,(2) 通过 fava-dashboards 这样的社区插件设置自定义仪表盘。

Fava 扩展(自定义插件)​

一个 Fava 扩展本质上是一个 Python 模块,定义了 fava.ext.FavaExtensionBase 的子类。Fava 启动时,可以加载这个模块并把它集成到应用中。扩展可以注册新的报表页面、挂钩事件,甚至包含自定义 JavaScript 以实现交互。Fava 1.30.16 内置两个:fava.ext.auto_commit 和 fava.ext.portfolio_list。其他的可以通过 pip 安装或从头编写。

要启用扩展,你在账本文件中使用 Beancount 自定义指令:

2010-01-01 custom "fava-extension" "my_extension_module" "{'option': 'value'}"

这告诉 Fava 加载给定的模块。如果你通过 pip 安装了扩展,就在这里引用它的模块名。末尾的可选字符串是扩展的配置。Fava 把它解析为 Python 字面量,所以 "{'option': 'value'}" 会以 dict 形式传入。

示例——自动提交扩展: 内置的 fava.ext.auto_commit 在你通过 Fava 编辑文件时把变更提交到 git。如果你想使用它,添加:

2025-01-01 custom "fava-extension" "fava.ext.auto_commit"

它覆盖 after_write_source、after_insert_entry、after_entry_modified、after_delete_entry 和 after_insert_metadata。每个钩子都在账本文件自己的目录中运行一次 git commit。所以账本必须已经位于 git 检出中。它展示了扩展如何挂钩 Fava 的编辑事件。

示例——投资组合列表扩展: 内置的 fava.ext.portfolio_list 添加一个列出你投资账户的页面。它设置 report_title = "Portfolio List" 并附带一个模板。Fava 检测到后,在 Reports 下添加一个新的侧边栏条目“Portfolio List”。它还设置 has_js_module = True 来加载配套的 JavaScript。要显式启用它,添加:

2025-01-01 custom "fava-extension" "fava.ext.portfolio_list"

(这种情况下无需配置。)

编写自定义扩展: 假设你想要一个自定义报表页面,比如发票的“应收账龄”。你可以创建一个文件 receivables.py,像这样:

# receivables.py
from fava.ext import FavaExtensionBase
 
 
class ReceivablesReport(FavaExtensionBase):
    report_title = "Receivables Aging"
 
    def after_load_file(self):
        # Runs after Fava loads the ledger. Summarise open
        # invoices here so the template only renders.
        self.overdue = [
            txn for txn in self.ledger.all_entries
            if "invoice" in getattr(txn, "tags", set())
        ]

你还要在模块旁边创建一个 templates/ReceivablesReport.html 来定义页面的 HTML。在那个模板中,你可以读取钩子准备好的 self.overdue 等属性。这个扩展写好后,你在账本中添加:

2025-01-01 custom "fava-extension" "receivables"

(假设 receivables.py 在 Beancount 文件目录或 PYTHONPATH 中,Fava 能按名称找到它。)启动 Fava 后,你现在会看到一个“Receivables Aging”页面。

底层上,Fava 在固定点调用你扩展的方法。Fava 1.30.16 中可用的钩子是 after_load_file、before_request、after_entry_modified、after_insert_entry、after_delete_entry、after_insert_metadata 和 after_write_source。用 @extension_endpoint 装饰的方法还会成为扩展下的 JSON API 端点。通常提供的钩子加上一个模板就足够了。

Fava 文档指出扩展系统仍在演进,但它可用。事实上,许多高级功能都是作为扩展原型开发的。

使用 fava-dashboards 创建自定义仪表盘(社区扩展)​

与其从头编写扩展,你也许可以使用由一位 Fava 维护者创建的第三方 fava-dashboards 插件。这个扩展允许你通过 YAML 配置文件定义任意仪表盘,混合文本、表格和图表,由 BQL 查询驱动。它本质上是一种在 Fava 中创建包含多个自定义面板的新“页面”的方法。

安装和设置: 首先,你安装该包(例如 pip install fava-dashboards)。2.0.2 版在 Fava 1.30.16 旁边能干净加载。然后在你的 Beancount 文件中,用一条指向你的仪表盘配置的自定义指令激活它。例如:

2010-01-01 custom "fava-extension" "fava_dashboards" "{ 'config': '/path/to/dashboards.yaml' }"

(fava-dashboards/README.md at main · andreasgerstmayr/fava-dashboards · GitHub)。这告诉 Fava 加载 fava_dashboards 模块并读取你的 YAML 文件作为配置。

仪表盘 YAML 格式: 在 dashboards.yaml 中,你定义一个或多个仪表盘及其面板。有两条规则来自扩展自己的管道。聚合列需要一个 AS 别名。而且 BQL 符号约定适用:收入合计为负,支出为正。例如:

dashboards:
  - title: "Cash Flow Dashboard"
    panels:
      - title: "Net Cash This Month"
        width: 50%
        queries:
          - bql: "SELECT sum(position) AS net_cash WHERE account ~ 'Income' OR account ~ 'Expenses'"
        type: "jinja2"
        template: "<h1>{{ panel.queries[0].result[0][0] }}</h1>"
      - title: "Spending by Category"
        width: 50%
        queries:
          - bql: "SELECT account AS category, sum(position) AS total WHERE account ~ 'Expenses' GROUP BY account ORDER BY account"
        type: "jinja2"
        template: "<table>{% for row in panel.queries[0].result %}<tr><td>{{ row[0] }}</td><td>{{ row[1] }}</td></tr>{% endfor %}</table>"

第一个面板直接显示合计持仓。在实例账本上它渲染为 (-4650.00 USD)。那是 6,000.00 USD 的收入减去 1,350.00 USD 的支出。第二个面板把查询行循环进一个表格。该项目还能从同样的查询渲染图表面板。图表脚本 API 见链接的 README。

当你在 Fava 中打开仪表盘页面时,扩展会负责渲染这些。你可以创建多个仪表盘(每个显示为一个标签页或单独页面)。这对于创建自定义财务仪表盘极为强大。例如,你可以做一个“预算对比实际”仪表盘:一个面板显示每个类别预算与实际对比的表格(通过比较两组账户的查询),另一个面板显示年初至今支出与上年的柱状图等。所有这些只需配置和最少的脚本,利用 BQL 使用你的账本数据。

代码示例——启用 fava-dashboards: 如上所示,添加扩展在账本中只需一行。为完整起见,这里有一个上下文中最小示例:

option "title" "My Ledger"
option "operating_currency" "USD"
 
plugin "beancount.plugins.auto_accounts"  ; (auto-opens accounts)
 
1970-01-01 custom "fava-extension" "fava_dashboards" "{ 'config': 'dashboards.yaml' }"

而在 dashboards.yaml 中:

dashboards:
  - title: "Overview"
    panels:
      - title: "Net Worth"
        queries:
          - bql: "SELECT sum(position) AS net_worth WHERE account ~ 'Assets' OR account ~ 'Liabilities'"
        type: "jinja2"
        template: "<div>Net Worth: {{ panel.queries[0].result[0][0] }}</div>"

在实例账本上它渲染为 <div>Net Worth: (4650.00 USD)</div>。真正的仪表盘会格式化得更漂亮并添加更多面板。

有了这个,当你运行 Fava 并导航到“Overview”仪表盘时,它会显示你计算出的净资产。然后你可以按需完善模板或添加图表。

其他值得注意的扩展: 除了 fava-dashboards,社区成员还构建了 fava-investor(用于投资分析)和 fava-review(用于交易审查)等插件。这些是第三方包,有自己的安装步骤和 Fava 兼容范围。安装前查看它们的 README。社区维护着一份 Beancount 插件和工具的“awesome-beancount”列表。浏览它,你也许能找到满足你需求的现成扩展。

何时扩展 vs 外部集成: 一般来说,如果你的需求纯粹是对现有账本数据的展示或计算,Fava 扩展是理想选择(把所有东西放在一处、尊重筛选等)。如果你的需求涉及结合外部数据,或你需要截然不同的 UI,外部集成(上一节)可能更合适。例如,把网站分析与财务并排显示——更适合 Grafana/Metabase;但添加一个新的财务 KPI 或报表——更适合作为 Fava 插件。

示例——Fava 中的自定义 KPI: 假设你想追踪“储蓄率”(储蓄占收入的百分比)。你可以用一个扩展来计算并在主页显示一个小框。或者用 fava-dashboards,一个面板可以是一个 Jinja2 模板,通过查询总收入与总支出输出 Savings Rate: X%。这类自定义指标用这些工具注入非常容易,而在像 QuickBooks 这样的封闭系统中,要创建新的仪表盘指标可能是不可能的。

同样两个查询可以喂养一个储蓄率面板。注意符号:BQL sum(position) 把收入返回为负持仓、支出返回为正持仓,而 Jinja 无法从一个持仓中减去另一个。所以显示两条腿并在模板文本中说明比率:

- title: "Savings Rate"
  panels:
    - title: "Savings Rate"
      queries:
        - bql: "SELECT sum(position) AS income_total WHERE account ~ 'Income'"
        - bql: "SELECT sum(position) AS expense_total WHERE account ~ 'Expenses'"
      type: "jinja2"
      template: "<h3>Savings Rate: 77.5% ({{ panel.queries[0].result[0][0] }} earned, {{ panel.queries[1].result[0][0] }} spent)</h3>"

在实例账本上它渲染为 Savings Rate: 77.5% ((-6000.00 USD) earned, (1350.00 USD) spent)。比率是 (6,000.00 − 1,350.00) / 6,000.00。用数值大小来计算。不要在模板中对持仓取负或相减。

关键点:Fava 不是静态工具——它是一个可扩展的平台。用一点 Python 或甚至只是配置代码,你就能广泛地定制它。许多用户在论坛上分享小脚本或扩展,用来做诸如显示即将到期的账单、从交易生成 PDF 发票,或把 Beancount 与税务计算库集成之类的事。当你投入学习或使用这些扩展时,你就得到了一个非常定制的财务分析系统,而无需从零开始。

用例:个人理财 vs. 小企业会计​

Beancount 和 Fava 既可用于个人记账,也可用于小型企业记账,但用例和好处在侧重点上略有不同:

个人理财​

对个人来说,Beancount+Fava 在提供对个人财务的完全可见性和洞察方面表现出色,而不依赖专有应用。常见的个人财务用例包括:

  • 支出追踪和预算: 许多人用 Beancount 记录每一笔支出,然后分析支出模式。用 Fava,他们可以看到每个月的钱花在哪里(支出树状图),并通过与预期值对比来追踪预算(有些通过 Budgets 扩展或自定义查询实现)。一位用户描述说,采用 Beancount 后,“财务数据分析(支出、捐赠、税务等)变得轻而易举。用 Fava 很容易做到,用脚本也很容易……我有一个 Python 脚本用 BQL 从 Beancount 提取数据,然后用 pandas 准备报表。” 这展示了个人用户如何从内置 UI 以及在需要时编写自定义分析的能力中受益。

  • 净资产和目标追踪: 因为你可以把所有资产(银行账户、投资,甚至如果你想,实物资产)包含在一个账本中,你得到一个净资产的单一视图。个人理财爱好者用它来追踪目标进展(例如“财务自由数字”或还债)。Fava 显示净资产随时间变化的图表很有激励性——你能真切地看到财富曲线。把学生贷款或按揭等负债记在 Beancount 中并更新其余额很常见;账本随后给出财务健康的完整画面。

  • 投资和加密货币: 个人使用常常扩展到追踪投资组合。Beancount 能处理股票、加密货币等,带成本基础和已实现收益计算(通过插件或查询)。相比券商网站的优势是你可以跨所有账户合并,看到真实的资产配置。例如,fava-investor 这样的社区插件为 Fava 添加投资分析页面。这通常是业余投资者在 Excel 里做的事;Beancount 提供更严谨、自动化的方式。一篇题为“Beancount: DeFi Accounting For Noobs”的博客文章甚至展示了用它来追踪加密货币交易和流动性挖矿,显示了它在现代个人财务场景中的灵活性。

  • 多币种个人财务: 如果你住在国外或持有外国投资,Beancount 极其有用,因为它能转换和汇总货币。用户指出_“许多会计软件不擅长多币种……用 Beancount,你可以定义任何你想要的法币”_,并以你偏好的货币得到报表。对个人用户来说,比如薪水管美元但支出用欧元,这是一个大加分。

  • 生活追踪和日志: 一个非传统但真实的用例:有些人把账本当作生活日志,给交易打上生活事件标签(如 #wedding 或 #vacation2025),然后用它计算事件成本,甚至作为活动日记(财务元数据作为生活事件的代理)。纯文本格式和标签让这在传统工具难以实现的方式下成为可能。

  • 简洁和所有权: 个人财务也关乎心态。许多人选择 Beancount,是因为他们_“想拥有这些数据并轻松分析它,不想被订阅或供应商锁定”_。最近 Mint.com(一款流行的免费预算工具)的消亡驱使爱好者转向纯文本记账以求长久。用 Beancount,他们知道自己 20 年后仍能打开账本。对单个个人的财务来说,Beancount 的数据(也许通过 Dropbox 或 Git 同步)和 Fava 的网页 UI(可以在本地或私有服务器上运行)提供了别处难以找到的便利与控制的平衡。

个人使用的潜在挑战:初始设置和学习复式记账对某些人来说可能是个障碍。但许多资源(如 Beancount 教程和社区论坛)能帮助新用户。一旦设置好,维护可以如所述大部分自动化,这对以最少精力管理家庭财务的人来说很棒。

小型企业会计​

小型企业、初创公司和自由职业者也可以使用 Beancount+Fava,尽管这里的需求包括更正式的报表,也许还有协作:

  • 簿记和财务报表: 一家公司可以在 Beancount 中维护其总账,记录发票、账单、工资等,并生成资产负债表和损益表。Beancount 支持所需的权责发生制记账(你可以把账户标记为应收账款/应付账款,并记录发票,过账到收入和应收账款,稍后一笔付款清掉应收账款)。Fava 随后会在资产或负债下适当显示它们。一个 Reddit 讨论问 Beancount 是否适合公司,以及它能否生成正规的财务报表——是的,它能生成资产负债表、利润表以及(借助一些查询帮助)现金流量表,因为这些都只是复式数据的视图。问题在于 Beancount 不强制任何特定的会计准则(这取决于你怎么用它)。所以有知识的用户(或会计)应为业务正确设置会计科目表。社区有 Beancount 用于初创公司的例子——一位 HN 评论者说:“我非常喜欢用 Beancount + Git 管理我自己初创公司的账簿”,尽管他们指出定期添加分录有点繁琐。正如我们所见,这种繁琐可以用导入自动化来缓解。

  • 实时财务监控: 对小型企业来说,现金流为王。用 Fava,企业主可以像个人一样近实时地监控银行余额和现金流——但这里更为关键。通过自动化银行数据流或导入,他们能察觉客户付款是否到账,或一笔大支出是否清算。QuickBooks 提供银行数据流,“让你实时看到你的业务状况”;用 Beancount,你通过自己的银行集成来复现这一点。Beancount 的好处是透明——你确切看到导入了什么以及如何分类,而不是信任 QuickBooks 有时难以理解的匹配逻辑。

  • 发票和应收/应付: Beancount 没有内置的发票模块(如生成 PDF 发票或追踪发票号码)。不过,有创意的用户用附加组件管理了这些。例如,可以用 Jinja2 模板,甚至一个读取未结应收账款分录的外部脚本,从交易生成发票 PDF。有一个项目“Beanie”在 Beancount 之上充当轻量应收账款系统。小型企业可以用 Beancount 做账本,用另一个工具开发票,然后把发票数据导入 Beancount。相比 QuickBooks(能发送发票并在付款后自动记录),这多了一步,但它确保所有数据最终进入开放账本。

  • 工资和折旧: 这些是小型企业处理的会计任务。Beancount 当然能记录工资分录(把税前工资、税费、预扣等拆分到适当的账户)——但你通常会用外部工具或你的工资服务商计算,然后输入。固定资产折旧表同样需要手动输入(或者你可以写一个插件自动化每月折旧分录)。Beancount 对这些没有魔法,但许多小型企业软件工具除了提供一些模板也没有。优势在于你可以用脚本处理任何不寻常的事。例如,如果你有自定义的收入确认计划,你可以用 Python 编写那些日记账分录并包含它们。

  • 透明度和可审计性: 企业可能会欣赏 Beancount 提供清晰的审计线索。每笔交易都是明文的,并可以标注文档链接(收据、合同)。如果被审计,你可以展示账本文件以及附带的文档,相当直接。另外,版本控制意味着你有谁/何时做变更的审计日志(如果多人通过 Git 协作)。相比 QuickBooks,其中会计可能需要检查用户不易访问的变更日志。

  • 成本: Beancount+Fava 是免费的,这对试图最小化软件成本的初创公司或小型企业很有吸引力。QuickBooks、Xero 等有月费。不过,代价是那些工具附带支持和更容易的设置。懂技术的企业主可能乐意用一些时间换取成本节省和灵活性。

真实例子:HN 上另一位用户说他们把它用于一家咨询有限责任公司,效果很好,但当交易增长时,他们开始按年拆分文件以保持速度。共识是:对于_小型_企业(比如每年数万笔交易或更少),Beancount 完全够用。如果你是更大的中小企业,有数十万笔交易,性能可能值得要么使用数据库方法,要么选择专用记账系统——尽管我们有 Beanpost 试图通过用 Postgres 作为后端来解决这个问题。

协作: 一个差异领域——QuickBooks Online 允许多个用户(所有者、会计等)同时工作。用 Beancount,协作可以通过 Git(多个用户提交变更)。这可行,但需要一些 Git 知识和在人们同时编辑时的冲突解决。有些人用在线 Git 平台甚至 Google Drive 共享账本文件。这是可行的,但不如云会计软件无缝。不过,对小型团队(或单人记账员 + 所有者)来说是可以管理的,而且你总是可以通过 Fava 授予只读访问(把它托管在内部服务器上,让其他人查看报表而不编辑)。

合规性: 对个人财务,不是问题。对企业,你可能需要生成官方报表或遵循会计准则。Beancount 可以用来生成符合 GAAP 的报表,但需要用户相应地输入数据。没有内置的 GAAP 规则强制执行(例如没有内置固定资产模块来确保你正确折旧)。外部会计仍然可以用 Beancount 账本工作(因为它基本上是一个广义日记账)——如果需要,他们可以导出到 Excel 并做调整。有些企业可能出于这个原因更喜欢知名软件,或者至少有一位熟悉纯文本数据的会计。

谁用它做生意? 很可能是高级用户:科技初创公司、有编程背景的自由职业者,或高度重视数据控制的公司(例如可能想要自定义报表的金融交易公司)。一个 Reddit 帖子有人问 Beancount 是否适合交易公司——回答表明是的,它处理多币种并能生成所需报表,但你需要围绕它构建一些工具。

总结本节:个人财务用户喜欢 Beancount 因为它给了他们对个人资金的洞察和控制——它把财务变成一个可查询和学习的数据集,产生诸如轻松追踪每笔支出和计算典型预算工具无法计算的指标之类的好处。小型企业用户欣赏透明度、成本节省和可改造性——他们能把记账与其余软件栈集成,避免供应商锁定或月费。两个用例都受益于实时分析:个人可能关注月度预算进展,企业可能关注每日现金流——在这两种情况下,只要有及时的数据,Fava 就能呈现最新信息。

与其他实时分析平台的比较​

把 Beancount+Fava 与其他提供“实时”财务分析的解决方案对比是很有用的,例如 **QuickBooks(带实时银行数据流)**和 Power BI(或类似的 BI 仪表盘)。每种方法在透明度、灵活性和响应性方面都有其优势和权衡:

方面Beancount + Fava(开源)QuickBooks(带银行数据流)Power BI / 通用 BI
透明度和数据所有权完全透明——数据是纯文本,你可以检查每笔交易。逻辑全部可见(没有隐藏算法)。你永久拥有格式。版本控制可以显示变更的审计线索。不透明——数据存储在专有云数据库中。备份依赖 Intuit 的导出。有些流程(例如自动分类)不完全可见。审计日志有限。如果你停止付费,你有可能失去对数据的便捷访问。取决于数据源——Power BI 本身只是工具。如果连接到开放数据库,你保留该数据的所有权。然而,Power BI 文件或仪表盘是专有格式,需要 Power BI 才能查看。计算透明度好(你定义它们),但整体系统复杂。
灵活性和自定义极其灵活。你可以定义任何账户结构、任何商品/货币。你可以用脚本实现自定义行为或分析(Python、插件)。没有强加的工作流——你根据需求定制(个人或企业)。Fava 的扩展系统和 fava-dashboards 等工具允许在应用内自定义仪表盘。如果缺什么,你很可能可以自己构建或集成。中等。QuickBooks 对标准小型企业记账功能丰富(发票、工资(单独附加组件)、基本报表)。但你受限于 Intuit 提供的功能。会计科目表和类别必须符合其范式。自定义报表有限;你不能任意查询数据库。集成存在,但通过 Intuit 的 API(有限)或导出到 Excel。你以灵活性换便利。对分析和可视化非常灵活。只要数据可访问,你可以创建几乎任何图表或 KPI。Power BI 可以轻松把财务数据与其他数据(销售、网站分析等)混合。然而,它不是记账系统——你需要准备好数据(可以来自 Beancount!)。它不强制复式记账或会计原则;它是一张白纸。可视化灵活性高(自定义 DAX 度量等),但需要专业知识。
实时响应性配置后近实时。如果你自动化数据输入(数据流或频繁导入),Fava 会在账本更新并重载后立即反映。默认它不是“推送”实时(需要手动刷新),但你可以按需频繁更新(每分钟、每小时)。更新速度非常快(小变更的文本解析在毫秒级)。你控制频率——如果脚本化可以连续。无需等待供应商同步周期。为银行交易设计为近实时:“银行数据流让你实时看到你的业务状况。” 实践中,QuickBooks Online 中的银行数据流每天更新一次或按需更新(取决于银行)。它自动拉取新交易并尝试分类,所以你不必手动导入。变更无需手动干预就出现在仪表盘上。不过,有些数据(如待处理交易)可能直到清算才显示。另外,某些报表在采取操作前可能不会更新。一般来说银行数据的响应性不错;手动日记账分录则不然(仍是实时的,但要你自己输入)。如果配置了实时连接,仪表盘可以实时或按计划更新。例如,对 SQL 数据库使用 DirectQuery 的 Power BI 仪表盘可以每次打开时更新,甚至自动更新。用 Import 模式,你可以按计划(例如每小时)刷新。所以它可以近实时,但复杂性在于维护数据管道。另外,底层数据的任何变化都需要刷新模型或查询。根据配置方式可能有轻微延迟(如果使用 Power BI 云,免费层级的自动刷新频率有限制)。
自动化和数据录入导入可以高度自动化,但需要自定义设置。你可能需要编写/维护脚本或使用社区导入器为每个银行或数据源。没有开箱即用的银行连接(除了你自己创建的)。所以初始自动化设置需要努力。反过来,一旦设置好,它可以完全自动化,无需手动录入(如一些用户实现的约 95% 自动化)。也支持对无法自动化的事手动录入(用 Fava 的网页表单或文本编辑)。对银行/信用卡数据流非常自动化(无需编码——只需在 QuickBooks 中连接你的账户)。它还自动建议类别(用过去的数据和一些 ML)。“每笔交易都会为你即时同步和分类……QuickBooks 推荐类别并随时间变得更聪明。” 这是一个很大的便利优势——更少手动工作。不过,自动化主要针对金融账户;其他事(如把支出拆分到类别)可能仍需手动审查。另外,如果银行数据流中断,用户必须重新连接或上传文件。Power BI 根本不涉及数据录入——它依赖数据源拥有的任何自动化。如果你的数据源是手动电子表格,那它就不是实时的。如果是被某个 ETL 过程更新的数据库,它可以接近实时。所以自动化取决于你喂给 Power BI 什么。Power BI 本身可以安排从源刷新数据。简言之,Power BI 能很好地反映自动化数据,但不_创造_自动化(你必须有一条自动化的数据管道喂它)。
协作和共享通过文本(例如 Git)协作很强大但技术性强。多人可以通过编辑账本文件并合并变更来贡献。Fava 可以托管为只读,与他人共享报表,但开箱即用缺乏用户角色或细粒度访问控制。对单用户或懂技术的团队来说没问题。审计师或会计如果不熟悉格式,可能需要导出数据(例如 Excel 中的试算平衡表)来工作。多用户网页访问带权限(QuickBooks Online 支持会计、多个有角色的业务用户)。共享容易——你的会计可以登录并实时看到账目。这对企业是一个强项。对个人财务,多用户不太相关,但跨设备的云访问是一个好处(尽管你同样可以在个人云/VPS 上运行 Fava)。QuickBooks 还与其他服务(工资、银行贷款等)集成,这对企业有用,在 Beancount 中难以复现。Power BI 在共享仪表盘方面表现出色,尤其使用 Power BI Service 时:你可以向同事发布仪表盘、嵌入网站(有适当许可)等。它是为洞察协作而建的。不过,这是分析结果的只读共享,不是数据的协作编辑。如果多个用户需要分析,他们可以在获得 BI 项目访问权的情况下进行。总之,要以炫目的方式向利益相关者传达财务结果,Power BI 难以超越。但这不是协作簿记;这是协作分析。
成本免费(开源)。你可能花时间而非金钱(用于设置/维护)。自己托管 Fava 可能有微不足道的成本(如果在你的 PC 或便宜服务器上)。没有额外用户的许可费。付费(月费或年费)。QuickBooks Online 根据计划从 $20 到 $70+ 每月不等。工资或高级功能还有费用。许多小型企业付这个钱,因为它包括支持和持续更新。但多年下来,成本累积。另外,如果你停止订阅,你可能失去完全访问权。混合。Power BI Desktop 免费,但 Pro 订阅(用于共享仪表盘)约 $10/用户/月。如果你已通过 Office 365 或类似途径拥有它,额外成本可能为零。其他 BI 工具各不相同(有些开源的如 Metabase 免费运行)。不过,要考虑开发 BI 解决方案的时间成本,以及可能维护数据库或云基础设施的成本。

总之,Beancount+Fava vs QuickBooks: Beancount 提供卓越的透明度(你看到并控制一切,你的数据不会消失或被锁住)和灵活性(你可以在账本中建模任何东西,而不仅是 QuickBooks 期望的)。它需要更多 DIY,尤其是自动化和漂亮的 UI 细节。QuickBooks 是一个即插即用的解决方案,针对小型企业需求优化——银行数据流、发票、工资(带附加组件)——并以最少的用户努力提供近实时更新。然而,它在许多方面是个黑盒;你信任软件正确处理你的数据,有时这意味着很难纠正错误或理解它如何得出某个数字。许多 Beancount 用户是对那些黑盒感到沮丧的人。他们用一些便利换取清晰。

Beancount+Fava vs Power BI(或其他 BI): 它们可以互补。Power BI 不是记账系统;它是用于分析的。事实上,一个高级设置可能用 Beancount 合并并确保数据准确性,然后用 Power BI 从该数据创建高管仪表盘。如果直接比较,Power BI 更关乎视觉灵活性和结合数据源。Fava 的图表设计上更简单(专注于会计需求),但启动所需工作少得多(它们开箱即用你的账本,不需要建模)。如果你的目标纯粹是获得洞察和漂亮的可视化,且你愿意准备数据,BI 工具可能合适。但如果你的目标是维护账目并作为副产品获得交互式报表,Fava 往往就够了。

也可以比较其他个人财务工具(例如 Mint 或 YNAB)或 ERP 系统,但问题特别提到实时分析平台。在实时财务视图领域:Beancount+Fava 就像有一个自定义、开源的“实时”财务仪表盘,QuickBooks 是闭源的自动簿记加实时银行同步,而 Power BI 是一个灵活的分析平台(非财务专用,但如果喂入数据可用于财务)。

一句有说服力的对比开源与商业的话:“前期一点努力,开源工具实际上可以比商业解决方案好得多,而且更加灵活和可扩展。” 这概括了权衡。QuickBooks 精致且对常见场景开箱即用,努力最少。但一旦你想要它做不到的事,你就撞墙了。用 Beancount,你很少撞墙——你有源代码和数据,可以按需扩展或集成。代价是你必须愿意动手折腾。

使用 Fava 和 Beancount 进行数据驱动洞察的优缺点​

最后,让我们提炼 Beancount+Fava 作为财务分析解决方案的优点和缺点:

优点​

  • 透明度和信任: 所有计算(合计、余额)都来自你可以检查的纯文本账本。没有神秘行为。这在数字中建立了极大的信任——如果你基于它们做决策,这至关重要。它是_“干净、透明的记账”_,没有锁定。你总能追溯一个报表数字到底层交易,这正是数据驱动洞察的本质。

  • 可复现性和审计线索: 因为你可以对账本进行版本控制,你有变更的时间线。如果这个月有什么不对劲,你可以 diff 账本看什么变了。这也意味着你可以实验(“如果我把这笔支出重新分类会怎样?”)并轻松撤销。数据驱动工作通常涉及迭代,可审计的账本鼓励这一点。

  • 分析灵活性: 你不受限于预建报表。BQL 查询、Python 脚本和 Fava 筛选的结合意味着你几乎能回答任何财务问题。想知道_“过去 5 年我每年在星巴克花了多少钱?”——一个查询之遥。或者“我 3 个月支出与收入的移动平均是多少?”_——可以在查询之上用 Python+pandas 编写脚本。这种灵活性对喜欢钻研数据的人来说是巨大的优点。高级用户甚至构建了扩展来计算财务指标(例如投资组合表现指标)并在 Fava 内呈现。简言之,你可以获得许多现成软件无法提供的非常细粒度的洞察。

  • 集成和可扩展性: Fava 的插件系统和可访问的 Beancount API 意味着工具能随你的需求成长。如果明天你开始需要追踪一种新的资产,或想集成新的数据源,你可以扩展系统。架构(纯文本输入,各种输出)非常可扩展。这与封闭系统形成对比,在那些系统中你可能得请求一个功能并等待。

  • 数据合并: 对个人甚至企业来说,能把所有账户(多个银行、券商等)合并到一个系统是很强大的。许多商业解决方案把你隔离开(或对多币种或多实体额外收费)。用 Beancount,你可以把一切汇聚在一起。这给出_整体_数据视图,实现全面的洞察。例如,你可以计算你真正的整体资产配置,或者如果你愿意,跨个人和企业的净现金流,因为它只是数据分录。

  • 成本效益: 它免费且开源。对个人使用,这是一个大加分(不像许多预算应用那样有订阅)。对初创公司或小型组织,这些节省会累积。但除了金钱成本,它在运行(Fava 可以在一台小服务器上运行)和迁移(如果你成长了也没有昂贵的迁移——它只是文本)方面也很高效。

  • 社区和知识共享: 纯文本记账社区(Beancount、Ledger 等)非常协作。人们在论坛和博客上分享配置、自定义脚本和技巧。这意味着如果你有小众需求,可能有人处理过类似的事。例如,多位用户为智能导入工具甚至机器学习分类做出了贡献(例如“smart*importer”库,用 scikit-learn 根据过去数据自动分类收款人)。随着时间推移,如果你利用这些社区工具,使用 Beancount 实际上可以变得更聪明——接近商业软件的便利,同时保持透明。

  • 赋权和学习: 使用 Fava/Beancount 迫使你更深入地接触你的财务数据。许多用户报告说,他们通过这个系统比以往使用自动应用时对自己的财务有了更好的理解。这有点像自己做饭 vs 吃快餐——更多努力,但你知道里面有什么,长远看可能更健康。对数据驱动洞察,这种对过程的“所有权”能带来更有意义的发现,因为你可以轻松地重新框定你看数据的方式。

缺点​

  • 初始设置和学习曲线: 说实话——Beancount 和 Fava 不像 QuickBooks 或 Mint 那样即插即用。你需要学习复式记账基础(如果你不懂的话)、Beancount 文件语法,以及如果你想高度定制的话可能还需要一些 Python。这种前期投入可能是个障碍。对非技术用户,可能令人生畏(尽管 Fava 的界面通过设置后提供更友好的体验帮助很大)。相比之下,许多商业工具把会计概念隐藏在更简单的界面背后(这既是优点也是缺点)。

  • 没有内置银行同步: 设计上,它不自动连接银行 API(这些通常是专有的或需要协议)。所以你要么手动下载对账单,要么设置自己的自动化(通过 Python 脚本或 Plaid 这样通常要花钱的服务)。对习惯了银行数据流“自动运行”的人来说,这可能感觉是退步。正如一位用户指出的,尝试 Beancount 时他们_“没有找到获取银行数据流的合理方法”_——除非你愿意编码或使用第三方解决方案,这可能是个烦恼。

  • 实时意味着你的时间: 实现实时响应性是可能的,但不是开箱即用。你必须如所述配置 cron 任务或触发器。如果某处坏了(例如银行改变了 CSV 格式),你必须修复导入器。用 QuickBooks 这样的服务,供应商处理这些变化。本质上,你是你自己的 IT 支持。这是经典的开源权衡。对爱好者来说,这可能没问题甚至有趣;对忙碌的小企业主来说,可能是个麻烦。

  • 扩展和性能限制: 对非常大的数据集(多年的详细交易),Beancount 可能变慢。它通常很高效(人们有几万条分录没有问题)。但如 HN 帖子所见,一位用户在 3 年后文件增长时不得不每年“结账”以保持查询快速。Beancount v2 代码是 Python,对巨大数据可能有点慢,尽管 v3(开发中,带 C++ 核心)改善了这一点。有缓解措施(拆分文件、用 Beanpost 卸载到 DB 等),但这是一个考虑因素。QuickBooks 可能有内部扩展,大多数 BI 工具构建在为大数据的数据库上——所以它们可能更优雅地处理大数据集。

  • 功能差距(相对于专用软件): Beancount+Fava 专注于记账和分析。它缺少一些辅助功能:例如,没有工资处理、没有发票生成(不自定义脚本)、没有集成的税务准备表格等。如果你的目标是_全面_财务管理,你可能需要用其他工具补充。例如,你可能通过工资服务做工资,只是导入日记账分录。这可行,但不如像 ERP 那样把一切放在一处的无缝集成。对个人财务,Beancount 没有内置的还债计划器或预算信封之类的东西(尽管你可以模拟)。它期望你得出洞察然后做决策,而不是提供规定性建议或规划模块。

  • 用户界面和打磨: 虽然 Fava 相当不错,但它不像一些商业产品那样精致或有引导。没有“向导”带你设置或确保你不犯错。你可能必须读文档才知道怎么做 X。而且某些你可能期望的 UI 功能(拖放分类、多步撤销、移动推送通知等)不在那里。Fava 的 UI 一直在改进(有贡献),但它是由一个小社区构建的。如果你习惯了流畅的现代 SaaS UI,Fava 可能感觉有点实用主义(尽管有些人实际上更喜欢它的干净简洁)。在手机上,Fava 能工作(尤其是只读),但没有完全针对小屏幕优化;例如 QuickBooks 有专门的移动应用。

  • 依赖社区/维护者: Martin Blais(Beancount 作者)和贡献者维护 Beancount,其他人维护 Fava。开发可能时断时续(在 OSS 中很正常)。虽然软件现在非常好用,但如果你需要新功能或有 bug,你可能得自己修复或等待。用付费产品,你有支持可以打电话(质量参差不齐,但至少存在)。话虽如此,社区通常通过邮件列表或 GitHub issues 非常乐于助人。

  • 需要会计知识: 尤其对企业使用,你需要知道你在做什么。Beancount 不会阻止你做出从会计角度看“错误”的分录(除了不平衡或不匹配的交易)。相比之下 QuickBooks 有护栏(如果你启用它们,也有隐藏复杂性,如自动递延收入追踪等)。如果你在 Beancount 中不仔细,你可能会搞错一笔应计,直到注意到报表问题才发现。本质上,Beancount 假设你掌握了基本会计或愿意学习。对某些人这实际上是优点(迫使你正确做),但如果你想要一个无需思考的系统,这是个缺点。

总结优点和缺点:Beancount + Fava 为那些想深入接触自己财务数据的人提供了无与伦比的控制和适应性,使其成为数据驱动洞察的强大工具。它把你的账目变成可查询的数据集,把你的报表变成可扩展的网页应用。这种力量的代价是你在设置和维护上投入的工作,以及在一定程度上自给自足地管理系统的需要。与 QuickBooks 或 BI 套件相比,后者更多地手把手指导并自动提供某些功能,Beancount 给你一个工具箱。如果你有分析倾向,这个工具箱可以非常解放——你可以提取现成报表可能永远不会显示的洞察。正如一位多年来自动化其 Beancount 账本的用户所写,“开源工具(如 Beancount)不能满足我[开箱即用]的所有需求……我痴迷于自动化一切……我构建了我需要的。” 这概括了这种方法:如果你愿意构建你需要的,无论大小,Fava/Beancount 都会支持你,并且永远不会向你隐藏数据。对数据驱动的思维方式来说,这是一个巨大的优势。

总之,用 Fava 和 Beancount 进行实时财务分析,有点像为你的财务拥有一个可定制的实验室。你获得清晰度、灵活性和所有权,这是专有平台难以匹敌的,使它成为那些重视这些方面并愿意用一些便利来换取的人的理想选择。现代格局甚至显示了混合方法——例如,有些人可能使用商业工具但定期导出到 Beancount 做更深入的分析,或者反过来把 Beancount 作为主要工具、用 BI 工具做展示。有了这项调查的知识,人们可以明智地决定 Fava+Beancount 是否符合他们的需求,如果符合,则自信地继续利用其能力获得丰富、实时的财务洞察。

来源:

  • Blais, M. (2020). Beancount Documentation – Design principles and usage. [Online]. Available: beancount.github.io
  • Aumayr, D., Gerstmayr, A. (2025). Fava Documentation & GitHub Repository. [Online]. Available: beancount.github.io/fava/ and github.com/beancount/fava
  • LowEndBox. (2025). “Beancount: Lightweight FOSS Double-Entry Accounting...from the Command Line!” LowEndBox Tutorial.
  • Fang-Pen Lin. (2024). “My Beancount books are 95% automatic after 3 years.” Personal Blog Post.
  • Google Groups – Beancount Forum. (2023). Discussion on Grafana integration (Josh D. and Andreas G.)
  • QuickBooks Marketing Page. “Bank Feeds – Understand all your transactions in an instant.” Intuit QuickBooks.
  • Watt, A. (2023). “Beancount for Personal Finance.” Alex Watt Blog.
  • Reddit – r/plaintextaccounting. Various discussions (2021-2023) on business use of Beancount and ledger visualization.
  • Fava Extension Documentation – Help: Extensions.
  • fava-dashboards GitHub README – Andreas Gerstmayr’s custom dashboards plugin.
  • Awesome Beancount list – community-curated resources for Beancount.

来源:https://beancount.io/zh/docs/Solutions/analytics