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

Beancount における在庫管理

Beancount の在庫システムは、株式、投資信託、外国為替など、時間経過とともに売買される資産を追跡するための強力な機能です。これにより、キャピタルゲインの計算やポートフォリオのパフォーマンスを理解するために不可欠な、正確なコストベースの追跡が可能になります。このチュートリアルでは、レジャーで在庫を管理するためのコアメカニズムについて説明します。

コアコンセプト

inventories

その中心となる在庫管理は、ポジションの追跡を中心に展開します。「ポジション」とは、単に口座で保有されているコモディティの金額のことです。Beancount は、2 つの基本的なタイプのポジションを区別します。

ポジションタイプ

  1. 単純なポジション (コストなし): これは標準的な残高の記帳です。取得コストに関連付けられていないコモディティの金額を表します。現金や単純な残高のアサーションに適しています。

    Assets:Bank:Checking      100.00 USD
  2. コストベース付きのポジション: このタイプのポジションには、ユニット数とコモディティだけでなく、取得したコストも含まれます。これが在庫追跡の基礎です。コストは中括弧 {} で指定されます。

    Assets:Invest:VTSAX      10 VTSAX {100.00 USD, "lot-1"}

    この例では、VTSAX を 10 ユニット保有しています。各ユニットは 100.00 USD のコストで取得されました。この特定の株式のバッチは「ロット」として識別されます。

在庫オペレーション

在庫に対して実行できる主なオペレーションは 2 つあります。

  1. 増強 (在庫への追加): コモディティを購入すると、在庫が増強されます。特定のユニット数とコストベースで新しいロットを作成します。

    2024-01-15 * "Buy shares"
    Assets:Invest:STOCK 50 STOCK {25.00 USD, "lot-1"}
    Assets:Bank:Checking -1250.00 USD

    ここでは、STOCK を 1 ユニットあたり 25.00 USD で 50 ユニット購入します。これにより、Assets:Invest:STOCK 口座にロットが作成されます。

  2. 削減 (在庫からの削除): コモディティを販売すると、在庫が削減されます。どのロットから販売しているかを指定する必要があります。これは、中括弧内に一致する情報を提供することで行われます。

    2024-01-20 * "Sell shares"
    Assets:Invest:STOCK -25 STOCK {25.00 USD}
    Assets:Bank:Checking 625.00 USD

    このトランザクションでは、1 ユニットあたり 25.00 USD で購入したロットから STOCK を 25 ユニット販売しています。

記帳方法

在庫を削減する場合、複数のロットが一致する場合や、一致があいまいな場合に、Beancount はどの特定のロットから引き出すかを決定するためのルールが必要です。このルールは「記帳方法」と呼ばれます。ファイル全体にデフォルトの方法を設定するか、各口座に 1 つ指定できます。

1. STRICT (デフォルト)

STRICT メソッドはデフォルトで最も安全な記帳方法です。明示的で明確なマッチングを強制します。

2024-01-01 open Assets:Invest:STOCK "STRICT"
  • 正確なロットの一致が必要: 販売するロットを一意に識別するために、削減の記帳 ({...}) で十分な情報を提供する必要があります。
  • あいまいな一致に対するエラー: 提供された情報が複数のロットと一致する場合、Beancount はエラーを発生させ、より具体的に指定するように強制します。
  • 例外: 削減の記帳が口座で保有されているユニットの総数を正確に削除する場合、空のコスト指定子 ({}) が許可されます。

2. FIFO (先入れ先出し法)

FIFO メソッドは、最初に利用可能な最も古いロットに対して自動的に削減を記帳します。

2024-01-01 open Assets:Invest:STOCK "FIFO"
  • 自動解決: 最も古い一致するロットを選択して、あいまいさを解決します。
  • 時系列的なマッチング: これは、最も長く保有している資産を販売していると仮定する一般的な会計方法です。これは、多くの国で税務上の目的で必要な方法です。

3. LIFO (後入れ先出し法)

LIFO メソッドは FIFO の反対です。最初に利用可能な最新のロットに対して削減を記帳します。

2024-01-01 open Assets:Invest:STOCK "LIFO"
  • 逆時系列的な順序: 削減基準に一致する最近取得したロットを選択します。
  • 税の最適化: 一部の法域では、このメソッドを使用して税の最適化を行うことができます。たとえば、最初に最も高いコストベースの株式を販売して、キャピタルゲインを最小限に抑えます。

4. NONE

NONE メソッドは、ロットのマッチングを完全に無効にします。

2024-01-01 open Assets:Invest:STOCK "NONE"
  • ロットのマッチングなし: Beancount は、削減を増強に一致させようとしません。
  • 混合符号を許可: これにより、口座は同じコモディティのプラスとマイナスの残高を同時に保持できます。この動作は、Ledger CLI ツールがコモディティを処理する方法に似ています。

ロットの指定

「ロット」とは、特定の時点と価格で取得されたコモディティの特定のブロックです。ポジションを作成または削減するときに、ロットの属性を詳細に指定できます。

完全な指定

在庫を増強する (購入する) ときは、ロットに対して最大 3 つの属性を指定できます。

Assets:Invest:STOCK  10 STOCK {
100.00 USD, # コストベース (ユニットあたりのコスト)
2024-01-15, # 取得日
"lot-identifier" # 一意の文字列ラベル
}

3 つすべてがオプションですが、少なくともコストベースを提供することが標準的な方法です。

マッチング方法

在庫を削減する (販売する) ときは、同じ構文を使用して、どのロットから販売するかを指定します。

  • コストによるマッチング: これは最も一般的な方法です。

    Assets:Invest:STOCK  -5 STOCK {100.00 USD}
  • 日付によるマッチング: コストが同一の場合は、取得日を使用してあいまいさを解消できます。

    Assets:Invest:STOCK  -5 STOCK {2024-01-15}
  • ラベルによるマッチング: ラベルは、ロットを識別するための確実な方法を提供します。

    Assets:Invest:STOCK  -5 STOCK {"lot-identifier"}
  • 任意のロットとのマッチング: 空の中括弧のセット {} は、利用可能な任意のロットと一致します。これは、特定のロットが自動的に選択される FIFO または LIFO 記帳でよく使用されます。

    Assets:Invest:STOCK  -5 STOCK {}

価格の取り扱い

コストベース ({}) と 価格 (@) の違いを理解することが重要です。これらは異なる目的を果たし、互換性はありません。

価格 vs コスト

  • {cost}: 資産の 取得コスト を定義します。これは在庫ロット自体の一部であり、削減の記帳とキャピタルゲインの計算に使用されます。
  • @ price: トランザクション時の 市場価格 を記録するアノテーションです。通貨換算や、特定の日付の市場価値を記録するために使用されます。

3 つのシナリオを以下に示します。

  1. 価格アノテーション (換算): @ を使用して、ある通貨から別の通貨に換算します。

    Assets:Forex     1000 USD @ 0.85 EUR
  2. コストベース (取得): 資産を購入するときに {} を使用して、コストを確立します。

    Assets:Invest    10 STOCK {100.00 USD}
  3. 両方 (価格記録付きの販売): 資産を販売するときは、{} を使用して販売するロットを識別し、@ を使用して販売価格を記録します。これにより、キャピタルゲインの自動計算が可能になります。

    Assets:Invest    -10 STOCK {100.00 USD} @ 105.00 USD

    このエントリは、1 株あたり 100.00 USD のコストで 10 株の STOCK を 1 株あたり 105.00 USD の販売価格で販売します。

価格の使用規則

  1. 価格アノテーション (@) は、どのロットが記帳されるかに影響を与えません。ロットのマッチングは、コストベース ({}) と口座の記帳方法によってのみ処理されます。
  2. @ 記号は、次の目的でのみ使用されます。
  • 通貨換算。
  • トランザクション時の資産の市場価値の記録。
  • キャピタルゲイン計算のための販売価格の提供。

設定

記帳方法は、グローバルに設定するか、口座ごとに設定できます。

グローバルな記帳方法

option ディレクティブを使用して、Beancount ファイル全体のデフォルトの記帳方法を設定できます。

option "booking_method" "STRICT"

使用可能なオプションは、"STRICT""FIFO""LIFO"、および "NONE" です。

口座ごとのオーバーライド

多くの場合、口座ごとに異なる方法を使用すると便利です。たとえば、退職口座には FIFO を使用し、課税対象の証券口座には STRICT を使用して、特定の税務ロットを確実に販売することができます。口座を開設するときに、記帳方法を設定できます。

2024-01-01 open Assets:Retirement:401K "FIFO"
2024-01-01 open Assets:Taxable:Stock "STRICT"

ベストプラクティス

  1. 在庫の整理: レジャーをクリーンでシンプルに保つために、保有する一意のコモディティごとに個別の口座を使用することを強くお勧めします。

    # GOOD: コモディティごとに口座を分離する
    Assets:Invest:VTSAX ; ここには VTSAX ポジションのみ
    Assets:Invest:VFIAX ; ここには VFIAX ポジションのみ

    異なる株式やファンドを同じ口座に混在させないでください。在庫管理が複雑になります。

  2. ロット管理:

  • 特に、税務上の損失の刈り取りや従業員の株式交付金などの特定のトランザクションには、ロットに意味のあるラベルを使用します。

    Assets:Invest:STOCK  10 STOCK {100.00 USD, "tax-loss-harvest-2024"}
  • コメントで取引を文書化します。これにより、レジャーが後で読みやすく理解しやすくなります。

    Assets:Invest:STOCK  -10 STOCK {100.00 USD} @ 110.00 USD ; Gain: 10%
  1. デバッグ: エラーや予期しない動作が発生した場合、Beancount は在庫の状態を検査するためのツールを提供します。
  • 在庫状態の確認: bean-doctor ツールを使用すると、ファイル内の任意の時点ですべての在庫の正確な状態を表示できます。

    トランザクションの直後の行番号で <LINENO> を置き換えて、その影響を確認します。

  • ロットのマッチングの検証: bean-check ツールはファイル全体を検証します。STRICT モードでのあいまいなロットの一致など、記帳エラーを検出します。

[
{
"key": "copyright",
"description": "Copyright",
"message": "© {year} Blockeden Inc. 無断複写・転載を禁じます。"
}
]