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
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
FUNDhat die Zahl10.226265 Dezimalstellen. Die Toleranz ist die Hälfte der letzten Ziffer, alsoFUND. - Für die Ware
USDhat die Zahl-384.612 Dezimalstellen. Die Toleranz ist die Hälfte der letzten Ziffer, alsoUSD.
Gewichtungsregeln für Transaktionen
Beim Überprüfen, ob eine Transaktion saldiert, berechnet Beancount die "Gewichtung" jeder Buchung. Die Regeln für diese Berechnung sind:
- Einfacher Betrag: Wenn eine Buchung nur einen Betrag hat (z. B.
Assets:Cash -100.00 USD), ist ihre Gewichtung genau dieser Betrag. - Preisbuchung: Wenn eine Buchung einen Stückpreis hat (z. B.
10 FUND @ 38.46 USD), ist ihre GewichtungBetrag × Preis. - Kostenbuchung: Wenn eine Buchung Gesamtkosten hat (z. B.
10 FUND {384.61 USD}), ist ihre Gewichtung der Gesamtbetrag der Kosten. - 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:
- 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.05Einheiten (z. B. von einer Zahl wie10.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 USDund5.123 USD), verwendet Beancount die grobste (größte) Toleranz. In diesem Fall würde sie auf-10.10 USDbasieren, was eine Toleranz vonUSDergibt.
-
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" -
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.2erhöht alle abgeleiteten Toleranzen um 20 %.option "inferred_tolerance_multiplier" "1.2" -
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 und 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 und 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: . Die Transaktion ist um 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.
-
Keine Toleranz angegeben: Wenn keine Toleranz definiert ist, werden Zahlen mit ihrer vollen Genauigkeit verwendet. Es findet keine Rundung statt.
-
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 USDgerundet und als53.821 USDgespeichert. -
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 USDwürde als53.82 USDgespeichert, und der Restwert von-0.00135 USDwürde aufEquity:RoundingErrorgebucht.
Implementierungsdetails
Einige technische Punkte verdeutlichen, wie Beancount diese Zuverlässigkeit erreicht.
-
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. -
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.
-
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 (
~) beibalance-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:
- Beginnen Sie mit einer großzügigen globalen Toleranz (z. B.
*:0.05) und einem hohen Multiplikator, um die Datei zur Validierung zu bringen. - Verringern Sie die Toleranzen schrittweise und beheben Sie die Fehler, die auftreten.
- Fügen Sie explizite Ziffern zu Beträgen in problematischen Transaktionen hinzu, damit die Ableitung ihre Arbeit erledigen kann.
- Überwachen Sie den Saldo des Rundungskontos. Ein großer oder schnell wachsender Saldo kann auf ein systemisches Problem hinweisen, das untersucht werden muss.