Zum Hauptinhalt springen

Ein Leitfaden zu Genauigkeit & Toleranzen in Beancount

Die Verwaltung der numerischen Genauigkeit ist ein Eckpfeiler der doppelten Buchführung. In der digitalen Buchhaltung, insbesondere beim Umgang mit mehreren Währungen, Aktienkursen und Bruchteilen von Aktien, können kleine Rundungsdifferenzen schnell zu frustrierenden Saldo-Fehlern führen. Beancount bietet ein ausgeklügeltes, aber intuitives System für den Umgang mit Genauigkeit und das Festlegen akzeptabler Toleranzen. Dieser Leitfaden führt Sie durch die Funktionsweise. ⚙️

Kernkonzepte der Genauigkeit

precision

Das Hauptziel von Beancount ist es, sicherzustellen, dass jede Transaktion auf Null saldiert. Berechnungen mit Preisen oder Kosten führen jedoch oft zu Ergebnissen mit mehr Dezimalstellen, als es praktisch ist, zu erfassen. Das Toleranzsystem ermöglicht kleine, akzeptable Ungleichgewichte.

Automatische Toleranzableitung

Standardmäßig leitet Beancount die erforderliche Toleranz für jede Transaktion automatisch ab. Diese Ableitung erfolgt individuell für jede Transaktion und wird für jede beteiligte Währung separat berechnet.

Die Regel ist einfach: Die Toleranz beträgt die Hälfte der letzten signifikanten Ziffer der in den Buchungen der Transaktion vorhandenen Zahlen.

Betrachten Sie beispielsweise diesen Kauf:

2013-04-03 * "Fonds kaufen"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USD

Beancount leitet die Toleranzen wie folgt ab:

  • Für die Ware FUND hat die Zahl 10.22626 5 Dezimalstellen. Die Toleranz ist die Hälfte der letzten Ziffer, also 0.00001div2=0.0000050.00001 \\div 2 = 0.000005 FUND.
  • Für die Ware USD hat die Zahl -384.61 2 Dezimalstellen. Die Toleranz ist die Hälfte der letzten Ziffer, also 0.01div2=0.0050.01 \\div 2 = 0.005 USD.

Gewichtungsregeln für Transaktionen

Beim Überprüfen, ob eine Transaktion saldiert, berechnet Beancount die "Gewichtung" jeder Buchung. Die Regeln für diese Berechnung sind:

  1. Einfacher Betrag: Wenn eine Buchung nur einen Betrag hat (z. B. Assets:Cash -100.00 USD), ist ihre Gewichtung genau dieser Betrag.
  2. Preisbuchung: Wenn eine Buchung einen Stückpreis hat (z. B. 10 FUND @ 38.46 USD), ist ihre Gewichtung Betrag × Preis.
  3. Kostenbuchung: Wenn eine Buchung Gesamtkosten hat (z. B. 10 FUND {384.61 USD}), ist ihre Gewichtung der Gesamtbetrag der Kosten.
  4. Kosten und Preis: Wenn eine Buchung sowohl Gesamtkosten als auch einen Stückpreis hat (z. B. 10 FUND {384.61 USD} @ 38.46 USD), werden nur die Gesamtkosten für den Ausgleich verwendet. Der Stückpreis wird als Kommentar oder Memo behandelt.

Regeln für die Ableitung der Genauigkeit

Das automatische Ableitungssystem folgt einigen spezifischen Regeln:

  1. Zahlenformat
  • Ganzzahlige Beträge (z. B. 10 USD) tragen nicht zur Ableitung der Genauigkeit bei.
  • Die maximale Toleranz, die automatisch abgeleitet werden kann, beträgt 0.05 Einheiten (z. B. von einer Zahl wie 10.1 USD). Wenn Sie eine größere Toleranz benötigen, müssen Sie diese manuell angeben.
  • Kosten und Preise (z. B. {37.61 USD}) sind von der Toleranzableitung ausgeschlossen. Es werden nur die Primärbeträge der Buchungen verwendet.
  • Wenn Buchungen für dieselbe Währung unterschiedliche Genauigkeiten haben (z. B. -10.10 USD und 5.123 USD), verwendet Beancount die grobste (größte) Toleranz. In diesem Fall würde sie auf -10.10 USD basieren, was eine Toleranz von 0.0050.005 USD ergibt.
  1. Standardbehandlung Sie können eine globale oder währungsspezifische Standardtoleranz festlegen, wenn eine Transaktion keine Zahlen mit Dezimalstellen enthält, aus denen sie abgeleitet werden könnte.

    ; Legt eine Standardtoleranz für alle Währungen ohne explizite Regeln fest
    option "inferred_tolerance_default" "*:0.001"

    ; Legt eine spezifische Standardtoleranz für USD fest
    option "inferred_tolerance_default" "USD:0.003"
  2. Toleranzmultiplikator Sie können alle abgeleiteten Toleranzen global um einen festen Multiplikator erhöhen. Dies ist nützlich, um Überprüfungen in Ihrer gesamten Datei zu lockern, ohne jede Transaktion zu ändern. Ein Multiplikator von 1.2 erhöht alle abgeleiteten Toleranzen um 20 %.

    option "inferred_tolerance_multiplier" "1.2"
  3. Kostenbasierte Ableitung Obwohl Kosten normalerweise für die Toleranzableitung ignoriert werden, können Sie Beancount anweisen, sie zu verwenden. Dies ist hilfreich, wenn der Endbetrag (z. B. eine Barauszahlung) die genaueste Zahl in einer Transaktion ist.

    option "infer_tolerance_from_cost" "TRUE"

Saldo-Assertionen

Saldo-Assertionen (balance) werden verwendet, um zu überprüfen, ob der Saldo Ihres Kontos an einem bestimmten Datum mit einem bekannten Wert übereinstimmt. Sie haben auch eine zugehörige Toleranz.

Grundformat

Ähnlich wie bei Transaktionen wird die Toleranz für eine balance-Assertion aus der Anzahl der Dezimalstellen im Betrag abgeleitet.

; Behauptet, dass der Saldo 4.271 RGAGX mit einer Toleranz von ±0.0005 beträgt
2015-05-08 balance Assets:Fund 4.271 RGAGX

; Behauptet, dass der Saldo 4.27 RGAGX mit einer Toleranz von ±0.005 beträgt
2015-05-08 balance Assets:Fund 4.27 RGAGX

Der berechnete Saldo muss in diesen Bereich fallen. Für das zweite Beispiel würde jeder Saldo zwischen 4.2654.265 und 4.2754.275 die Überprüfung bestehen.

Explizite Toleranzen

Wenn die abgeleitete Toleranz nicht geeignet ist, können Sie eine explizit mit dem Tilde-Zeichen (~) angeben.

; Behauptet, dass der Saldo 4.271 RGAGX mit einer benutzerdefinierten Toleranz von ±0.01 RGAGX beträgt
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGX

Hier besteht die Assertion, wenn der berechnete Saldo zwischen 4.2614.261 und 4.2814.281 RGAGX liegt.

Rundungsmanagement

Für Fälle, in denen kleine Restwerte aus Berechnungen erwartet und akzeptabel sind, bietet Beancount Werkzeuge, um diese systematisch zu verwalten.

Verfolgung von Rundungsfehlern

Sie können ein spezielles Konto bestimmen, um Rundungsfehler automatisch zu sammeln. Dies hält Ihre Transaktionen perfekt ausgeglichen, indem winzige Restbeträge an einem Ort zusammengeführt werden.

Aktivieren Sie zuerst die Option und eröffnen Sie das Konto:

option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

Nun fügt Beancount automatisch eine dritte Buchung zu jeder Transaktion hinzu, die nicht innerhalb ihrer Toleranz saldiert, und bucht die Differenz auf Equity:RoundingError.

2013-02-23 * "Kauf"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD

In dieser Transaktion gilt: 1.245times43.23=53.821351.245 \\times 43.23 = 53.82135. Die Transaktion ist um 0.00135-0.00135 USD unausgeglichen. Wenn die Rundungsoption aktiviert ist, behandelt Beancount sie intern als:

2013-02-23 * "Kauf"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD
Equity:RoundingError -0.00135 USD ; Automatisch hinzugefügt

Abgeleitete Zahlengenauigkeit

Beancount kann Toleranzeinstellungen auch verwenden, um Zahlen automatisch zu runden, bevor sie überhaupt in die Datenstrukturen des Buchs eingefügt werden.

  1. Keine Toleranz angegeben: Wenn keine Toleranz definiert ist, werden Zahlen mit ihrer vollen Genauigkeit verwendet. Es findet keine Rundung statt.

  2. Mit Standardtoleranz: Wenn Sie eine Standardtoleranz festlegen, werden Zahlen auf diese Ebene quantisiert.

    option "default_tolerance" "USD:0.001"

    Mit dieser Einstellung würde eine Zahl wie 53.82135 USD gerundet und als 53.821 USD gespeichert.

  3. Mit Rundungskonto: Wenn sowohl eine Standardtoleranz als auch ein Rundungskonto aktiv sind, quantisiert Beancount die Zahl und erfasst den Restwert.

    option "default_tolerance" "USD:0.01"
    option "account_rounding" "Equity:RoundingError"

    Eine Zahl wie 53.82135 USD würde als 53.82 USD gespeichert, und der Restwert von -0.00135 USD würde auf Equity:RoundingError gebucht.

Implementierungsdetails

Einige technische Punkte verdeutlichen, wie Beancount diese Zuverlässigkeit erreicht.

  1. Zahlendarstellung: Beancount verwendet das Python-Modul decimal, nicht Gleitkommazahlen. Dies ermöglicht bis zu 28 Dezimalstellen Genauigkeit und vermeidet die binären Darstellungsfehler, die bei Gleitkommazahlen üblich sind.

  2. DisplayContext Class: Diese interne Klasse behandelt die gesamte Zahlenformatierung für Anzeigezwecke. Sie berücksichtigt währungsspezifische Genauigkeitseinstellungen und kann die Ausgabe mit ausgerichteten Spalten und Kommas formatieren.

  3. Genauigkeit vs. Toleranz: Es ist wichtig, diese beiden Konzepte zu unterscheiden:

  • Genauigkeit bezieht sich auf das Anzeigeformat einer Zahl (wie viele Dezimalstellen angezeigt werden).
  • Toleranz ist die Zulässigkeit für Ungleichgewicht, die bei Überprüfungen verwendet wird.

Best Practices ✨

Hier sind einige praktische Empfehlungen für die Verwaltung der Genauigkeit in Ihrem Hauptbuch.

Ersteinrichtung

Für die meisten neuen Hauptbücher ist dies eine robuste Startkonfiguration:

; Ein vernünftiger Standard für die meisten Währungen (z. B. USD, EUR)
option "inferred_tolerance_default" "*:0.005"

; Ein 10% Puffer auf alle abgeleiteten Toleranzen
option "inferred_tolerance_multiplier" "1.1"

; Ein Konto, um den gesamten Rundungsstaub aufzufangen
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

Tipps zur Fehlerbehebung

Wenn Sie auf Saldo-Fehler stoßen:

  • Fügen Sie Dezimalstellen zum Betrag einer Buchung hinzu, um eine engere, genauere lokale Toleranzableitung zu erstellen.
  • Verwenden Sie explizite Toleranzen (~) bei balance-Assertionen, die aufgrund vorhersehbarer Abweichungen fehlschlagen.
  • Verfolgen Sie Rundungsfehler in einem dedizierten Konto, um zu sehen, wo und wie oft sie auftreten.
  • Erwägen Sie, währungsspezifische Standardwerte festzulegen, wenn Sie häufig mit Währungen zu tun haben, die unterschiedliche Konventionen haben (z. B. hat JPY keine Dezimalstellen).

Migrationsstrategie

So wenden Sie diese Konzepte auf ein bestehendes, unordentliches Hauptbuch an:

  1. Beginnen Sie mit einer großzügigen globalen Toleranz (z. B. *:0.05) und einem hohen Multiplikator, um die Datei zur Validierung zu bringen.
  2. Verringern Sie die Toleranzen schrittweise und beheben Sie die Fehler, die auftreten.
  3. Fügen Sie explizite Ziffern zu Beträgen in problematischen Transaktionen hinzu, damit die Ableitung ihre Arbeit erledigen kann.
  4. Überwachen Sie den Saldo des Rundungskontos. Ein großer oder schnell wachsender Saldo kann auf ein systemisches Problem hinweisen, das untersucht werden muss.