Beancount における精度と許容誤差のガイド
数値精度を管理することは、複式簿記の基礎です。 デジタル簿記では、特に複数の通貨、株価、端株を扱う場合、小さな丸め誤差がすぐに、フラストレーションのたまるバランスエラーにつながる可能性があります。 Beancount は、精度を処理し、許容できる許容誤差を設定するための、洗練されていながら直感的なシステムを提供します。 このガイドでは、その仕組みについて説明します。 ⚙️
精度に関する主な概念
Beancount の主な目標は、すべての取引がゼロになるようにバランスさせることです。 ただし、価格やコストを含む計算では、記録するのに実用的ではない小数点以下の桁数で結果が生成されることがよくあります。 許容誤差システムを使用すると、小さくて許容できる不均衡を許容できます。
自動許容誤差推論
デフォルトでは、Beancount は各トランザクションに必要な許容誤差を自動的に推論します。 この推論はトランザクションごとに個別に処理され、関係する通貨ごとに個別に計算されます。
ルールは簡単です。 許容誤差は、トランザクションの転記に存在する数値の最後の有効桁の半分です。
たとえば、次の購入を検討してください。
2013-04-03 * "Buy Fund"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USD
Beancount は次のように許容誤差を推論します。
FUND
商品の場合、数値10.22626
には小数点以下 5 桁があります。 許容誤差は最後の桁の半分なので、FUND
です。USD
商品の場合、数値-384.61
には小数点以下 2 桁があります。 許容誤差は最後の桁の半分なので、USD
です。
トランザクションの重み付けルール
トラン ザクションのバランスが取れているかどうかを確認する場合、Beancount は各転記の「重み」を計算します。 この計算のルールは次のとおりです。
- 単純な金額: 転記に金額のみが含まれている場合 (例:
Assets:Cash -100.00 USD
)、その重みはその正確な金額です。 - 価格転記: 転記に単位あたりの価格が含まれている場合 (例:
10 FUND @ 38.46 USD
)、その重みは金額 × 価格
です。 - コスト転記: 転記に合計コストが含まれている場合 (例:
10 FUND {384.61 USD}
)、その重みは合計コストの金額です。 - コストと価格: 転記に合計コストと単位あたりの価格の両方が含まれている場合 (例:
10 FUND {384.61 USD} @ 38.46 USD
)、バランス調整には合計コストのみが使用されます。 単位あたりの価格は、コメントまたはメモとして扱われます。
精度推論ルール
自動推論システムは、いくつかの特定のルールに従います。
- 数値形式
- 整数の金額 (例:
10 USD
) は、精度推論に寄与しません。 - 自動的に推論できる最大許容誤差は
0.05
単位です (例:10.1 USD
のような数値から)。 より大きな許容誤差が必要な場合は、手動で指定する必要があります。 - コストと価格 (例:
{37.61 USD}
) は、許容誤差の推論から除外されます。 転記の主 な金額のみが使用されます。 - 同じ通貨の転記の精度が異なる場合 (例:
-10.10 USD
と5.123 USD
)、Beancount は最も粗い (大きい) 許容誤差を使用します。 この場合、-10.10 USD
に基づいて、許容誤差はUSD
になります。
-
デフォルト処理 トランザクションに推論の基準となる小数点以下の桁数がない場合、グローバルまたは通貨固有のデフォルト許容誤差を設定できます。
; 明示的なルールがないすべての通貨のデフォルト許容誤差を設定します
option "inferred_tolerance_default" "*:0.001"
; USD の特定のデフォルト許容誤差を設定します
option "inferred_tolerance_default" "USD:0.003" -
許容誤差乗数 推論されたすべての許容誤差を、固定乗数でグローバルに増やすことができます。 これは、すべてのトランザクションを変更せずに、ファイル全体のチェックを緩める場合に役立ちます。 乗数が
1.2
の場合、推論されたすべての許容誤差が 20% 増加します。option "inferred_tolerance_multiplier" "1.2"
-
コストベースの推論 通常、コストは許容誤差の推論では無視されますが、Beancount に それらを使用するように指示できます。 これは、最終金額 (例: 現金の引き出し) がトランザクションで最も正確な数値である場合に役立ちます。
option "infer_tolerance_from_cost" "TRUE"
残高アサーション
残高アサーション (balance
) は、特定の日付におけるアカウントの残高が既知の値と一致することを確認するために使用されます。 また、関連する許容誤差もあります。
基本形式
トランザクションと同様に、balance
アサーションの許容誤差は、金額の小数点以下の桁数から推論されます。
; 残高が 4.271 RGAGX で、許容誤差が ±0.0005 であることをアサートします
2015-05-08 balance Assets:Fund 4.271 RGAGX
; 残高が 4.27 RGAGX で、許容誤差が ±0.005 であることをアサートします
2015-05-08 balance Assets:Fund 4.27 RGAGX
計算された残高は、この範囲内にある必要が あります。 2 番目の例では、 ~ の範囲の残高であれば、チェックに合格します。
明示的な許容誤差
推論された許容誤差が適切でない場合は、チルダ (~
) 文字を使用して明示的に指定できます。
; 残高が 4.271 RGAGX で、カスタム許容誤差が ±0.01 RGAGX であることをアサートします
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGX
ここでは、計算された残高が ~ RGAGX
の範囲内であれば、アサーションは合格します。
丸め管理
計算からの小さな残余が予想され、許容される場合のために、Beancount はそれらを体系的に管理するためのツールを提供します。