メインコンテンツまでスキップ

BeancountとFavaによるスクリプト可能なワークフロー

Beancount(プレーンテキストの複式簿記会計ツール)とFava(そのウェブインターフェース)は、高度に拡張可能でスクリプト可能です。これらの設計により、Pythonスクリプトを書くことで、財務タスクの自動化、カスタムレポートの生成、アラートの設定が可能です。あるユーザーの言葉を借りれば、「データが非常に便利な形式で存在し、自分の好きなように自動化できるのが本当に気に入っています。ディスク上のファイルのようなAPIはなく、統合が簡単です。」このガイドでは、初心者向けの自動化から高度なFavaプラグインまで、スクリプト可能なワークフローの作成について説明します。

はじめに:PythonスクリプトとしてBeancountを実行する

scriptable-workflows

具体的なタスクに入る前に、Beancountがインストールされていることを確認してください(例:pip install beancount経由)。BeancountはPythonで書かれているため、独自のスクリプトでライブラリとして使用できます。一般的なアプローチは次のとおりです。

  • Beancountのレジャーをロードする:Beancountのローダーを使用して、.beancountファイルをPythonオブジェクトに解析します。例えば:

    from beancount import loader
    entries, errors, options_map = loader.load_file("myledger.beancount")
    if errors:
    print("Errors:", errors)

    これにより、entries(トランザクション、残高など)のリストと、メタデータを含むoptions_mapが取得されます。すべてのアカウント、トランザクション、残高がコード内でアクセスできるようになります。

  • Beancount Query Language(BQL)を活用する:手動で反復処理する代わりに、SQLのようなクエリをデータに対して実行できます。たとえば、月ごとの合計費用を取得するには、クエリAPIを使用できます。

    from beancount.query import query
    q = query.Query(entries, options_map)
    result = q.query("SELECT month, sum(position) WHERE account ~ 'Expenses' GROUP BY month")
    print(result)

    これは、Beancountのクエリシステムを使用してデータを集計します。(内部的には、これはbean-queryコマンドが行うことと似ていますが、ここではスクリプトで使用しています。)実際、Beancountの作者は、ファイルをロードし、Python API経由で直接run_query()を呼び出すことで、ループ内で外部コマンドを呼び出す必要がないと述べています。

  • プロジェクト構造を設定する:スクリプトをレジャーと一緒に整理します。一般的なレイアウトは、インポーター(外部データを取得/解析するため)、レポートまたはクエリ(分析スクリプト用)、およびドキュメント(ダウンロードされたステートメントを保存するため)のディレクトリを持つことです。たとえば、あるユーザーは次のように保持しています。

    • importers/ – カスタムPythonインポートスクリプト(テスト付き)、
    • queries/ – レポートを生成するスクリプト(python3 queries/...で実行可能)、
    • documents/ – ダウンロードされた銀行のCSV/PDFをアカウントごとに整理。

この設定により、スクリプトを手動で実行したり(例:python3 queries/cash_flow.py)、スケジュールしたり(cronまたはタスクランナー経由)して、ワークフローを自動化できます。

調整タスクの自動化

調整とは、レジャーが外部記録(銀行の明細書、クレジットカードのレポートなど)と一致することを確認することを意味します。BeancountのプレーンテキストレジャーとPython APIにより、このプロセスの多くを自動化できます。

トランザクションのインポートと照合(初心者)

初心者にとって、推奨されるアプローチは、Beancountのインポータープラグインを使用することです。Beancountのインポータープロトコルに従って、指定された形式(CSV、OFX、PDFなど)を解析し、トランザクションを生成する小さなPythonクラスを作成します。次に、bean-extractコマンドまたはスクリプトを使用して、これらのインポーターを適用します。

  • 銀行のCSV形式のインポーター(identify()extract()などのメソッドを持つPythonクラス)を作成します。Beancountのドキュメントには、ガイドと例が記載されています。
  • スクリプトまたはMakefile(justfileの例など)でbean-extractを使用して、新しいステートメントを解析します。たとえば、あるワークフローでは、~/Downloads内のすべてのファイルに対してbean-extractを実行し、トランザクションを一時ファイルに出力します。
  • 一時ファイルからトランザクションを手動で確認してメインレジャーにコピーし、bean-checkを実行して残高が調整されることを確認します。

このプロセスにはレビューのステップが含まれますが、エントリの解析とフォーマットの作業の多くは自動化されています。インポートスクリプトは、カテゴリを自動的に割り当てたり、不一致を検出するために残高のアサーション(期待される残高のステートメント)を設定したりすることもできます。たとえば、インポート後、2025-04-30 balance Assets:Bank:Checking 1234.56 USDのような行があり、期末残高をアサートします。bean-checkを実行すると、Beancountは_これらの残高アサーションがすべて正しいことを検証し_、トランザクションが欠落しているか重複している場合はエラーをフラグします。これはベストプラクティスです。ステートメント期間ごとに残高アサーションを自動生成して、未調整の差異をコンピューターに検出させます。

カスタム調整スクリプト(中級者)

より詳細な制御を行うには、銀行のトランザクションリスト(CSVまたはAPI経由)とレジャーエントリを比較するカスタムPythonスクリプトを作成できます。

  1. 外部データを読み取る:Pythonのcsvモジュール(またはPandas)を使用して、銀行のCSVファイルを解析します。データをトランザクションのリストに正規化します。たとえば、日付、金額、説明などです。
  2. レジャートランザクションをロードする:前に示したようにloader.load_fileを使用して、すべてのレジャーエントリを取得します。このリストを対象のアカウント(例:普通預金口座)およびステートメントの日付範囲でフィルタリングします。
  3. 比較して不一致を見つける
  • 外部トランザクションごとに、同一のエントリがレジャーに存在するかどうかを確認します(日付と金額、場合によっては説明で一致)。見つからない場合は、「新規」としてマークし、Beancount形式のトランザクションとして出力してレビューできるようにします。
  • 逆に、そのアカウントで外部ソースに表示されないレジャーエントリを特定します。これらは、データ入力エラーまたは銀行で決済されていないトランザクションである可能性があります。
  1. 結果を出力する:レポートを印刷するか、不足しているトランザクションを含む新しい.beancountスニペットを作成します。

例として、reconcile.pyと呼ばれるコミュニティスクリプトは、まさにこれを行います。Beancountファイルと入力CSVを指定すると、インポートする必要がある新しいトランザクションのリストと、入力にない既存のレジャーポスト(誤分類の兆候である可能性があります)が出力されます。このようなスクリプトを使用すると、毎月の調整は、それを実行し、提案されたトランザクションをレジャーに追加するのと同じくらい簡単になります。あるBeancountユーザーは、「すべての口座で毎月調整プロセスを実行し」、「データのインポートと調整における手作業の多くを排除するために、Pythonコードのコレクションを増やしている」と述べています。

ヒント:調整中は、Beancountのツールを活用して精度を高めます。

  • 前述のように、残高アサーションを使用して、アカウントの残高を自動的にチェックします。
  • 必要に応じて、padディレクティブを使用します。これにより、わずかな丸め誤差に対して自動的に相殺エントリが挿入されます(注意して使用してください)。
  • インポーターまたは調整ロジックの単体テストを作成します(Beancountはテストヘルパーを提供します)。たとえば、あるワークフローでは、サンプルCSVを取得し、期待されるトランザクションで失敗するテストを作成し、すべてのテストに合格するまでインポーターを実装しました。これにより、インポートスクリプトがさまざまなケースで正しく動作することが保証されます。

カスタムレポートとサマリーの生成

Favaは多くの標準レポート(損益計算書、貸借対照表など)を提供していますが、スクリプトを使用してカスタムレポートを作成できます。これらは、単純なコンソール出力から、豊富なフォーマットのファイルまたはチャートまでさまざまです。

レポートのデータを照会する(初心者)

基本的なレベルでは、Beancount Query Language(BQL)を使用してサマリーデータを取得し、印刷または保存できます。例えば:

  • キャッシュフローサマリー:クエリを使用して、正味キャッシュフローを計算します。「キャッシュフロー」は、特定の期間における特定のアカウントの残高の変化として定義できます。BQLを使用すると、次のようになります。

    SELECT year, month, sum(amount)
    WHERE account LIKE 'Income:%' OR account LIKE 'Expenses:%'
    GROUP BY year, month

    これにより、すべての収入と費用のポストが月ごとにネットされます。これは、bean-query CLIまたはPython API(前述のquery.Query)を介して実行し、結果をフォーマットできます。

  • カテゴリ別支出レポート:カテゴリごとの合計費用を照会します。

    SELECT account, round(sum(position), 2)
    WHERE account ~ 'Expenses'
    GROUP BY account
    ORDER BY sum(position) ASC

    これにより、カテゴリ別の費用のテーブルが生成されます。スクリプトで複数のクエリを実行し、結果をテキスト、CSV、またはJSONとして出力して、さらに処理できます。

あるユーザーは、「Favaまたはスクリプトで財務データを分析するのは簡単」であり、「クエリ言語を介してBeancountからデータを取り出し、Pandas DataFrameに入れてカスタムレポートを作成するために、1つのPythonスクリプトを使用している」と述べています。たとえば、クエリで月ごとの合計を取得し、Pandas/Matplotlibを使用して、時間経過に伴うキャッシュフローチャートをプロットできます。BQLとデータサイエンスライブラリを組み合わせることで、Favaがデフォルトで提供する以上のレポートを作成できます。

高度なレポート(チャート、パフォーマンスなど)

より高度なニーズに対応するために、スクリプトで投資パフォーマンスなどのメトリックを計算したり、視覚的な出力を生成したりできます。

  • 投資パフォーマンス(IRR/XIRR):レジャーにはすべてのキャッシュフロー(購入、販売、配当)が含まれているため、ポートフォリオのリターン率を計算できます。たとえば、投資アカウントのトランザクションをフィルタリングし、内部収益率を計算するスクリプトを作成できます。キャッシュフローデータに基づいてIRRを計算するためのライブラリ(または数式)があります。一部のコミュニティで開発されたFava拡張機能(PortfolioSummaryfava_investorなど)は、まさにこれを行い、投資ポートフォリオのIRRやその他のメトリックを計算します。スクリプトとして、一連の貢献/引き出しと期末値に対してIRR関数(NumPyまたは独自のものから)を使用できます。

  • 複数期間またはカスタムメトリック:毎月の貯蓄率(貯蓄と収入の比率)のレポートが必要ですか?Pythonスクリプトは、レジャーをロードし、すべての収入アカウントとすべての費用アカウントを合計し、貯蓄=収入-費用およびパーセンテージを計算できます。これにより、見栄えの良いテーブルが出力されたり、レコード用のHTML/Markdownレポートが生成されたりする可能性があります。

  • 視覚化:Favaの外部でチャートを生成できます。たとえば、スクリプトでmatplotlibまたはaltairを使用して、レジャーデータを使用して時間経過に伴う純資産チャートを作成します。レジャーにはすべての履歴残高が含まれているため(またはエントリを反復処理して蓄積できます)、時系列プロットを作成できます。これらのチャートを画像またはインタラクティブHTMLとして保存します。(アプリ内ビジュアルが必要な場合は、Fava _内_にチャートを追加する方法について、以下のFava拡張機能セクションを参照してください。)

**出力オプション:**レポートの配信方法を決定します。

  • 1回限りの分析の場合は、画面への印刷またはCSV/Excelファイルへの保存で十分な場合があります。
  • ダッシュボードの場合は、データを含むHTMLファイル(Jinja2のようなテンプレートライブラリを使用するか、単にMarkdownを記述する)を生成して、ブラウザーで開くことを検討してください。
  • Jupyter Notebookと統合して、インタラクティブなレポート環境を構築することもできますが、これは自動化よりも探索に適しています。

レジャーからアラートをトリガーする

スクリプト可能なワークフローのもう1つの強力な使用法は、財務データの条件に基づいてアラートを設定することです。レジャーは定期的に更新され(今後の請求書や予算などの日付の入った項目を含めることができます)、スクリプトでスキャンして重要なイベントの通知を受け取ることができます。

低い口座残高の警告

当座貸越を回避したり、最低残高を維持したりするために、アカウント(例:普通預金または貯蓄預金)がしきい値を下回った場合にアラートが必要になる場合があります。これを実装する方法は次のとおりです。

  1. 現在の残高を決定する:ローダーを介してentriesをロードした後、対象アカウントの最新の残高を計算します。これは、投稿を集計するか、クエリを使用することで実行できます。たとえば、特定のアカウントの残高に対してBQLクエリを使用します。

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

    これにより、そのアカウントの現在の残高(すべての投稿の合計)が返されます。または、Beancountの内部関数を使用して、貸借対照表を作成します。例えば:

    from beancount.core import realization
    tree = realization.realize(entries, options_map)
    acct = realization.get_or_create(tree, "Assets:Bank:Checking")
    balance = acct.balance # an Inventory of commodities

    次に、数値(例:balance.get_currency_units('USD')はDecimalを与える可能性があります)を抽出します。ただし、ほとんどの場合、クエリを使用する方が簡単です。

  2. しきい値を確認する:残高を事前定義された制限と比較します。下回っている場合は、アラートをトリガーします。

  3. 通知をトリガーする:これは、コンソールに警告を印刷するのと同じくらい簡単ですが、実際のアラートでは、メールまたはプッシュ通知を送信する場合があります。メール(smtplib経由)またはIFTTTやSlackのwebhook APIなどのサービスと統合して、アラートをプッシュできます。例えば:

    if balance < 1000:
    send_email("Low balance alert", f"Account XYZ balance is {balance}")

    (メールサーバーの詳細を使用してsend_emailを実装します。)

このスクリプトを毎日(cronジョブまたはWindowsタスクスケジューラ経由)実行すると、プロアクティブな警告が表示されます。レジャーを使用しているため、追加したばかりのトランザクション_すべて_を考慮することができます。

今後の支払い期限

Beancountを使用して請求書または締め切りを追跡する場合は、今後の支払いをマークし、スクリプトにリマインドさせることができます。Beancountで今後の義務を表す2つの方法:

  • イベント:Beancountは、任意の日付付きノートのeventディレクティブをサポートしています。例えば:

    2025-05-10 event "BillDue" "Mortgage payment due"

    これは残高には影響しませんが、ラベル付きの日付を記録します。スクリプトは、Event.type == "BillDue"(または選択したカスタムタイプ)のEventエントリのentriesをスキャンし、日付が今日から次の7日以内にあるかどうかを確認できます。ある場合は、アラート(メール、通知、またはポップアップ)をトリガーします。

  • 今後のトランザクション:一部の人は、スケジュールされた支払いなどのために、日付が未来のトランザクション(日付入り)を入力します。日付が経過するまで、これらは残高に表示されません(将来の日付の時点でレポートを実行しない限り)。スクリプトは、近い将来の日付のトランザクションを検索して一覧表示できます。

これらを使用して、実行時に間もなく期限が切れるタスクまたは請求書のリストを出力する「リマインダー」スクリプトを作成できます。GoogleカレンダーやタスクマネージャーなどのAPIと統合して、そこに自動的にリマインダーを作成する場合に使用します。

異常検知

既知のしきい値または日付を超えて、異常なパターンに対するカスタムアラートをスクリプト化できます。たとえば、通常毎月の費用が発生していない場合(請求書の支払いを忘れた場合など)、または今月のカテゴリの支出が異常に高い場合、スクリプトはそれをフラグすることができます。これには通常、最近のデータを照会し、履歴と比較することが含まれます(これは高度なトピックになる可能性があります。統計またはMLを使用する可能性があります)。

実際には、多くのユーザーは調整に依存して異常(予期しないトランザクション)を検出します。銀行の通知(各トランザクションのメールなど)を受信する場合は、スクリプトでそれらを解析し、自動的にBeancountに追加するか、少なくとも記録されていることを確認できます。ある熱心なユーザーは、銀行がトランザクションアラートメールを送信するように設定し、それを解析してレジャーに自動的に追加することを計画していました。この種​​のイベントドリブンアラートは、トランザクションが記録されないようにすることができます。

カスタムプラグインとビューによるFavaの拡張

Favaは、その拡張システムを通じてすでにスクリプト可能です。自動化またはレポートをWebインターフェイスに直接統合する場合は、PythonでFava拡張機能(プラグインとも呼ばれます)を作成できます。

**Fava拡張機能の仕組み:**拡張機能は、fava.ext.FavaExtensionBaseから継承するクラスを定義するPythonモジュールです。カスタムオプションを介してBeancountファイルに登録します。たとえば、MyAlerts(FavaExtensionBase)クラスを含むmyextension.pyファイルがある場合、レジャーに追加することで有効にできます。

1970-01-01 custom "fava-extension" "myextension"

Favaがロードされると、そのモジュールをインポートし、MyAlertsクラスを初期化します。

拡張機能はいくつかのことができます。

  • フック:Favaのライフサイクルのイベントにフックできます。たとえば、レジャーがロードされた後、after_load_file()が呼び出されます。これを使用して、チェックを実行したり、データを事前に計算したりできます。_Fava内_で低残高チェックを実装する場合は、after_load_fileが口座残高を反復処理し、警告を保存する可能性があります(ただし、UIに表示するには、FavaAPIErrorを発生させるか、Javascriptを使用して通知を表示するなど、もう少し作業が必要です)。
  • カスタムレポート/ページ:拡張機能クラスがreport_title属性を設定すると、Favaはサイドバーに新しいページを追加します。次に、そのページの内容のテンプレート(HTML/Jinja2)を提供します。これが、Favaがデフォルトで持っていないダッシュボードやサマリーなどの完全に新しいビューを作成する方法です。拡張機能は必要なデータを収集し(すべてのエントリ、残高などがあるself.ledgerにアクセスできます)、テンプレートをレンダリングできます。

たとえば、Favaの組み込みportfolio_list拡張機能は、ポートフォリオポジションを一覧表示するページを追加します。コミュニティの拡張機能はさらに進んでいます。

  • ダッシュボードfava-dashboardsプラグインを使用すると、カスタムチャートとパネル(Apache EChartsのようなライブラリを使用)を定義できます。実行するクエリのYAML構成を読み取り、Beancountを介して実行し、Favaに動的なダッシュボードページを生成します。本質的に、BeancountデータとJavaScriptチャートライブラリを結び付けて、インタラクティブな視覚化を作成します。
  • ポートフォリオ分析PortfolioSummary拡張機能(ユーザー提供)は、投資サマリー(アカウントのグループ化、IRRの計算など)を計算し、FavaのUIに表示します。
  • トランザクションレビュー:別の拡張機能であるfava-reviewは、時間の経過に伴うトランザクションのレビューに役立ちます(たとえば、レシートを見逃していないことを確認するため)。

自分で簡単な拡張機能を作成するには、FavaExtensionBaseをサブクラス化することから始めます。たとえば、ページを追加する最小限の拡張機能は次のようになります。

from fava.ext import FavaExtensionBase

class HelloReport(FavaExtensionBase):
report_title = "Hello World"

def __init__(self, ledger, config):
super().__init__(ledger, config)
# any initialization, perhaps parse config if provided

def after_load_file(self):
# (optional) run after ledger is loaded
print("Ledger loaded with", len(self.ledger.entries), "entries")

これをhello.pyに配置し、custom "fava-extension" "hello"をレジャーに追加すると、Favaは新しい「Hello World」ページを表示します(拡張機能がフックのみを使用しない限り、ページの内容を定義するためにtemplatesサブフォルダーにテンプレートファイルHelloReport.htmlも必要になります)。テンプレートは、拡張機能クラスに添付するデータを使用できます。FavaはJinja2テンプレートを使用するため、そのテンプレートでデータをHTMLテーブルまたはチャートにレンダリングできます。

注:Favaの拡張システムは強力ですが、「不安定」(変更される可能性があります)と見なされています。カスタムページを作成する場合は、Web開発(HTML/JS)にある程度の知識が必要です。目標が単にスクリプトまたは分析を実行することである場合は、外部スクリプトとして保持する方が簡単かもしれません。ワークフローに合わせて調整されたアプリ内エクスペリエンスが必要な場合は、Fava拡張機能を使用します。

サードパーティAPIとデータの統合

スクリプト可能なワークフローの利点の1つは、外部データを取り込むことができることです。一般的な統合を次に示します。

  • 為替レートと商品:Beancountは(レポートを決定的に保つために)価格を自動的にフェッチするように設計されていませんが、レートを提供する_Price_ディレクティブを提供します。これらの価格のフェッチを自動化できます。たとえば、スクリプトはAPI(Yahoo Finance、Alpha Vantageなど)に最新の為替レートまたは株価を照会し、価格エントリをレジャーに追加できます。

    2025-04-30 price BTC 30000 USD
    2025-04-30 price EUR 1.10 USD

    bean-price(現在はbeancountの傘下にある外部ツール)のようなツールがあり、毎日の見積もりをフェッチし、Beancount形式で出力します。毎晩bean-priceを実行して、prices.beancountインクルードファイルを更新するようにスケジュールできます。または、Pythonを使用します。たとえば、requestsライブラリを使用してAPIを呼び出します。_Beancountのドキュメントでは、上場資産の場合、「価格をダウンロードし、指示を書き出すコードを呼び出すことができる」と示唆しています。_つまり、スクリプトにルックアップを実行させ、price行を挿入させます。手動で行うのではなく。

  • 株式ポートフォリオデータ:為替レートと同様に、APIと統合して詳細な株価データまたは配当をフェッチできます。たとえば、Yahoo Finance API(またはyfinanceのようなコミュニティライブラリ)は、ティッカーの履歴データを取得できます。スクリプトは、所有する各株式の毎月の価格履歴でレジャーを更新し、市場価値の正確な履歴レポートを可能にする可能性があります。一部のカスタム拡張機能(_fava_investor_など)は、表示のためにオンザフライで価格データをプルしますが、最も簡単なのは、定期的に価格をレジャーにインポートすることです。

  • 銀行API(オープンバンキング/Plaid):CSVをダウンロードする代わりに、APIを使用してトランザクションを自動的にフェッチできます。Plaidのようなサービスは、銀行口座を集約し、トランザクションへのプログラムによるアクセスを許可します。高度な設定では、Pythonスクリプトを使用してPlaidのAPIを毎日新しいトランザクションをプルし、ファイルに保存することができます(またはレジャーに直接インポートします)。あるパワーユーザーは、Plaidがインポートパイプラインにフィードし、書籍をほぼ自動化するシステムを構築しました。彼らは、「Plaid APIにサインアップしてローカルで同じことを行うことを妨げるものは何もありません」と述べています。つまり、ローカルスクリプトを作成して銀行データを取得し、Beancountインポーターロジックを使用してレジャーエントリに解析できます。一部の地域では、銀行が提供するオープンバンキングAPIがあります。これらも同様に使用できます。

  • その他のAPI:予算ツールを統合したり(計画された予算をエクスポートしてBeancountの実際の予算と比較したり)、OCR APIを使用してレシートを読み取り、トランザクションに自動的に一致させたりする場合があります。スクリプトはPythonのエコシステムに完全にアクセスできるため、メールサービス(アラートの送信用)、Googleシート(例:毎月の財務メトリックでシートを更新)、メッセージングアプリ(Telegramボット経由でサマリーレポートを送信)など、あらゆるものを統合できます。

サードパーティAPIを使用する場合は、資格情報を保護し(APIキーの環境変数または構成ファイルを使用)、スクリプトでエラー(ネットワークの問題、APIのダウンタイム)を適切に処理することを忘れないでください。データをキャッシュすることが賢明な場合がよくあります(たとえば、フェッチされた為替レートを保存して、同じ履歴レートを繰り返し要求しないようにします)。

モジュール式で保守可能なスクリプトのベストプラクティス

スクリプト可能なワークフローを構築する際は、コードを整理して堅牢に保ちます。

  • モジュール性:異なる関心を異なるスクリプトまたはモジュールに分割します。たとえば、「データインポート/調整」対「レポート生成」対「アラート」の個別のスクリプトを用意します。ledger_import.pyledger_reports.pyなどのモジュールを含む、レジャー用の小さなPythonパッケージを作成することもできます。これにより、各部分を理解してテストすることが容易になります。

  • 構成:値をハードコーディングしないでください。アカウント名、しきい値、APIキー、日付範囲などの変数に、構成ファイルまたはスクリプトの先頭の変数を使用します。これにより、コードを深く編集することなく簡単に調整できます。たとえば、LOW_BALANCE_THRESHOLDS = {"Assets:Bank:Checking": 500, "Assets:Savings": 1000}を先頭に定義すると、アラートスクリプトはこのdictをループできます。

  • テスト:財務自動化をミッションクリティカルなコードとして扱います。複雑なロジックのテストを作成します。Beancountは、レジャー入力をシミュレートするために活用できるテストヘルパー(インポーターテスト用に内部で使用)を提供します。派手なフレームワークがなくても、ダミーのCSVと予想される出力トランザクションを用意し、インポートスクリプトが正しいエントリを生成することをアサートできます。pytestを使用している場合は、これらのテストを簡単に統合できます(Alex Wattがpytestをラップするjust testコマンドを介して行ったように)。

  • バージョン管理:レジャーとスクリプトをバージョン管理(git)下に保持します。これにより、バックアップと履歴が得られるだけでなく、制御された方法で変更を加えることが奨励されます。「財務スクリプト」のリリースにタグを付けたり、問題をデバッグするときに違いを確認したりできます。一部のユーザーは、時間の経過に伴う変更を確認するために、財務記録をGitで追跡することさえあります。リポジトリで機密データ(生のステートメントファイルやAPIキーなど)を無視するように注意してください。

  • ドキュメント:将来のあなたのためにカスタムワークフローをドキュメント化します。環境の設定方法、各スクリプトの実行方法、各スクリプトの実行内容を説明するリポジトリのREADMEは、数か月後に非常に役立ちます。また、コード、特に明白でない会計ロジックまたはAPIインタラクションについてコメントします。

  • Favaプラグインの保守:Fava拡張機能を作成する場合は、シンプルに保ちます。Favaは変更される可能性があるため、ターゲットを絞った機能を持つ小さな拡張機能は更新が容易です。ロジックを過度に複製することは避け、レジャーの変更に影響を受けやすいハードコーディングされた計算ではなく、Beancountのクエリエンジンまたは既存のヘルパー関数を可能な限り使用します。

  • セキュリティ:スクリプトは機密データを処理し、外部サービスに接続する可能性があるため、注意して扱います。APIキーを公開しないでください。また、安全なマシンで自動化を実行することを検討してください。ホスト型ソリューションまたはクラウド(GitHub ActionsのスケジュールやFavaを実行するサーバーなど)を使用する場合は、レジャーデータが保存時に暗号化されていること、およびプライバシーへの影響に満足していることを確認してください。

これらのプラクティスに従うことで、財務(およびツール自体)が進化しても、ワークフローが確実に信頼性を維持するようにします。最小限の微調整で、毎年再利用できるスクリプトが必要になります。

結論

BeancountとFavaは、技術に精通したユーザーが個人の財務追跡を完全にカスタマイズするための、強力で柔軟なプラットフォームを提供します。Pythonスクリプトを作成することで、明細書の調整などの面倒なタスクを自動化したり、ニーズに合わせた豊富なレポートを作成したり、タイムリーなアラートで財務状況を把握したりできます。基本的なものから高度なものまで、いくつかの例を取り上げました。単純なクエリとCSVインポートから始まり、本格的なFavaプラグインと外部API統合に移行しました。これらを実装するときは、単純なものから始めて徐々に構築します。いくつかの小さな自動化スクリプトでも、何時間もの作業を節約し、精度を大幅に向上させることができます。そして、すべてがプレーンテキストとPythonであるため、完全に制御できます。財務システムはあなたと共に成長し、特定のニーズに対応します。ハッピースクリプティング!

**出典:**上記の手法は、Beancountのドキュメントとコミュニティの経験から得られたものです。詳細については、Beancountの公式ドキュメント、コミュニティガイドとブログ、および便利なプラグインとツールへのリンクについては、Awesome Beancountリポジトリを参照してください。