Beancountの在庫システムは、株式、投資信託、外国通貨など、時間をかけて売買される資産を追跡するための強力な機能です。これは、キャピタルゲインの計算やポートフォリオのパフォーマンスを理解するために不可欠な原価基準の正確な追跡を可能にします。このチュートリアルでは、台帳で在庫を管理するための核となる仕組みを説明します。
基本概念
在庫管理の核心は、ポジションの追跡にあります。「ポジション」とは、単に口座内で保有されている商品の数量のことです。Beancountは、2つの基本的なタイプのポジションを区別します。
ポジションの種類
-
単純ポジション(原価なし): これは標準的な残高転記です。取得原価を伴わない、ある商品の数量を表します。現金や単純な残高アサーションに適しています。
Assets:Bank:Checking 100.00 USD -
原価基準付きポジション: このタイプのポジションは、ユニット数と商品に加えて、取得時の原価も含みます。これが在庫追跡の基礎です。原価は中括弧
{}内で指定します。Assets:Invest:VTSAX 10 VTSAX {100.00 USD, "lot-1"}この例では、
VTSAXを10ユニット保有しています。各ユニットは100.00 USDで取得されました。この特定の株式のバッチは「ロット」として識別されます。
在庫操作
在庫に対して実行できる主な操作は2つあります。
-
増加(在庫への追加): 商品を購入すると、在庫が増加します。特定のユニット数と原価基準を持つ新しいロットを作成します。
2024-01-15 * "株式購入" Assets:Invest:STOCK 50 STOCK {25.00 USD, "lot-1"} Assets:Bank:Checking -1250.00 USDここでは、
STOCKを50ユニット、1ユニットあたり25.00 USDで購入しています。これにより、Assets:Invest:STOCK口座にロットが作成されます。 -
減少(在庫からの除去): 商品を売却すると、在庫が減少します。どのロットから売却するかを指定する必要があります。これは、中括弧内に一致情報を提供することで行われます。
2024-01-20 * "株式売却" Assets:Invest:STOCK -25 STOCK {25.00 USD} Assets:Bank:Checking 625.00 USDこの取引では、1ユニットあたり25.00 USDで購入されたロットから
STOCKを25ユニット売却しています。
ブッキングメソッド
在庫を減少させる際、複数のロットが一致する場合や一致があいまいな場合に、どの特定のロットから引き出すかのルールをBeancountは必要とします。このルールは「ブッキングメソッド」と呼ばれます。ファイル全体のデフォルトメソッドを設定することも、口座ごとに指定することもできます。
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 {}
価格の扱い
原価基準({})と価格(@)の違いを理解することは非常に重要です。これらは異なる目的を果たし、互換性がありません。
価格と原価
{cost}: 資産の取得原価を定義します。これは在庫ロット自体の一部であり、減少のブッキングとキャピタルゲインの計算に使用されます。@ price: 取引時の市場価格を記録する注釈です。通貨換算や特定の日付の市場価値を記録するために使用されます。
以下に3つのシナリオを示します。
-
価格注釈(換算): ある通貨から別の通貨に換算するには
@を使用します。Assets:Forex 1000 USD @ 0.85 EUR -
原価基準(取得): 資産を購入してその原価を確定するには
{}を使用します。Assets:Invest 10 STOCK {100.00 USD} -
両方(価格記録付き売却): 資産を売却する際は、売却するロットを識別するために
{}を使用し、売却価格を記録するために@を使用します。これにより、自動的なキャピタルゲイン計算が可能になります。Assets:Invest -10 STOCK {100.00 USD} @ 105.00 USDこのエントリは、原価100ドルのロットから
STOCKを10ユニット、売却価格105ドルで売却します。
価格使用ルール
- 価格注釈(
@)は、どのロットがブッキングされるかには影響しません。ロットマッチングは、原価基準({})と口座のブッキングメソッドによってのみ処理されます。 @記号は次の場合にのみ使用されます。
- 通貨換算。
- 取引時の資産の市場価値の記録。
- キャピタルゲイン計算のための売却価格の提供。
設定
ブッキングメソッドは、グローバルまたは口座ごとに設定できます。
グローバルブッキングメソッド
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"ベストプラクティス
-
在庫の整理: 台帳をクリーンでシンプルに保つために、保有する一意の商品ごとに個別の口座を使用することを強くお勧めします。
# 良い例: 商品ごとに口座を分ける Assets:Invest:VTSAX ; VTSAXポジションのみ Assets:Invest:VFIAX ; VFIAXポジションのみ異なる株式やファンドを同じ口座に混在させることは避けてください。在庫管理が複雑になります。
-
ロット管理:
-
特にタックスロスハーベスティングや従業員株式付与などの特定の取引には、ロットに意味のあるラベルを使用します。
Assets:Invest:STOCK 10 STOCK {100.00 USD, "tax-loss-harvest-2024"} -
取引にはコメントを付けて文書化します。これにより、後で台帳が読みやすく、理解しやすくなります。
Assets:Invest:STOCK -10 STOCK {100.00 USD} @ 110.00 USD ; 利益: 10%
- デバッグ: エラーや予期しない動作が発生した場合、Beancountは在庫の状態を検査するツールを提供します。
-
在庫状態の確認:
bean-doctorツールは、ファイル内の任意の時点におけるすべての在庫の正確な状態を表示できます。<LINENO>を取引の直後の行番号に置き換えて、その効果を確認します。 -
ロットマッチングの検証:
bean-checkツールはファイル全体を検証します。STRICTモードでのあいまいなロットマッチなど、ブッキングエラーを捕捉します。