Zum Hauptinhalt springen
Präzision & Toleranzen

Präzision & Toleranzen

Erfahren Sie, wie die Präzisions- und Toleranzsysteme von Beancount helfen, das Gleichgewicht in der doppelten Buchführung zu wahren – besonders bei komplexen Transaktionen mit mehreren Währungen und Bruchteilwerten.

Die Verwaltung numerischer Genauigkeit ist ein Eckpfeiler der doppelten Buchführung. In der digitalen Buchhaltung, insbesondere bei mehreren Währungen, Aktienkursen und Bruchteilen von Aktien, können kleine Rundungsabweichungen schnell zu frustrierenden Bilanzierungsfehlern führen. Beancount bietet ein ausgefeiltes, aber intuitives System zur Handhabung von Präzision und zur Festlegung akzeptabler Toleranzen. Dieser Leitfaden erklärt, wie es funktioniert. ⚙️

Grundlegende Präzisionskonzepte

Das Hauptziel von Beancount ist es sicherzustellen, dass jede Transaktion auf Null aufgeht. Allerdings führen Berechnungen mit Preisen oder Kosten oft zu Ergebnissen mit mehr Dezimalstellen, als praktisch aufzuzeichnen sind. Das Toleranzsystem erlaubt kleine, akzeptable Unstimmigkeiten.

Automatische Toleranzableitung

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

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

Betrachten Sie zum Beispiel 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 FUND-Wertpapierart hat die Zahl 10,22626 5 Dezimalstellen. Die Toleranz beträgt die Hälfte der letzten Stelle, also $0,00001 \div 2 = 0,000005$ FUND.
  • Für die USD-Währung hat die Zahl -384,61 2 Dezimalstellen. Die Toleranz beträgt die Hälfte der letzten Stelle, also $0,01 \div 2 = 0,005$ USD.

Regeln für das Transaktionsgewicht

Bei der Prüfung, ob eine Transaktion ausgeglichen ist, berechnet Beancount das „Gewicht" jeder Buchung. Die Regeln für diese Berechnung sind:

  1. Einfacher Betrag: Hat eine Buchung nur einen Betrag (z. B. Assets:Cash -100,00 USD), ist ihr Gewicht genau dieser Betrag.
  2. Preis-Buchung: Hat eine Buchung einen Stückpreis (z. B. 10 FUND @ 38,46 USD), ist ihr Gewicht Betrag × Preis.
  3. Kosten-Buchung: Hat eine Buchung Gesamtkosten (z. B. 10 FUND {384,61 USD}), ist ihr Gewicht der Gesamtkostenbetrag.
  4. Kosten und Preis: Hat eine Buchung sowohl Gesamtkosten als auch einen Stückpreis (z. B. 10 FUND {384,61 USD} @ 38,46 USD), wird nur der Gesamtkostenbetrag für den Ausgleich verwendet. Der Stückpreis wird als Kommentar oder Notiz behandelt.

Regeln zur Präzisionsableitung

Das automatische Ableitungssystem folgt einigen spezifischen Regeln:

  1. Zahlenformat
  • Ganzzahlige Beträge (z. B. 10 USD) tragen nicht zur Präzisionsableitung bei.
  • Die maximal automatisch ableitbare Toleranz beträgt 0,05 Einheiten (z. B. aus 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}) werden von der Toleranzableitung ausgeschlossen. Nur die primären Beträge der Buchungen werden verwendet.
  • Haben Buchungen für dieselbe Währung unterschiedliche Genauigkeiten (z. B. -10,10 USD und 5,123 USD), verwendet Beancount die gröbste (größte) Toleranz. In diesem Fall würde sie auf Basis von -10,10 USD berechnet, was eine Toleranz von $0,005$ USD ergibt.
  1. Standardbehandlung Sie können eine globale oder währungsspezifische Standardtoleranz festlegen, falls eine Transaktion keine Zahlen mit Dezimalstellen enthält, aus denen eine Toleranz abgeleitet werden kann.

    ; Setzt eine Standardtoleranz für alle Währungen ohne explizite Regeln
    option "inferred_tolerance_default" "*:0,001"
     
    ; Setzt eine spezifische Standardtoleranz für USD
    option "inferred_tolerance_default" "USD:0,003"
  2. Toleranz-Multiplikator Sie können alle abgeleiteten Toleranzen global um einen festen Multiplikator erhöhen. Dies ist nützlich, um Prü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 endgültige Betrag (z. B. eine Barabhebung) die präziseste Zahl in einer Transaktion ist.

    option "infer_tolerance_from_cost" "TRUE"

Saldenbestätigungen

Saldenbestätigungen (balance) werden verwendet, um zu überprüfen, ob der Saldo Ihres Kontos an einem bestimmten Datum mit einem bekannten Wert übereinstimmt. Auch sie haben eine zugehörige Toleranz.

Grundformat

Analog zu Transaktionen wird die Toleranz für eine balance-Bestätigung aus der Anzahl der Dezimalstellen des Betrags abgeleitet.

; Bestätigt den Saldo von 4,271 RGAGX mit einer Toleranz von ±0,0005
2015-05-08 balance Assets:Fund  4,271 RGAGX
 
; Bestätigt den Saldo von 4,27 RGAGX mit einer Toleranz von ±0,005
2015-05-08 balance Assets:Fund  4,27 RGAGX

Der berechnete Saldo muss innerhalb dieses Bereichs liegen. Für das zweite Beispiel würde jeder Saldo zwischen 4,2654,265 und 4,2754,275 die Prüfung bestehen.

Explizite Toleranzen

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

; Bestätigt den Saldo von 4,271 RGAGX mit einer benutzerdefinierten Toleranz von ±0,01 RGAGX
2015-05-08 balance Assets:Fund  4,271 ~ 0,01 RGAGX

Hier besteht die Bestätigung, wenn der berechnete Saldo zwischen 4,2614,261 und 4,2814,281 RGAGX liegt.

Rundungsverwaltung

Für Fälle, in denen kleine Reste aus Berechnungen erwartet und akzeptabel sind, stellt Beancount Werkzeuge zur systematischen Verwaltung bereit.

Rundungsfehlerverfolgung

Sie können ein spezielles Konto einrichten, um Rundungsfehler automatisch zu sammeln. Dies hält Ihre Transaktionen perfekt ausgeglichen, indem winzige Restbeträge an einer Stelle gesammelt werden.

Aktivieren Sie zunächst die Option und eröffnen Sie das Konto:

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

Nun wird Beancount jeder Transaktion, die nicht innerhalb ihrer Toleranz ausgeglichen ist, automatisch einen dritten Buchungsposten hinzufügen und die Differenz auf Equity:RoundingError buchen.

2013-02-23 * "Kauf"
  Assets:Invest     1,245 RGAGX {43,23 USD}
  Assets:Cash      -53,82 USD

Bei dieser Transaktion ist 1,245times43,23=53,821351,245 \\times 43,23 = 53,82135. Die Transaktion ist um 0,00135-0,00135 USD unausgeglichen. Mit aktivierter Rundungsoption behandelt Beancount sie intern wie folgt:

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 Zahlenpräzision

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

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

  2. Mit Standardtoleranz: Wenn Sie eine Standardtoleranz festlegen, werden Zahlen auf diese Genauigkeit 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 Rest.

    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 Rest 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 Pythons decimal-Modul, keine Gleitkommazahlen. Dies ermöglicht bis zu 28 Dezimalstellen Genauigkeit und vermeidet die bei Gleitkommazahlen üblichen Binärdarstellungsfehler.

  2. DisplayContext-Klasse: Diese interne Klasse übernimmt die gesamte Zahlenformatierung für die Anzeige. Sie respektiert währungsspezifische Präzisionseinstellungen und kann die Ausgabe mit ausgerichteten Spalten und Kommas formatieren.

  3. Präzision vs. Toleranz: Es ist wichtig, diese beiden Konzepte zu unterscheiden:

  • Präzision bezieht sich auf das Anzeigeformat einer Zahl (wie viele Dezimalstellen angezeigt werden).
  • Toleranz ist der Spielraum für Unausgeglichenheit, der bei Überprüfungen verwendet wird.

Best Practices ✨

Hier sind einige praktische Empfehlungen für die Verwaltung von Präzision in Ihrem Hauptbuch.

Anfangseinrichtung

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

; Eine sinnvolle Voreinstellung 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 zum Auffangen aller Rundungsreste
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

Tipps zur Fehlerbehebung

Wenn Sie auf Bilanzierungsfehler stoßen:

  • Fügen Sie Dezimalstellen zum Betrag einer Buchung hinzu, um eine engere, genauere lokale Toleranzableitung zu erzeugen.
  • Verwenden Sie explizite Toleranzen (~) bei balance-Bestätigungen, die aufgrund vorhersehbarer Abweichungen fehlschlagen.
  • Verfolgen Sie Rundungsfehler in einem dedizierten Konto, um zu sehen, wo und wie oft sie auftreten.
  • Erwägen Sie die Festlegung währungsspezifischer Vorgaben, wenn Sie häufig mit Währungen mit unterschiedlichen Konventionen umgehen (z. B. JPY hat keine Dezimalstellen).

Migrationsstrategie

Bei der Anwendung dieser Konzepte auf ein bestehendes, unordentliches Hauptbuch:

  1. Beginnen Sie mit einer großzügigen globalen Toleranz (z. B. *:0,05) und einem hohen Multiplikator, um die Datei validieren zu lassen.
  2. Ziehen Sie die Toleranzen schrittweise an und beheben Sie die auftretenden Fehler.
  3. Fügen Sie explizite Ziffern zu Beträgen in problematischen Transaktionen hinzu, damit die Ableitung ihre Arbeit tun 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.