Zum Hauptinhalt springen

Bestandsverwaltung

Erfahren Sie, wie Sie Bestände in Beancount effektiv verwalten, mit Fokus auf die Verfolgung von Vermögenswerten wie Aktien und Währungen, das Verständnis von Anschaffungskosten und die Berechnung von Kapitalgewinnen für eine bessere Portfoliopertformanz.

Das Bestandssystem von Beancount ist eine leistungsstarke Funktion zur Verfolgung von Vermögenswerten, die über die Zeit gekauft und verkauft werden, wie Aktien, Investmentfonds oder Fremdwährungen. Es ermöglicht eine präzise Nachverfolgung der Kostenbasis, die für die Berechnung von Kapitalgewinnen und das Verständnis der Portfolio-Performance unerlässlich ist. Dieses Tutorial behandelt die Grundmechanismen der Bestandsverwaltung in Ihrem Hauptbuch.

Grundlegende Konzepte

Im Kern dreht sich die Bestandsverwaltung um die Verfolgung von Positionen. Eine "Position" ist einfach eine Menge einer Ware, die in einem Konto gehalten wird. Beancount unterscheidet zwischen zwei grundlegenden Positionstypen.

Positionstypen

  1. Einfache Position (Keine Kosten): Dies ist eine Standard-Buchung eines Saldos. Sie stellt eine Menge einer Ware ohne zugehörige Anschaffungskosten dar. Sie eignet sich für Bargeld oder einfache Saldo-Bestätigungen.

    Assets:Bank:Checking      100.00 USD
  2. Position mit Kostenbasis: Dieser Positionstyp umfasst nicht nur die Anzahl der Einheiten und die Ware, sondern auch die Kosten, zu denen sie erworben wurden. Dies ist die Grundlage der Bestandsverfolgung. Die Kosten werden innerhalb geschweifter Klammern {} angegeben.

    Assets:Invest:VTSAX      10 VTSAX {100.00 USD, "lot-1"}

    In diesem Beispiel halten wir 10 Einheiten von VTSAX. Jede Einheit wurde zu Kosten von $100,00 USD erworben. Dieses spezifische Aktienpaket wird als "Lot" bezeichnet.

Bestandsoperationen

Es gibt zwei Hauptoperationen, die Sie mit einem Bestand ausführen können:

  1. Erhöhungen (Zum Bestand hinzufügen): Wenn Sie eine Ware kaufen, erhöhen Sie Ihren Bestand. Sie erstellen ein neues Lot mit einer bestimmten Anzahl von Einheiten und einer Kostenbasis.

    2024-01-15 * "Buy shares"
      Assets:Invest:STOCK     50 STOCK {25.00 USD, "lot-1"}
      Assets:Bank:Checking   -1250.00 USD

    Hier kaufen wir 50 Einheiten von STOCK zu einem Stückpreis von $25,00 USD. Dies erzeugt ein Lot im Assets:Invest:STOCK Konto.

  2. Verminderungen (Aus dem Bestand entfernen): Wenn Sie eine Ware verkaufen, verringern Sie Ihren Bestand. Sie müssen angeben, aus welchem Lot Sie verkaufen. Dies erfolgt durch Angabe passender Informationen in den geschweiften Klammern.

    2024-01-20 * "Sell shares"
      Assets:Invest:STOCK    -25 STOCK {25.00 USD}
      Assets:Bank:Checking    625.00 USD

    In dieser Transaktion verkaufen wir 25 Einheiten von STOCK aus dem Lot, das zu $25,00 USD pro Einheit erworben wurde.

Buchungsmethoden

Wenn Sie einen Bestand reduzieren, benötigt Beancount eine Regel, um zu entscheiden, aus welchem spezifischen Lot entnommen wird, falls mehrere Lots für die Verringerung in Frage kommen. Diese Regel nennt sich "Buchungsmethode." Sie können eine Standardmethode für die gesamte Datei mit einer Option festlegen oder einem Konto seine eigene Methode über die open-Direktive zuweisen.

Beancount 3.2.3 akzeptiert sieben Methodennamen: STRICT (der Standard), STRICT_WITH_SIZE, NONE, FIFO, LIFO, HIFO und AVERAGE. Sechs davon sind implementiert; AVERAGE wird zwar geparst, löst aber einen Fehler aus, sobald eine Reduktion gebucht werden muss, wie der Abschnitt AVERAGE unten zeigt.

1. STRICT (Standard)

Die STRICT-Methode ist die Standard- und sicherste Buchungsmethode. Sie erzwingt eine explizite und eindeutige Zuordnung.

2024-01-01 open Assets:Invest:STOCK "STRICT"
  • Benötigt exakte Loszuordnung: Der Kostenbezeichner der Reduktionsbuchung ({...}) muss ein einzelnes Los identifizieren – nach Kosten, Erwerbsdatum, Label oder jeder Kombination davon.
  • Fehler bei uneindeutigen Zuordnungen: Wenn der Bezeichner mehr als ein Los trifft, wirft Beancount einen AmbiguousMatchError-Fehler anstatt zu raten.
  • Ausnahme: Wenn eine Reduktion genau die Gesamtanzahl der Einheiten entfernt, auf die der Bezeichner zutrifft, ist ein leerer Bezeichner ({}) erlaubt und die Reduktion wird über diese Lose verteilt.

Dieses Hauptbuch enthält zwei Lose und verkauft eines davon, indem es dessen Kosten angibt, was eindeutig ist:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Strict  STK  "STRICT"
1970-01-01 open Assets:Broker:Cash    USD
1970-01-01 open Income:Gains          USD
 
2024-01-10 * "Buy the first lot"
  Assets:Broker:Strict    10 STK {100.00 USD}
  Assets:Broker:Cash   -1000.00 USD
 
2024-02-10 * "Buy the second lot"
  Assets:Broker:Strict    10 STK {120.00 USD}
  Assets:Broker:Cash   -1200.00 USD
 
; The cost identifies exactly one lot, so STRICT is satisfied.
2024-06-01 * "Sell the $120.00 lot"
  Assets:Broker:Strict   -10 STK {120.00 USD} @ 150.00 USD
  Assets:Broker:Cash    1500.00 USD
  Income:Gains

Es lädt ohne Fehler, bucht $300,00 Gewinn auf Income:Gains und lässt 10 STK {100.00 USD} im Konto übrig.

Ersetzen Sie diese letzte Buchung durch einen leeren Bezeichner und dieselbe Datei scheitert:

; Rejected under STRICT: "-10 STK {}" matches both lots.
2024-06-01 * "Sell 10 shares"
  Assets:Broker:Strict  -10 STK {} @ 150.00 USD
  Assets:Broker:Cash   1500.00 USD
  Income:Gains

Beancount meldet Ambiguous matches for "-10 STK {}" und listet die Kandidaten auf. Der Verkauf der gesamten Position ist jedoch in Ordnung, da nichts mehr zur Auswahl steht:

; Allowed under STRICT: -20 STK is the entire holding, so the empty
; specifier is split across both lots.
2024-06-01 * "Close the position"
  Assets:Broker:Strict  -20 STK {} @ 150.00 USD
  Assets:Broker:Cash   3000.00 USD
  Income:Gains

Das bucht $800,00 Gewinn – $3.000,00 Erlöse gegen $1.000,00 + $1.200,00 Basis – und lässt das Konto leer. Dies ist eine Eigenschaft von STRICT selbst, kein Grund, zu STRICT_WITH_SIZE zu wechseln.

2. FIFO (First-In, First-Out)

Die FIFO-Methode bucht Reduktionen automatisch zuerst gegen die ältesten verfügbaren Lose.

2024-01-01 open Assets:Invest:STOCK "FIFO"
  • Automatische Auflösung: Sie löst Mehrdeutigkeiten, indem sie die ältesten passenden Lose auswählt.
  • Chronologische Zuordnung: Es wird angenommen, dass Sie die Vermögenswerte verkaufen, die Sie am längsten gehalten haben. Einige Steuerbehörden betrachten dies als Standard, wenn kein Los identifiziert wurde.

3. LIFO (Last-In, First-Out)

Die LIFO-Methode ist das Gegenteil von FIFO. Sie bucht Reduktionen zuerst gegen die jüngsten verfügbaren Lose.

2024-01-01 open Assets:Invest:STOCK "LIFO"
  • Umgekehrte chronologische Reihenfolge: Es werden die zuletzt erworbenen passenden Lose ausgewählt.
  • Neueste, nicht teuerste: LIFO wählt nur nach Erwerbsdatum aus. Es verkauft zufällig die Aktien mit den höchsten Kosten, wenn die Preise gestiegen sind, aber wenn Ihr neuestes Los das günstigste ist – was im folgenden Beispiel gezeigt wird – realisiert LIFO den größten Gewinn, nicht den kleinsten. Die Methode, die immer die teuersten Aktien verkauft, ist HIFO, die als Nächstes beschrieben wird.

4. HIFO (Highest-In, First-Out)

Die HIFO-Methode bucht Abgänge zuerst gegen die teuersten verfügbaren Lose, egal welches Datum sie haben.

2024-01-01 open Assets:Invest:STOCK "HIFO"
  • Nach Kosten sortierte Zuordnung: Es werden die passenden Lose mit dem höchsten Einstandswert ausgewählt.
  • Kleinster realisierter Gewinn: Bei einem gegebenen Verkaufspreis realisiert der Verkauf der Aktien mit dem höchsten Anschaffungskosten den kleinsten Gewinn (oder den größten Verlust). Ob Sie diese Methode verwenden dürfen, ist eine Frage der Rechtsordnung – in den USA zum Beispiel erfordert die Wahl eines Loses stets eine genaue Identifikation zum Verkaufszeitpunkt – behandeln Sie die Methode daher als Buchhaltungsmechanismus und bestätigen Sie die steuerliche Wahl separat.

5. Vergleich von FIFO, LIFO und HIFO bei denselben Losen

Die drei Methoden unterscheiden sich nur, wenn das älteste, das neueste und das teuerste Los drei verschiedene Lose sind. Dieses Hauptbuch ordnet genau dies an – Los A ist das älteste, Los C das neueste und das mittlere Los B ist das teuerste – und verkauft dann 10 Anteile aus drei Konten, die sich nur in ihrer Buchungsmethode unterscheiden:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Fifo  STK  "FIFO"
1970-01-01 open Assets:Broker:Lifo  STK  "LIFO"
1970-01-01 open Assets:Broker:Hifo  STK  "HIFO"
1970-01-01 open Assets:Broker:Cash  USD
1970-01-01 open Income:Gains        USD
 
; Lot A - the oldest, at $100.00 per share
2024-01-10 * "Buy lot A"
  Assets:Broker:Fifo     10 STK {100.00 USD}
  Assets:Broker:Lifo     10 STK {100.00 USD}
  Assets:Broker:Hifo     10 STK {100.00 USD}
  Assets:Broker:Cash  -3000.00 USD
 
; Lot B - the most expensive, at $120.00 per share
2024-02-10 * "Buy lot B"
  Assets:Broker:Fifo     10 STK {120.00 USD}
  Assets:Broker:Lifo     10 STK {120.00 USD}
  Assets:Broker:Hifo     10 STK {120.00 USD}
  Assets:Broker:Cash  -3600.00 USD
 
; Lot C - the newest, at $90.00 per share
2024-03-10 * "Buy lot C"
  Assets:Broker:Fifo     10 STK {90.00 USD}
  Assets:Broker:Lifo     10 STK {90.00 USD}
  Assets:Broker:Hifo     10 STK {90.00 USD}
  Assets:Broker:Cash  -2700.00 USD
 
; Sell 10 shares out of each account at $150.00 and let each
; account's booking method choose which lot leaves.
2024-06-01 * "Sell 10 shares from each account"
  Assets:Broker:Fifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Lifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Hifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Cash   4500.00 USD
  Income:Gains

Es lädt ohne Fehler und bucht insgesamt einen Gewinn von $1.400,00, aufgeteilt wie folgt:

KontoMethodeGebuchtes LosEinstandswertRealisierter GewinnVerbleibende Lose
Assets:Broker:FifoFIFOLos A, 2024-01-10$100.00$500.0010 @ $120.00, 10 @ $90.00
Assets:Broker:LifoLIFOLos C, 2024-03-10$90.00$600.0010 @ $100.00, 10 @ $120.00
Assets:Broker:HifoHIFOLos B, 2024-02-10$120.00$300.0010 @ $100.00, 10 @ $90.00

Die LIFO-Zeile ist die, die man sich ansehen sollte: Sie realisierte den größten Gewinn der drei, weil das neueste Los auch das günstigste war.

6. STRICT_WITH_SIZE

STRICT_WITH_SIZE ist STRICT plus einen zusätzlichen Entscheidungsfaktor: Wenn mehrere Lose passen, aber genau eines die Anzahl der Einheiten hält, die Sie entnehmen, wird dieses Los gewählt.

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Sized  STK  "STRICT_WITH_SIZE"
1970-01-01 open Assets:Broker:Cash   USD
1970-01-01 open Income:Gains         USD
 
2024-01-10 * "Buy 10 shares"
  Assets:Broker:Sized    10 STK {100.00 USD}
  Assets:Broker:Cash  -1000.00 USD
 
2024-02-10 * "Buy 7 shares"
  Assets:Broker:Sized     7 STK {120.00 USD}
  Assets:Broker:Cash   -840.00 USD
 
; Only one lot holds exactly 7 units, so the empty specifier resolves.
2024-06-01 * "Sell 7 shares"
  Assets:Broker:Sized    -7 STK {} @ 150.00 USD
  Assets:Broker:Cash   1050.00 USD
  Income:Gains

Das bucht $210,00 Gewinn gegen das $120,00 Los. Die identische Datei mit "STRICT" in der open-Zeile schlägt fehl mit Ambiguous matches for "-7 STK {}".

7. DURCHSCHNITT (akzeptiert, aber nicht implementiert)

AVERAGE ist ein gültiger Name – option "booking_method" "AVERAGE" und open … "AVERAGE" werden beide geparst – aber Beancount 3.2.3 hat keine Implementierung dahinter. Alles lädt hier bis zum Verkauf:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Avg   STK  "AVERAGE"
1970-01-01 open Assets:Broker:Cash  USD
1970-01-01 open Income:Gains        USD
 
2024-01-10 * "Buy 10 shares at $10.00"
  Assets:Broker:Avg      10 STK {10.00 USD}
  Assets:Broker:Cash  -100.00 USD
 
2024-02-10 * "Buy 10 more at $8.00"
  Assets:Broker:Avg      10 STK {8.00 USD}
  Assets:Broker:Cash   -80.00 USD
 
; An average-cost engine would book this at $9.00 per share. This one refuses.
2024-06-01 * "Sell 5 shares"
  Assets:Broker:Avg      -5 STK {}
  Assets:Broker:Cash    45.00 USD
  Income:Gains

In dem Moment, in dem die Reduzierung gebucht werden muss, stoppt der Loader mit:

AVERAGE method is not supported

Planen Sie kein Hauptbuch um diese Methode herum. Wenn Sie heute durchschnittliche Kostenverhalten wünschen, halten Sie die Position in einem NONE-Konto und berechnen den Durchschnitt selbst oder verfolgen jedes Los und akzeptieren Gewinne auf Los-Ebene.

8. KEINER

Die NONE-Methode deaktiviert die Loszuordnung vollständig.

2024-01-01 open Assets:Invest:STOCK "NONE"
  • Keine Loszuordnung: Beancount versucht nicht, Reduzierungen mit Erhöhungen abzugleichen.
  • Erlaubt gemischte Vorzeichen: Dies erlaubt es einem Konto, gleichzeitig sowohl positive als auch negative Salden derselben Ware zu halten. Dieses Verhalten ähnelt dem, wie das Ledger CLI Werkzeug mit Waren umgeht.

Los-Spezifikation

Ein „Los“ ist ein bestimmter Block einer Ware, der zu einem bestimmten Zeitpunkt und Preis erworben wurde. Wenn Sie eine Position erstellen oder reduzieren, können Sie ihre Los-Attribute im Detail angeben.

Vollständige Spezifikation

Beim Erhöhen eines Bestands (Kauf) können Sie bis zu drei Attribute für das Los angeben, kommasepariert in einem einzigen Paar von Klammern:

Assets:Invest:STOCK  10 STOCK {100.00 USD, 2024-01-15, "lot-identifier"}
  • 100.00 USD — die Kostenbasis, ausgedrückt pro Einheit.
  • 2024-01-15 — das Erwerbsdatum. Beancount füllt dieses vom Transaktionsdatum aus, wenn Sie es weglassen, weshalb die Fehlermeldungen oben bei jedem Los ein Datum zeigen.
  • "lot-identifier" — ein optionales Zeichenketten-Label.

Während alle drei optional sind, ist die Angabe mindestens der Kostenbasis gängige Praxis. Die Klammern müssen auf einer Zeile bleiben, und Kommentare innerhalb eines Ledgers beginnen mit ;, niemals mit #.

Zuordnungs-Methoden

Beim Reduzieren eines Bestands (Verkauf) verwenden Sie dieselbe Syntax, um anzugeben, aus welchem Los bzw. welchen Losen der Verkauf erfolgt.

  • Nach Kosten abgleichen: Dies ist die gebräuchlichste Methode.

    Assets:Invest:STOCK  -5 STOCK {100.00 USD}
  • Nach Datum abgleichen: Sind die Kosten identisch, können Sie mit dem Erwerbsdatum unterscheiden.

    Assets:Invest:STOCK  -5 STOCK {2024-01-15}
  • Nach Beschriftung abgleichen: Labels bieten eine sichere Möglichkeit, ein Los zu identifizieren.

    Assets:Invest:STOCK  -5 STOCK {"lot-identifier"}
  • Das Los der Buchungsmethode überlassen: Ein leeres Klammerpaar {} benennt kein Los, sodass die Buchungsmethode des Kontos wählt. Unter FIFO, LIFO oder HIFO ist das der älteste, neueste oder teuerste passende Los; unter dem Standard STRICT ist es ein AmbiguousMatchError, außer die Reduzierung leert die passenden Lose genau.

    Assets:Invest:STOCK  -5 STOCK {}

Preisbehandlung

Es ist entscheidend, den Unterschied zwischen cost basis ({}) und price (@) zu verstehen. Sie dienen unterschiedlichen Zwecken und sind nicht austauschbar.

Preis vs Kosten

  • {cost}: Definiert die Anschaffungskosten eines Vermögenswerts. Es ist Teil des Lagerbestands selbst und wird für Buchungsreduktionen und die Berechnung von Kapitalgewinnen verwendet.
  • @ price: Eine Anmerkung, die einen Marktpreis zum Zeitpunkt einer Transaktion festhält. Es wird für Währungsumrechnungen oder zur Notierung des Marktwerts an einem bestimmten Datum verwendet.

Hier sind die drei Szenarien:

  1. Preisnotierung (Umrechnung): Verwenden Sie @, um von einer Währung in eine andere zu konvertieren.

    Assets:Forex     1000 USD @ 0.85 EUR
  2. Cost Basis (Anschaffung): Verwenden Sie {} beim Kauf eines Vermögenswerts, um dessen Kosten festzulegen.

    Assets:Invest    10 STOCK {100.00 USD}
  3. Beides (Verkauf mit Preisnotierung): Beim Verkauf eines Vermögenswerts verwenden Sie {}, um das verkaufte Los zu identifizieren, und @, um den Verkaufspreis zu verzeichnen. Dies ermöglicht eine automatisierte Berechnung der Kapitalgewinne.

    Assets:Invest    -10 STOCK {100.00 USD} @ 105.00 USD

    Dieser Eintrag verkauft 10 STOCK aus dem Los, das jeweils $100,00 gekostet hat, zum Verkaufspreis von je $105,00.

Regeln für die Preisverwendung

  1. Preisnotierungen (@) beeinflussen nicht, welches Los gebucht wird. Die Loszuordnung erfolgt ausschließlich durch die cost basis ({}) und die Buchungsmethode des Kontos.
  2. Das Symbol @ wird nur für Folgendes verwendet:
  • Währungsumrechnungen.
  • Festhalten des Marktwerts eines Vermögenswerts zum Zeitpunkt einer Transaktion.
  • Angabe des Verkaufspreises für Kapitalgewinnberechnungen.

Konfiguration

Sie können Buchungsmethoden global oder kontoabhängig konfigurieren.

Globale Buchungsmethode

Sie können eine Standard-Buchungsmethode für Ihre gesamte Beancount-Datei mit der Direktive option festlegen.

option "booking_method" "STRICT"

Die akzeptierten Werte sind "STRICT" (Standard, wenn nichts gesetzt wird), "STRICT_WITH_SIZE", "NONE", "FIFO", "LIFO", "HIFO" und "AVERAGE". Jeder andere String wird beim Laden mit Error for option 'booking_method' abgelehnt. "AVERAGE" wird hier und bei open akzeptiert, aber eine Buchung einer Reduktion darunter schlägt fehl, wie der obige AVERAGE-Abschnitt zeigt.

Kontoabhängige Überschreibung

Es ist oft nützlich, verschiedene Methoden für unterschiedliche Konten zu haben. Zum Beispiel möchten Sie FIFO für ein Rentenkonto, aber STRICT für ein steuerpflichtiges Brokerage-Konto verwenden, um sicherzustellen, dass Sie bestimmte Steuerlose verkaufen. Die Buchungsmethode kann beim Eröffnen des Kontos festgelegt werden.

2024-01-01 open Assets:Retirement:401K "FIFO"
2024-01-01 open Assets:Taxable:Stock  "STRICT"

Best Practices

  1. Bestandsorganisation: Um Ihr Hauptbuch sauber und einfach zu halten, wird dringend empfohlen, für jede eindeutige Ware, die Sie besitzen, eigene Konten zu verwenden und jedes auf diese Ware auf seiner open-Direktive zu beschränken.

    ; GOOD: separate accounts by commodity, each constrained to one
    2024-01-01 open Assets:Invest:VTSAX  VTSAX
    2024-01-01 open Assets:Invest:VFIAX  VFIAX

    Vermeiden Sie es, verschiedene Aktien oder Fonds im selben Konto zu mischen, da dies die Bestandsverwaltung erschwert. Die Warenliste auf open führt dazu, dass Beancount eine fehlgeleitete Buchung ablehnt, anstatt zwei Bestände stillschweigend zu vermischen.

  2. Lot-Verwaltung:

  • Verwenden Sie aussagekräftige Bezeichnungen für Lots, insbesondere für spezifische Transaktionen wie Steuerverlustverrechnung oder Mitarbeiteraktienzuteilungen.

    Assets:Invest:STOCK  10 STOCK {100.00 USD, "tax-loss-harvest-2024"}
  • Dokumentieren Sie Ihre Trades mit Kommentaren. Dies macht Ihr Hauptbuch später leichter lesbar und verständlich.

    Assets:Invest:STOCK  -10 STOCK {100.00 USD} @ 110.00 USD ; Gain: 10%
  1. Fehlersuche: Wenn Sie auf Fehler oder unerwartetes Verhalten stoßen, stellt Beancount Werkzeuge zur Verfügung, um den Zustand Ihres Bestands zu inspizieren.
  • Bestandszustand prüfen: Verwenden Sie bea doctor context main.beancount 42, um die Transaktion in Zeile 42 zu überprüfen, einschließlich ihrer Buchungen und der betroffenen Kontostände. Ersetzen Sie den Dateinamen und die Zeilennummer durch die Transaktion, die Sie untersuchen möchten.

    Ersetzen Sie <LINENO> durch die Zeilennummer direkt nach einer Transaktion, um deren Wirkung zu sehen.

  • Lot-Zuordnung verifizieren: Das Werkzeug bea check überprüft Ihre gesamte Datei. Es erkennt Buchungsfehler, wie z. B. mehrdeutige Lot-Zuordnungen im STRICT-Modus.

Quelle: https://beancount.io/de/docs/Basics/inventories