FavaとBeancountによるリアルタイム財務分析
はじめに
Beancount は、プレーンテキストファイルを台帳として使用するオープンソースの複式簿記会計システムです。財務追跡におけるシンプルさ、透明性、柔軟性を重視しています。 Fava は、Beancount用の強力なウェブベースのフロントエンドであり、レポートや可視化の表示、台帳の管理を行うためのインタラクティブなインターフェースを提供します。本レポートでは、BeancountとFavaの中核的な機能と、これらのツールでリアルタイムまたはニアリアルタイムの財務分析を実現する方法について解説します。自動化とデータ更新のための設定のヒント、Favaの可視化機能(即時のキャッシュフロービューとトレンド検出)、外部ダッシュボード(Grafana、Metabaseなど)との統合、カスタムダッシュボードとプラグインの例、個人および中小企業の金融におけるユースケース、他のプラットフォーム(Power BI、QuickBooks)との比較、データ駆動型のインサイトを得るためにFava+Beancountを使用する際のメリット/デメリットについて説明します。
BeancountとFavaの中核的な機能
Beancount(プレーンテキスト会計エンジン)
- プレーンテキストによる複式簿記台帳: Beancountは、トランザクションを単一の
.beancount
テキストファイル(または一緒に含まれる複数のファイル)に保存します。すべてのトランザクションは、勘定科目間でバランス(借方合計=貸方合計)が取れていなければなら ず、会計の整合性を強制します。プレーンテキスト形式は、データが人間にとって読みやすく、バージョン管理可能であり、特定のベンダーにロックインされないことを意味します。 - 柔軟な階層型勘定科目: 勘定科目(例:
Assets:Bank:Checking
、Expenses:Food:Coffee
)を階層的に定義できます。 Beancountは勘定科目体系について意見を持たないため、個人金融、中小企業の会計、投資などに適しています。「柔軟性があり、個人金融、中小企業の簿記、暗号通貨、株式投資などに対応できます。」 - 複数通貨とコモディティ: Beancountは、複数の通貨とコモディティ(例:株式、暗号通貨)をファーストクラスでサポートしています。異なる通貨でトランザクションを記録したり、為替レート(価格ディレクティブ)を定義したり、コストベースを追跡したりできます。価格データが提供されていれば、「原価」または「市場価値」でレポートを作成できます。これにより、ポートフォリオや国際金融に適しています。
- 自動化されたチェックとバランス: このシステムは、残高アサーション(特定の日付における勘定科目の残高がどうあるべきかを宣言でき、一致しない場合はBeancountがエラーを発生させます)と、帳簿を締め切るための残高トランザクションをサポートしています。また、資本の開始/終了仕訳をサポートし、期間締め切り時の繰越利益計算を保持します。これらは、帳簿の一貫性を維持し、エラーを早期に発見するのに役立ちます。
- 強力なクエリとレポートエンジン: Beancountには、クエリ言語BQL (Beancount Query Language) と、レポートを生成するための
bean-balance
、bean-register
、bean-query
などのコマンドラインツールが付属しています。台帳をデータベースのように扱い、カスタムレポート(例:支払人別の費用一覧、期間中のキャッシュフロー)をクエリできます。数千件のトランザクションがあっても高速であり、CSVに出力したり、Excel/LibreOfficeに直接出力したりできます(オプションのアドオンを使用)。 - プラグインによる拡張性: BeancountはPythonで記述されており、その機能を拡張するためのカスタムプラグインを許可しています。プラグインは、ファイルが処理される際に追加のルールまたは計算を強制できます。(たとえば、税務ロットを処理したり、購入にコストが欠落していないことを確認したりするためのプラグインがあります。)プラグインシステムとPython APIを使用すると、高度なユーザーはカスタム動作をスクリプト化したり、Beancountを他のシステムと統合したりできます。
- 外部データ用のインポーター: 実用的な重要な機能は、データ(例:銀行取引明細書)をインポートするためのBeancountの ingest フレームワークです。CSV、OFX、PDFステートメントなどを解析し、それらをBeancountエントリに変換するインポータープラグインを作成または使用できます。これは自動化に不可欠です(詳細については後述)。
- 監査可能でバージョン管理フレンドリー: プレーンテキストであるため、台帳をGitまたはその他のバージョン管理に保持できます。すべての変更が透過的であり 、編集の完全な履歴があります。これにより、監査や変更の確認が簡単になります(多くのユーザーは毎日の変更をGitリポジトリにコミットし、すべての財務エントリの改ざん防止ログを提供します)。このレベルの透明性は、クローズド会計ソフトウェアとは大きく異なります。「SaaSロックインなし—強力なレポート作成機能を備えた、クリーンで透明性の高い会計。」
Fava(BeancountのWebインターフェース)
- インタラクティブなWeb UI: Favaは、Beancount台帳をリッチなUIにレンダリングするローカルWebサーバーを提供します。コアレポート(損益計算書、貸借対照表など)、勘定科目残高、および仕訳帳を、インタラクティブなコントロールを備えたブラウザに表示します。UIは動的で、コマンドラインよりもユーザーフレンドリーです。単純な
fava yourfile.beancount
で起動し、帳簿用のWebアプリを取得できます。 - 組み込みのグラフとチャート: Favaは、データを視覚化するのに役立つグラフを生成します。たとえば、時間の経過に伴う純資産の折れ線グラフ、月ごとの収入と支出の棒グラフ、および費用の内訳を示す円グラフ/ツリーマップチャートが含まれています。これらのビジュアルはデータで更新され、さまざまなビュー(例:投資の「原価」対「市場価値」)をサポートします。こ れらの可視化機能については、後で詳しく説明します。
- フィルタリングと検索: Favaのページの上部にあるフィルターバーを使用すると、データをリアルタイムでスライスしてダイスすることができます。時間(例:年、四半期、月)、勘定科目正規表現、支払人、ナレーション、またはタグ/リンクでフィルタリングできます。これにより、_リアルタイムのデータ検査_が簡単になります。たとえば、「Tag=Travel」および「Year=2025」にすばやくフィルタリングして、2025年のすべての旅行費用を合計とともに確認できます。インターフェースは、このフィルターバーを介して、またはクエリページ(BQLクエリを直接実行できる場所)を介して、複雑なクエリをサポートします。
- 複数ファイルサポートと統合: Favaは、複数のBeancountファイルを一度にロード(台帳を分離する場合に便利)し、それらを切り替えることができます。必要に応じて統合することもできます(たとえば、個人用台帳とビジネス用台帳を一緒に表示します)。
- データ入力と編集: ユニークなことに、Favaは読み取り専用ではありません。エディターとトランザクション入力フォームがあります。Webフォームから新しいトランザクションを追加できます(エントリは
.beancount
ファイルに挿入されます)。Favaから外部エディターでソースファイルを開くこともできます。Favaは、パワーユーザー向けに 「Gmailスタイルの」 キーボードショートカット(UIで?
を押すと表示されます)もサポートしています。これにより、Favaは、同じインターフェースからデータ を入力および表示できる軽量な会計システムになります。 - レポートと勘定科目のドリルダウン: Favaは、標準的な会計レポートを提供します:損益計算書(損益)、貸借対照表、試算表、および投資の保有リスト。貸借対照表と損益計算書はインタラクティブです。勘定科目をクリックして詳細をドリルダウンしたり、資産の原価表示と市場価値表示を切り替えたりできます。価格データがある場合、Favaは投資の「未実現利益」も表示します。すべてのエントリの仕訳ビューを生成し、さまざまな基準でその仕訳をフィルタリングできます(特定のトランザクションを見つけるのに最適です)。
- ドキュメント管理: 領収書または明細書を添付すると、Favaはそれらの整理に役立ちます。Beancountにはドキュメントフォルダーの概念があり、Favaを使用すると、勘定科目またはトランザクションにファイルをドラッグアンドドロップできます。ファイルは保存され、台帳にドキュメントエントリが追加されます。これは、台帳データに関連するサポートドキュメントを保持するのに役立ちます。
- 拡張機能によるカスタマイズ: Favaは、新しいレポートまたは機能を追加するために、(Pythonで記述された)プラグインで拡張できます。一部の拡張機能はバンドルされています(例:投資のポートフォリオリストレポート)。カスタム拡張機能については後で説明しますが、基本的に、Favaの設計により、拡張APIを介して新しいページ、さらにはカスタムJavaScriptを挿入できます。つまり、特定の分析またはダッシュボードが 組み込まれていない場合でも、高度なユーザーが追加できます。
- パフォーマンス: Favaは効率的です。メモリ内のデータをリロードし、ページをすばやく提供します。基盤となるBeancountの解析は非常に高速で(最新バージョンではC++で最適化)、大規模な台帳でも1〜2秒でロードされます。実際には、Favaは長年の個人用台帳を処理できますが、非常に大きなファイル(数万件のトランザクション)は、最適化(古いエントリのアーカイブなど)によってメリットを得る可能性があります。
- Webアクセスとモビリティ: サーバーまたはラップトップでFavaを実行することにより、任意のブラウザから財務にアクセスできます。一部のユーザーは、プライベートサーバーまたはRaspberry PiでFavaをホストして、外出先で財務状況を確認できるようにしています(Favaには組み込み認証がないため、パスワードまたはVPNで保護している可能性があります)。これにより、サードパーティにデータを渡すことなく、財務用の自己ホスト型「Webアプリ」が提供されます。
要約すると、Beancountは、厳格な複式簿記ルールと複数通貨のサポートを備えた、透過的なテキストベースの会計のための堅牢な基盤を提供します。Favaは、すぐに利用できる洞察(レポート、チャート)とデータと対話する機能を提供することにより、それを基盤として構築します。これらを組み合わせることで、エンドツーエンドで制御できる非常に柔軟な会計および分析システムが形成されます。
BeancountとFavaによるリアルタイム(またはニアリアルタイム)分析
BeancountとFavaでリアルタイムまたはニアリアルタイムの分析を実現するには、台帳へのデータの流れを自動化し、ツールが最新の情報を表示するようにする必要があります。デフォルトでは、Beancountはバッチ処理(ファイルにエントリを追加してからレポートを表示)であり、Favaは変更を検出し、更新を要求します。ただし、適切な設定を行うことで、新しいトランザクションと変更がほぼ瞬時に表示されるように更新を合理化できます。
ファイル変更の検出: Favaは、台帳ファイルの変更を監視します。エディターで .beancount
ファイル(またはインクルードファイル)を編集すると、Favaに「変更が検出されました – クリックしてリロード」というバナーが表示されます。(クリックまたはリロードを押すと)データをリロードし、ビューを更新します。実際には、このリロードは非常に高速です(通常、一般的な台帳では1秒未満)。これは、台帳ファイルが頻繁に更新されている場合、Favaがライブダッシュボードとして機能できることを意味します。(デバッグモードでは、Favaはファイル変更時に自動的にリロードすることもできますが、デフォルトではビューが中断されないようにユーザーの確認を待機します。)
継続的な インポート/更新パイプライン: リアルタイムデータを取得するには、Beancountファイルへのトランザクションの追加を自動化する必要があります。一般的な戦略がいくつかあります:
-
スケジュールされたインポートジョブ(Cron): 多くのユーザーは、定期的に(たとえば、毎晩または毎時間)金融機関から新しいトランザクションを取得し、それらを台帳に追加するためにcronジョブ(またはスケジュールされたタスク)を設定します。たとえば、Beancountのインポータープラグインを使用して、APIまたはOFXダウンロードを介して最新の銀行トランザクションを取得できます。あるBeancountユーザーは、自分の帳簿が自動的に更新されるように自動化パイプラインを構築しました。「オープンフォーマットで会計帳簿が触れることなく自動的に更新されるのを見るのは純粋な喜びです」。これは、銀行APIに接続し、定期的な更新をスケジュールすることにより実現されました。
bean-fetch
(OFX用)などのツールや、銀行API(例:Plaid)を使用するカスタムPythonスクリプトは、スケジュールで実行し、新しいエントリを台帳に書き込むことができます。スケジュールされた各インポートの後、Favaを実行している場合は、Favaを更新するだけで新しいデータを確認できます。 -
ファイルウォッチャーとトリガー: 時間ベースのスケジュールではなく、ファイルウォッチャーを使用してイベントに対応できます。たとえば、銀行が毎日の明細書をメールで送信したり、フォルダーにCSVをドロップしたりする場合、スクリプトはそのファイル(Linuxでは
inotify
などを使用)を検出し、すぐにインポートルーチンを実行してから、Favaにリロードを通知できます。Favaはまだブラウザへのライブリロードのプッシュをサポートしていませんが、少なくともデータを更新して、次にページを確認するか、リロードをクリックしたときに最新の状態になるようにします。一部のコミュニティプロジェクトはさらに進んでいます。Beancountのいとこであるledgerの場合、あるユーザーは、ledgerデータをリアルタイムでGrafanaに公開する小さなサーバーを作成しました。これにより、Beancountでも同様のアプローチを取ることができることが示されています。基本的に、データをダッシュボードに継続的に供給するデーモンを構築します。 -
直接API統合: ファイルを介さずに、高度なユーザーは、銀行API(Plaidや地域のOpen Banking APIなど)に直接接続して、トランザクションを頻繁にプルする場合があります。意欲のある個人は、(適切なレート制限付きで)ループで「ライブ」インポートをスクリプト化できます。効果的に数分ごとに銀行に新しいデータをポーリングします。_「Plaid APIにサインアップして、同じ[自動化]をローカルで行う」_ことを妨げるものは何もありません。新しいトランザクションは、到着するたびにBeancountファイルに追加できます。このアプローチを使用すると、Favaは、商用アプリの最新のフィードに匹敵する、アカウントのリアルタイムダッシュボードになります。
Favaでのデータ更新: データを更新したら、Favaに表示するのは簡単です。ブラウザの更新(F5)またはリロードバナーをクリックすると、最 新の台帳の状態がロードされます。クリックしたくない場合は、 --debug
でFavaを実行すると、拡張機能の開発用の自動リロードが有効になり、変更時にページの即時リロードを強制するために使用されています。あるいは、カスタムフロントエンドを構築している場合は、台帳から最新の残高などをスケジュールに従って返す小さなAPIをポーリングさせることができます。
インスタント計算: Beancountの高速解析は、台帳ファイルを数分ごとに更新しても、データの取得→ファイルの更新→Favaのリロードまでのターンアラウンドが高速であることを意味します。たとえば、あるユーザーは、ファイルを編集した後、Favaをリロードするのは「ほとんど気づかれない…妥当なサイズの台帳では間違いなく1秒未満」であると指摘しています。したがって、Favaウィンドウを開いたままにして、定期的に更新を押してライブダッシュボードを模倣できます。(真にライブのエクスペリエンスを得るには、ブラウザを自動的に更新するか、ブラウザのN秒ごとの更新機能を使用する小さなスクリプトを作成できます。)
調整とアラート: リアルタイムデータを信頼するには、残高を頻繁に調整することも必要です。Beancountは、残高アサーションと 「最新」インジケーター でこれを簡単にします。実際、Favaは特定メタデータでマークするとアカウントの横に色付きのインジケーターを提供します(たとえば、アカウントを fava-uptodate
メタデータでマークすると、最後のエントリが最近の残高チェックであるかどうかに応じて、Favaは赤/黄/緑で色分けします)。これは、台帳のアカウント残高が銀行からの最新の明細書と一致するかどうかをすばやく確認するために使用できます。ニアリアルタイムの設定では、毎日の残高チェックを自動化する場合があります(したがって、毎朝、台帳には各アカウントの銀行からの昨日の期末残高が含まれます)。Favaのインジケーターは、自動インポートで何か見逃したものがあるか、不一致があるかどうかを示し、「ライブ」データが正確であるという確信を与えます。
自動化の例: 毎日のキャッシュフローの更新が必要だとします。毎晩午前3時に実行されるcronジョブを設定できます。これにより、銀行のAPIを使用して過去1日間のトランザクションを取得し、それらを import_today.beancount
に書き込み、そのファイルをメインの台帳に追加するPythonスクリプトが実行されます。また、一日の終わりの残高アサーションも書き込みます。目を覚ますと、Favaを開きます–昨日までのすべてのトランザクションが表示され、当月の収入/支出が更新されていることがわかります。日中に支出を行った場合は、手動で追加する(たとえば、電話のFavaの新しいトランザクションフォームを使用)か、夜間のインポートを待ちます。このハイブリッドアプローチ(ほとんどが自動化され、アドホックを手動で追加する機能)は、ほぼリアルタイムの画像を提供します。別のアプローチは、Favaの仕訳ページを開いたままにして、それをレジスターとして使用することです。支出するときに、トランザクションをすばやく記録します(小切手帳に入力するように)–そうすれば、あなたはリアルタイムフィードになり ます。これはより手動ですが、一部のユーザーはその認識を楽しんでいます。手動の手順なしで真の ストリーミング 更新を行うには、スクリプトを作成し、場合によってはサードパーティAPIを使用する必要があります。
要約すると、Beancountのインポート自動化とFavaの高速更新を組み合わせることで、ニアリアルタイムの財務データを取得できます。QuickBooks(銀行フィードを自動的にプルする)のようなサービスと同じレベルのライブフィードを簡単に実現できるわけではありませんが、可能です –そして重要なことに、プロセスを完全に制御し、透過性を維持できます。プレーンテキスト会計の提唱者が指摘したように、事前に少し努力することで、_「商用ソリューションよりもはるかに優れており、はるかに柔軟で拡張可能」_な自動化されたシステムが得られます。次のセクションでは、Favaの可視化機能が、この最新のデータをすぐに理解し、生のトランザクションをインサイトに変える方法を見ていきます。
Favaの可視化機能(キャッシュフロー、トレンド、リアルタイム検査)
(GitHub - beancount/fava: Fava - web interface for Beancount) Favaの損益計算書レポート(Web UI内)は、収入と支出の構成をすばやく理解するためのツリーマップ(写真)やサンバーストチャートなどの豊富な可視化をサポートしています。このツリーマップでは、各長方形は金額によってサイズが決定される費用のカテゴリを表しています。家賃(大きな緑色のブロック)が費用を支配していることがすぐにわかります。上部のフィルターバーとコントロール(右上)を使用すると、通貨、チャートの種類、および期間(たとえば、月次データの表示)を変更できます。Favaは、財務データのトレンドを把握するのに役立つ折れ線グラフ(たとえば、時間の経過に伴う純資産)と棒グラフ(たとえば、月ごとの収入と支出)も提供します。
Favaの最大の強みの1つは、台帳データを視覚的でインタラクティブなレポートに即座に変換することです。台帳がロードされるとすぐに、Favaはキャッシュフローとトレンドを一目で理解しやすくするチャートを生成します。
-
収入と支出のツリーマップ/サンバースト: 損益計算書ページで、Favaは収入と支出を ツリーマップ または サンバースト 図として表示できます。これらは、「一目でわかる」キャッシュフローの可視化に最適です。たとえば、毎月の費用がツリーマップとして表示される場合、各長方形の面積は各費用カテゴリの大きさに対応します。大きなブロックは、ほとんどのお金がどこに使われたか(例:家賃または住宅ローン、税金など)をすぐに示し、小さなブロックは少額の費用を示します。これは、支出の トレンドを把握 するのに非常に役立 ちます。たとえば、「外食」ブロックが毎月大きくなっている場合は、視覚的に気づくでしょう。サンバーストチャートに切り替えて、階層的な内訳を確認できます(たとえば、外側のリングは、食品カテゴリ内の食料品とレストランなどのサブカテゴリを表示する場合があります)。これらのチャートは、フィルタリングした期間(1か月、年初から現在までなど)に合わせて更新され、その期間のインスタントキャッシュフローの可視化を提供します。プレーンテキスト会計フォーラムのユーザーは、次のように述べています。「私は収入と支出のツリーマップをよく利用しています。彼らは私たちの財政的な動きを視覚的に把握するのに役立ちます。」 –このような即時の理解は、まさにFavaのチャートが目指しているものです。
-
時間の経過に伴う純資産と残高: Favaは、時間の経過に伴う純資産の折れ線グラフ(「貸借対照表」または「統計」ページ)を提供します。このチャートは、各時点での資産から負債を引いた合計をプロットします(日、週、または月ごと)。これは、トレンドを把握するために非常に貴重です。財政の軌跡(たとえば、着実に上昇、または特定の時期に落ち込み)を確認できます。投資がある場合は、原価と市場の価値の表示を切り替えることができます(価格データが記録されている場合)。たとえば、市場価値での純資産は株価で変動する可能性がありますが、原価ではよりスムーズになる可能性があります。Favaは、時間の経過に伴う勘定科目の残高も表示できます。勘定科目(たとえば、Assets:Bank:Checking)をクリックすると、勘定科目のページには、その勘定科目の残高履歴のグラフが表示されます。現金の勘定科目がどのように動いているかをすぐに調べることができます。これは事実上、キャッシュフローグラフです(残高線の傾きは正味キャッシュフローを示します)。トレンドが低下している場合は、その期間に稼ぎよりも多く費やしていることがわかります。これらのトレンドを調べることで、「毎年12月には貯蓄が減少する(休日の費用)」や「今四半期に投資が急増した」などのパターンを把握できる場合があります。
-
定期的な比較のための棒グラフ: 損益計算書ビューには、「月次利益」、「月次収入」、「月次支出」などのタブがあります。これらを選択すると、月ごとの棒グラフが表示されます。たとえば、月次正味利益は、毎月の黒字/赤字を棒として表示し、月ごとのパフォーマンスを簡単に比較できるようにします。外れ値をすばやく識別できます(たとえば、4月の大きな負の棒は、その月に異常な損失/費用が発生したことを意味します)。同様に、「月次支出」棒グラフは、月ごとのカテゴリごとに費用を積み重ねるか、グループ化するため、どのカテゴリが変動するかを確認できます。これは、時間の経過に伴うトレンドを把握するのに最適です。たとえば、「旅行」費用が毎年夏に急増したり、「光熱費」の請求書が冬に高くなったりすることに気づく場合があります。Favaは基本的に、予算アプリ(トレンドの追跡)の機能の一部を提供しますが、(カテゴリとロールアップの方法を定義するため)完全にカスタマイズできます。
-