メインコンテンツへスキップ
Beancount.io Logo

将来の取引の予測

将来の日付の収入、支出、ローン返済を含む、独立した検証済みのBeancountシナリオ台帳を作成します。

将来の日付の取引を別のシナリオ台帳に置くことで、財務レポートで現金、支出、負債を予測できます。このチュートリアルでは、通常のBeancountエントリと固定の計画期間を使用します。実績の帳簿は、仮定から分離されたままです。

互換性(2026年9月7日確認): この例は、標準のBeancount 3.2.3、beanquery 0.2.0Fava 1.30.16でテストされています。そのFavaリリースには予測プラグインは含まれていません。Beancount.ioのカスタムソースにはfava.plugins.forecast実装が含まれていますが、それは別のランタイムであり、ソースの入手可能性はお客様のアカウントにデプロイされたバージョンを保証するものではありません。以下のポータブルなワークフローには拡張機能は不要です。

ステップ1: 予測プラグインの有効化

このワークフローではプラグインの有効化はスキップしてください。 テスト済みの標準インストールにplugin "fava.plugins.forecast"を追加すると、インポートエラーが発生します。一般的なプラグインの設定については、プラグインガイドを参照してください。台帳がモジュールを読み込む前に、そのモジュールが実際にインストールされている必要があります。

前提条件: ローカルのPython環境にbeancount==3.2.3beanquery==0.2.0fava==1.30.16がインストールされていること。固定されたFavaセットアップに従って、その環境を作成してください。以下の3つのファイルをすべて同じディレクトリに保存し、そこでコマンドを実行してください。

books.beancountを、この完全な例のスナップショットで作成します。基準日は2023年12月31日で、開始取引の後です。当座預金は10,000.00 USD、自動車ローンの未返済元本は14,400.00 USDです。純資産がこの簡略化された開始スナップショットのバランスをとっています。

; books.beancount — realized balances as of 2023-12-31
option "operating_currency" "USD"
2023-12-31 open Assets:Checking USD
2023-12-31 open Liabilities:Auto-Loan USD
2023-12-31 open Equity:Opening-Balances USD
2023-12-31 open Income:Salary USD
2023-12-31 open Expenses:Housing:Rent USD
2023-12-31 open Expenses:Food:Groceries USD
2023-12-31 open Expenses:Health:Gym USD
2023-12-31 open Expenses:Insurance:Auto USD
2023-12-31 open Expenses:Transportation:Interest USD
 
2023-12-31 * "Opening snapshot"
  Assets:Checking                  10000.00 USD
  Liabilities:Auto-Loan            -14400.00 USD
  Equity:Opening-Balances           4400.00 USD

scenario.beancountを計画のエントリポイントとして作成します。その2つのインクルードが、実績スナップショットと次に作成する仮定を読み込みます。Beancountは、このファイルからの相対パスでインクルードパスを読み取ります。

; scenario.beancount — planning entry point
option "title" "January 2024 planning scenario"
option "operating_currency" "USD"
include "books.beancount"
include "scenario-2024-01.beancount"

scenario.beancountまたはscenario-2024-01.beancountbooks.beancountからインクルードしないでください。実績のエントリポイントは、その日付が過ぎた後でも、計画された取引を読み込んではいけません。

ステップ2: 予測取引の作成

scenario-2024-01.beancountを、この最初のエントリで作成します。後で説明する4つのシナリオブロックを、それぞれ1回ずつ同じファイルに追加します。これらはコンテキスト上の取引ブロックです。その勘定科目の宣言はbooks.beancountから来ており、scenario.beancountを通じて検証します。

2024-01-01 ! "Scenario: January rent" #forecast
  Expenses:Housing:Rent              2500.00 USD
  Assets:Checking                  -2500.00 USD

!フラグはレビュー用の取引を示します。#forecastは通常の取引タグです。どちらも繰り返しを作成したり、レポートから取引を除外したりしません。インクルードを制御するのは別のエントリポイントです。このタグは、レビュー中に識別できるように、計画されたエントリにのみ使用してください。

予測構文の理解

日付のある各エントリは1つの発生を表します。[MONTHLY]のような説明テキストは、標準のBeancountでは繰り返し効果がありません。古いUNTILREPEATSKIP命令は、コア言語ではなく、カスタムプラグインの慣例に属します。このワークフローでは、意図した日付を明示的に表現します。

シナリオは**2024年1月1日から31日まで(両端を含む)**を対象としています。計画されたすべての日付は、固定の基準日より後で、2月1日より前です。これらの過去の日付により、この例は再現可能になります。今日の日付に依存するものはありません。これを応用する場合は、新しい基準日と有限の期間を選んでから、エントリを追加してください。

頻度

計画期間内の各支払期日に対して、1つの取引を記述します。完全な1月の例では、次のルールを使用します:

項目スケジュール2024年1月に含まれる日付
家賃毎月1日1月1日
食料品1月1日から7日ごと1月1日、8日、15日、22日、29日
給与1月5日から14日ごと1月5日、19日
ジム毎月15日1月15日
ローンの支払い毎月25日1月25日
自動車保険1月15日から3暦月ごと1月15日。次の支払いは4月15日で、この期間外です。

他の日次または年次の計画については、同じ方法で実際の支払期日を列挙してください。31日や2月29日などの日付については、スケジュールを延長する前にポリシーを設定してください。黙って移動したり、すべての月が同じ日数であると想定したりしないでください。

条件(オプション)

1. 終了日を明示的に設定する

ジムの会員資格が2024年12月31日に終了するとします。その1月の発生は以下の通りです。1月のシナリオは1月31日で終了するため、2月から12月のエントリは含まれません。期間を延長する場合は、12月15日までの各支払いを記述し、そこで停止してください。

2024-01-15 ! "Scenario: gym membership" #forecast
  Expenses:Health:Gym                  80.00 USD
  Assets:Checking                    -80.00 USD

2. 発生回数を制限し、ローン元本と利息を分離する

自動車ローンに残り36回の支払いがあるとします。この1月の期間には、最初の支払いのみを含めてください。この仮定の分割払いについては、450.00 USDの現金支払いが400.00 USDの元本50.00 USDの利息で構成されると仮定します。これらはシナリオの仮定です。後の分割払いは生成されません。

2024-01-25 ! "Scenario: car loan payment 1 of 36" #forecast
  Liabilities:Auto-Loan               400.00 USD
  Expenses:Transportation:Interest     50.00 USD
  Assets:Checking                   -450.00 USD

正の負債転記により、負債残高は**−14,400.00 USDから−14,000.00 USDに減少します。現金は450.00 USD**減少し、50.00 USDだけが費用です。400.00 + 50.00 - 450.00 = 0であるため、転記はバランスが取れています。負の負債転記は負債を増加させます。

裏付けとなるスケジュールなしに、同じ元本/利息の分割を36回すべての支払いに繰り返さないでください。将来の利息と最終支払いは異なる場合があります。この例を拡張するときは、貸し手の支払いスケジュールを使用してください。費用認識と債務返済の区別については、償却を参照してください。

3. 不規則な間隔を実際の日付として記述する

1月5日開始の隔週給与の場合、1月の日付は1月5日と1月19日です。次の発生は2月2日で、このシナリオの外です。隔週は、暦月に2回ではなく、14日ごとを意味します。

2024-01-05 ! "Scenario: salary" #forecast
  Assets:Checking                   3000.00 USD
  Income:Salary                    -3000.00 USD
 
2024-01-19 ! "Scenario: salary" #forecast
  Assets:Checking                   3000.00 USD
  Income:Salary                    -3000.00 USD

実践例: 月次予算

以下の食料品と自動車保険のエントリをscenario-2024-01.beancountに追加して、月次予算を完成させます。上記の家賃、ジム、ローンの支払い、および両方の給与エントリと合わせて、11件の計画された取引になります。

2024-01-01 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-08 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-15 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-22 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-29 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-15 ! "Scenario: quarterly car insurance" #forecast
  Expenses:Insurance:Auto             450.00 USD
  Assets:Checking                   -450.00 USD

両方のエントリポイントを検証し、それらの期末残高を照会します。date < 2024-02-01は、1月のすべての転記を含みます。帳簿のクエリは、固定の基準日境界date < 2024-01-01を使用します。

bean-check books.beancount
bean-check scenario.beancount
bean-query books.beancount "SELECT account, sum(position) WHERE date < 2024-01-01 GROUP BY account ORDER BY account"
bean-query scenario.beancount "SELECT account, sum(position) WHERE date < 2024-02-01 GROUP BY account ORDER BY account"

両方のbean-checkコマンドが正常に終了するはずです。クエリ結果を次の独立した計算と照合してください:

結果実績帳簿、12月31日1月シナリオ、1月31日
当座預金10,000.00 USD10,000 + 6,000 − 2,500 − 750 − 80 − 450 − 450 = 11,770.00 USD
ローン残高−14,400.00 USD−14,400 + 400 = −14,000.00 USD
給与収入の転記0.00 USD−6,000.00 USD
総費用の転記0.00 USD2,500 + 750 + 80 + 450 + 50 = 3,830.00 USD

1月の予測利益は2,170.00 USDです: 6,000の収入から3,830の費用を差し引いた額です。当座預金は1,770.00 USD増加します。これは、追加の400の元本返済が利益ではなく負債を減らすためです。

標準のFavaでシナリオを開きます:

fava scenario.beancount

FavaのTimeフィルタを2024-01に設定します。その時間フィルタリングは、前期の資産および負債の残高を当期に繰り越し、後のエントリを削除します。貸借対照表で11,770.00 USDの現金と14,000.00 USDの未返済負債を確認してください。損益計算書には2,170.00 USDの予測利益が表示されるはずです。代わりにbooks.beancountを開くと、実績スナップショットが表示されます。

トラブルシューティングとベストプラクティス

  • 古いプラグインのインポートエラー: このポータブルなワークフローを使用する場合は、有効化行を削除してください。標準のFavaインストールでは、Beancount.ioのカスタムモジュールは提供されません。
  • 不明な勘定科目またはインクルードファイルの欠落: 3つのファイルすべてを同じディレクトリに保存し、開始タグをコピーし、シナリオフラグメント単独ではなくscenario.beancountを検証してください。
  • Favaに予測が表示されない: scenario.beancountを読み込み、Timeフィルタを2024-01に設定してください。タグや説明文ではエントリは生成されません。
  • 予期しない残高: 11の計画された日付と金額を表と比較してください。発生を2回読み込むと、すべての取引がバランスしていても、財務上の効果が2倍になります。
  • 予測を分離しておく: 通常のフラグ、タグ、将来の日付は、エントリがフィルタリングされていないレポートに影響を与えるのを防ぎません。実際の結果にはbooks.beancountを使用してください。支払いが発生したら、その実際の金額をそこに記録し、次のシナリオから対応する仮定を削除して、二重計上を防いでください。
  • 期間をレビューする: シナリオを保存するときは、日付入りのスナップショットを保持してください。終了日を延長するということは、特定の発生を追加し、ローンの分割、解約日、丸めを再度確認することを意味します。

出典: https://beancount.io/ja/docs/Tips/forecast-plugin