Zum Hauptinhalt springen

Ein Krypto-Portfolio mit Anschaffungskosten in Beancount

Verfolge ein Krypto-Portfolio in Beancount über Börsen hinweg, mit Anschaffungskosten, Losen und Performance-Analyse in einem Hauptbuch.

Ein Kryptowährungs-Portfolio über mehrere Börsen, Wallets und DeFi-Protokolle hinweg zu verwalten, kann eine Herausforderung sein. Diese umfassende Anleitung zeigt Ihnen, wie Sie mit dem leistungsstarken Plain-Text-Buchhaltungssystem von Beancount.io eine präzise Verfolgung Ihres Kryptowährungs-Portfolios einrichten und pflegen.

Entdecken Sie ein Live-Beispiel-Ledger für Kryptowährungen:

Cryptocurrency Example Ledger in neuem Tab öffnen

Warum traditionelle Portfolio-Tracker versagen​

Häufige Probleme bei Crypto-Portfolio-Tools​

  • Begrenzte Börsenunterstützung: Viele Tools unterstützen nicht alle Börsen oder DeFi-Protokolle
  • Ungenauere Anschaffungskosten: Vereinfachte FIFO/LIFO-Berechnungen verfehlen komplexe Szenarien
  • Fehlende Transaktionen: API-Einschränkungen und Lücken bei der manuellen Eingabe
  • Keine Anpassungsmöglichkeiten: Fest vorgegebene Kategorien und Berichtsstrukturen
  • Datenschutzbedenken: Weitergabe von API-Schlüsseln an Drittanbieter-Dienste
  • Anbieterbindung: Proprietäre Datenformate und eingeschränkte Exportmöglichkeiten

Vorteile von Beancount.io​

  • Vollständige Kontrolle: Ihre Daten gehören Ihnen – im Plain-Text-Format
  • Unbegrenzte Anpassung: Erstellen Sie jede Kontostruktur, die Sie benötigen
  • Präzise Anschaffungskosten: Lot-basierte Verfolgung mit spezifischer Identifikation
  • Multi-Protokoll-Unterstützung: Verwalten Sie jede Börse, Wallet oder jedes DeFi-Protokoll
  • Transparente Berechnungen: Sehen Sie genau, wie Zahlen berechnet werden
  • Zukunftssicher: Das Plain-Text-Format gewährleistet langfristige Zugänglichkeit

Einrichten Ihrer Crypto-Portfolio-Struktur​

Grundlegende Kontenhierarchie​

Beginnen Sie mit einer umfassenden Kontostruktur, die Ihr Krypto-Ökosystem widerspiegelt:

; Exchange Accounts - Organized by Platform
1970-01-01 open Assets:Crypto:Coinbase:USD
1970-01-01 open Assets:Crypto:Coinbase:BTC
1970-01-01 open Assets:Crypto:Coinbase:ETH
1970-01-01 open Assets:Crypto:Coinbase:ADA
 
1970-01-01 open Assets:Crypto:Binance:USD
1970-01-01 open Assets:Crypto:Binance:BTC
1970-01-01 open Assets:Crypto:Binance:ETH
1970-01-01 open Assets:Crypto:Binance:BNB
 
1970-01-01 open Assets:Crypto:Kraken:USD
1970-01-01 open Assets:Crypto:Kraken:BTC
1970-01-01 open Assets:Crypto:Kraken:ETH
1970-01-01 open Assets:Crypto:Kraken:ADA
1970-01-01 open Assets:Crypto:Binance:ADA
 
; Wallet Accounts - Organized by Type
1970-01-01 open Assets:Crypto:Wallet:Ledger:BTC
1970-01-01 open Assets:Crypto:Wallet:Ledger:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:USDC
1970-01-01 open Assets:Crypto:Wallet:MetaMask:UNI
1970-01-01 open Assets:Crypto:Wallet:TrustWallet:BNB
 
; DeFi Protocol Accounts
1970-01-01 open Assets:DeFi:Uniswap:ETH-USDC-LP
1970-01-01 open Assets:DeFi:Compound:CUSDC
1970-01-01 open Assets:Staking:Ethereum:ETH
1970-01-01 open Assets:Staking:Cardano:ADA
 
; Income Tracking
1970-01-01 open Income:Crypto:Staking:ETH
1970-01-01 open Income:Crypto:Staking:ADA
1970-01-01 open Income:Crypto:Mining:BTC
1970-01-01 open Income:Crypto:Airdrops
1970-01-01 open Income:Crypto:DeFi:Yield
1970-01-01 open Income:Crypto:Arbitrage
1970-01-01 open Income:CapitalGains:Crypto
1970-01-01 open Income:CapitalGains:LongTerm
 
; Expense Tracking
1970-01-01 open Expenses:Crypto:Fees:Trading
1970-01-01 open Expenses:Crypto:Fees:Network
1970-01-01 open Expenses:Crypto:Fees:Withdrawal
1970-01-01 open Expenses:CapitalLoss:Crypto

Eine Benennungsregel schlägt hier zu – und der Parser erzwingt sie, statt sie nur als Konvention zu behandeln: Jede Kontokomponente und jedes Rohstoffsymbol muss mit einem Großbuchstaben oder einer Ziffer beginnen. Compound schreibt seinen Receipt-Token in seiner eigenen Oberfläche durchgängig als cUSDC, aber Assets:DeFi:Compound:cUSDC und ein cUSDC-Rohstoff sind beide Lexer-Fehler. Schreiben Sie sie als CUSDC und behalten Sie die Schreibweise des Protokolls in den name:-Metadaten des Rohstoffs bei.

Waren-Definitionen mit Metadaten​

Definieren Sie Ihre Kryptowährungen mit aussagekräftigen Metadaten für bessere Nachverfolgung:

1970-01-01 commodity BTC
  name: "Bitcoin"
  asset-class: "cryptocurrency"
  sector: "digital-currency"
  price-source: "coinbase"
  website: "https://bitcoin.org"
 
1970-01-01 commodity ETH
  name: "Ethereum"
  asset-class: "cryptocurrency"
  sector: "smart-contract-platform"
  price-source: "coinbase"
  website: "https://ethereum.org"
 
1970-01-01 commodity ADA
  name: "Cardano"
  asset-class: "cryptocurrency"
  sector: "smart-contract-platform"
  price-source: "binance"
  website: "https://cardano.org"
 
1970-01-01 commodity DOT
  name: "Polkadot"
  asset-class: "cryptocurrency"
  sector: "interoperability"
  price-source: "kraken"
  website: "https://polkadot.network"

Multi-Börsen-Portfolio-Verfolgung​

Aufzeichnungen von Käufen über Börsen hinweg​

Verfolgen Sie dieselbe Kryptowährung über verschiedene Börsen hinweg mit präzisen Anschaffungskosten:

; Bitcoin purchases on different exchanges
2024-01-15 * "Buy BTC on Coinbase"
  Assets:Crypto:Coinbase:BTC      1.0 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:USD  -45000.00 USD
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD
 
2024-01-20 * "Buy BTC on Binance"
  Assets:Crypto:Binance:BTC       0.5 BTC {46000.00 USD}
  Assets:Crypto:Binance:USD   -23000.00 USD
  Expenses:Crypto:Fees:Trading    25.00 USD
  Assets:Crypto:Binance:USD      -25.00 USD
 
2024-01-25 * "Buy BTC on Kraken"
  Assets:Crypto:Kraken:BTC        0.8 BTC {44000.00 USD}
  Assets:Crypto:Kraken:USD    -35200.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Kraken:USD       -30.00 USD

Börsenübergreifende Transfers​

Verfolgen Sie Transfers zwischen Börsen unter Beibehaltung der Anschaffungskosten:

2024-02-01 * "Transfer BTC from Coinbase to Ledger"
  Assets:Crypto:Coinbase:BTC      -0.5 BTC {45000.00 USD}
  Assets:Crypto:Wallet:Ledger:BTC  0.5 BTC {45000.00 USD}
  Expenses:Crypto:Fees:Withdrawal  0.0005 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:BTC      -0.0005 BTC {45000.00 USD}

Arbitrage-Möglichkeiten​

Eine Arbitrage ist ein einziges wirtschaftliches Ereignis über zwei Handelsplätze hinweg, also erfassen Sie sie als eine Transaktion. Dieser Eintrag verkauft 10 ETH, die Sie bereits auf Coinbase halten, zu 2.580,00 USD und stellt die Position sofort auf Binance zu 2.500,00 USD wieder her:

2024-02-10 * "Arbitrage: Buy ETH on Binance, Sell on Coinbase"
  ; Buy leg on Binance
  Assets:Crypto:Binance:ETH       10 ETH {2500.00 USD}
  Assets:Crypto:Binance:USD   -25000.00 USD
  Expenses:Crypto:Fees:Trading    25.00 USD
  Assets:Crypto:Binance:USD      -25.00 USD
  ; Sell leg on Coinbase, at the higher price
  Assets:Crypto:Coinbase:ETH     -10 ETH {2500.00 USD} @ 2580.00 USD
  Assets:Crypto:Coinbase:USD   25800.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:Crypto:Arbitrage       -800.00 USD  ; 25,800.00 proceeds - 25,000.00 basis

Drei Dinge, die Sie übernehmen sollten:

  • Lassen Sie niemals eine Leerzeile zwischen Buchungen. Eine Leerzeile beendet die Transaktion, und Beancount meldet einen Syntaxfehler für die darauf folgenden Buchungen. Verwenden Sie stattdessen eingerückte ;-Kommentare, um die Legs zu kennzeichnen – genau das tun die beiden Kommentarzeilen oben.
  • Der Gewinn ist der Gewinn der Veräußerung, 800,00 USD, und er ist negativ, weil Income-Konten Habenposten enthalten. Die 55,00 USD an Gebühren sind davon getrennt: Sie machen aus 800,00 USD Bruttospanne 745,00 USD Gewinn und sind bereits auf ihren eigenen zwei Buchungen erfasst.
  • Das Verkaufs-Leg reduziert ein Lot, das Sie bereits halten müssen. Dieser Eintrag setzt voraus, dass 10 ETH zuvor auf Coinbase zu 2.500,00 USD gekauft wurden; ohne dieses Lot hat die Reduzierung nichts, wogegen sie gebucht werden kann.

Erweiterte Kostenbasisverwaltung​

Lot-basierte Nachverfolgung​

Das lot-basierte System von Beancount.io bietet präzise Verfolgung der Anschaffungskosten:

; Multiple purchases at different prices
2024-01-01 * "BTC Purchase Lot 1"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {40000.00 USD}
  Assets:Crypto:Coinbase:USD -40000.00 USD
 
2024-02-01 * "BTC Purchase Lot 2"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:USD -45000.00 USD
 
2024-03-01 * "BTC Purchase Lot 3"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {50000.00 USD}
  Assets:Crypto:Coinbase:USD -50000.00 USD

Die Vorzeichenkonvention für Gewinne und Verluste​

Income-Konten enthalten Habenposten, daher speichert Beancount sie als negative Zahlen. Jeder Gewinn unten ist deshalb eine negative Buchung auf einem Ertragskonto, und jeder Verlust ist eine positive Buchung auf einem Aufwandskonto. Die Gebühr ist von beidem getrennt: Sie ist ein eigenständiger Aufwand, sodass ein zusätzliches Abziehen vom Gewinn sie doppelt abziehen und die Transaktion unausgeglichen lassen würde.

Für eine Veräußerung gilt immer diese Rechnung:

gain (or loss) = gross proceeds - cost basis of the lots removed
net cash       = gross proceeds - fees

Methode der spezifischen Identifikation​

Verkaufen Sie bestimmte Lots für ein optimales Steuermanagement. Die Angabe der Lot-Kosten in der Reduzierungsbuchung ist das, was „spezifische Identifikation" in Beancount bedeutet, und sie funktioniert unter der standardmäßigen STRICT-Buchung:

; Sell the most expensive lot: 1.0 BTC bought at $50,000.00
2024-04-01 * "Sell BTC Lot 3 for tax optimization"
  Assets:Crypto:Coinbase:BTC    -1.0 BTC {50000.00 USD} @ 48000.00 USD
  Assets:Crypto:Coinbase:USD   48000.00 USD  ; gross proceeds
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD
  Expenses:CapitalLoss:Crypto   2000.00 USD  ; 50,000.00 basis - 48,000.00 proceeds

Verkauf des ältesten oder des neuesten Lots​

Die Angabe anderer Kosten wählt ein anderes Lot aus. Diese beiden Verkäufe nehmen das Lot zu 40.000,00 USD und dann das zu 45.000,00 USD – die beiden, die nach dem Lot zu 50.000,00 USD im obigen Beispiel noch vorhanden sind – was dieselbe Auswahl ist, die FIFO und LIFO automatisch treffen würden, hier von Hand ausgeschrieben:

; Sell the oldest lot (bought 2024-01-01 at $40,000.00)
2024-05-01 * "Sell 0.5 BTC from the oldest lot"
  Assets:Crypto:Coinbase:BTC    -0.5 BTC {40000.00 USD} @ 52000.00 USD
  Assets:Crypto:Coinbase:USD   26000.00 USD  ; gross proceeds, 0.5 * 52,000.00
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:CapitalGains:Crypto   -6000.00 USD  ; 26,000.00 proceeds - 20,000.00 basis
 
; Sell the newest remaining lot (bought 2024-02-01 at $45,000.00)
2024-05-02 * "Sell 0.5 BTC from the newest lot"
  Assets:Crypto:Coinbase:BTC    -0.5 BTC {45000.00 USD} @ 52000.00 USD
  Assets:Crypto:Coinbase:USD   26000.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:CapitalGains:Crypto   -3500.00 USD  ; 26,000.00 proceeds - 22,500.00 basis

Derselbe Verkaufspreis, anderes Lot, 2.500,00 USD Unterschied beim realisierten Gewinn. Wenn Sie es vorziehen, dass Beancount das Lot für Sie auswählt, legen Sie eine Buchungsmethode für das Konto fest, anstatt Kosten anzugeben – "FIFO", "LIFO" oder "HIFO" in der open-Direktive, beschrieben in Inventory Management.

Portfolio-Performance-Analyse​

Einrichtung der Kursverfolgung​

Richten Sie automatisierte Preisfeeds für eine genaue Bewertung ein:

Für gehostete Bücher liefert Live Prices unterstützte Paare automatisch. Die folgenden statischen Direktiven zeigen die Daten, die eine Bewertung verwendet, und bleiben für reproduzierbare lokale Beispiele nützlich.

; Daily price updates
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD
2024-01-15 price ADA 0.50 USD
 
2024-01-16 price BTC 46000.00 USD
2024-01-16 price ETH 2550.00 USD
2024-01-16 price ADA 0.52 USD

Verfolgung der Portfolio-Allokation​

Nutzen Sie die Berichtsfunktionen von Beancount.io, um die Allokation zu analysieren:

-- Query for portfolio allocation by asset
SELECT
  account,
  sum(position) as balance,
  value(sum(position)) as market_value
WHERE account ~ "Assets:Crypto"
GROUP BY 1
ORDER BY market_value DESC

Leistungskennzahlen​

Verfolgen Sie wichtige Leistungsindikatoren:

-- Total portfolio value query
SELECT
  sum(value(position)) as total_portfolio_value
WHERE account ~ "Assets:Crypto"
 
-- Realized gains/losses
SELECT
  sum(position) as realized_gains
WHERE account ~ "Income:CapitalGains:Crypto"

Staking- und DeFi-Integration​

Verfolgung von Staking-Belohnungen​

Erfassen Sie Staking-Belohnungen mit korrekter Ertragserfassung. Die eingehenden Einheiten und der erfasste Ertrag sind dasselbe Ereignis aus zwei Perspektiven, also müssen ihre Gewichte sich aufheben: [Einheiten] × [Preis] an Vermögenswert hinein, dieselbe Anzahl Dollar an Ertrag heraus – und Ertrag ist ein Habenposten, also negativ.

2024-01-31 * "ETH Staking Rewards - January"
  Assets:Staking:Ethereum:ETH     0.08 ETH {2500.00 USD}
  Income:Crypto:Staking:ETH     -200.00 USD  ; 0.08 * 2,500.00
 
2024-01-31 * "ADA Staking Rewards - January"
  Assets:Staking:Cardano:ADA        25 ADA {0.50 USD}
  Income:Crypto:Staking:ADA      -12.50 USD  ; 25 * 0.50

Die {2.500,00 USD} und {0,50 USD} sind externe Bewertungen. Beancount speichert, was Sie schreiben; es ruft keinen Preis ab und entscheidet nicht, welches Kursangebot das richtige ist. Wählen Sie eine Quelle – die Börse, an der Sie tatsächlich verkaufen würden, oder einen veröffentlichten Index – und verwenden Sie sie konsequent, denn diese Zahl ist sowohl Ihr Ertrag als auch Ihre zukünftige Anschaffungskostenbasis.

Die Basis der Belohnung wird einmal anerkannt​

Die oben erfassten 200,00 USD werden zur Anschaffungskostenbasis der 0,08 ETH. Ein späterer Verkauf realisiert nur die Wertänderung seit dem Belohnungsdatum:

2024-06-30 * "Sell the January ETH staking reward"
  Assets:Staking:Ethereum:ETH   -0.08 ETH {2500.00 USD} @ 3000.00 USD
  Assets:Crypto:Coinbase:USD     240.00 USD  ; gross proceeds, 0.08 * 3,000.00
  Income:CapitalGains:Crypto     -40.00 USD  ; 240.00 proceeds - 200.00 basis

40,00 USD Kapitalgewinn, nicht 240,00 USD – die ersten 200,00 USD waren im Januar bereits Ertrag. Die gesamten 240,00 USD als Gewinn zu buchen, ist die häufigste Art, wie Belohnungserträge doppelt gezählt werden. Wann die Belohnung steuerpflichtig wird und zu welchem Satz, hängt von der Jurisdiktion ab; das Ledger erfasst Empfang und Veräußerung getrennt, sodass jede Behandlung daraus berichtet werden kann.

DeFi-Ertragsverfolgung​

Verfolgen Sie komplexe DeFi-Positionen:

Die Bereitstellung von Liquidität tauscht zwei Rohstoffe gegen einen dritten, also muss jedes Leg in derselben Währung gewogen werden, bevor die Transaktion ausgeglichen werden kann. Die ETH- und LP-Legs tun das bereits, weil sie Kosten tragen; das Stablecoin-Leg benötigt ein explizites @ 1.00 USD, sonst sieht Beancount 25.000 Einheiten USDC abgehen und 25.000,00 USD an Wert ankommen, was verschiedene Rohstoffe sind und sich nicht aufhebt.

2024-02-01 * "Uniswap LP Position"
  Assets:Crypto:Wallet:MetaMask:ETH    -10 ETH {2500.00 USD}
  Assets:Crypto:Wallet:MetaMask:USDC -25000 USDC @ 1.00 USD
  Assets:DeFi:Uniswap:ETH-USDC-LP      100 UNI-V2-ETH-USDC {500.00 USD}
 
2024-02-28 * "Uniswap LP Rewards - February"
  Assets:Crypto:Wallet:MetaMask:UNI    50 UNI {8.00 USD}
  Income:Crypto:DeFi:Yield          -400.00 USD  ; 50 * 8.00

Automatisiertes Portfoliomanagement​

Import von Börsendaten​

Beancount bringt keinen Börsen-API-Client mit, und es gibt keine Konfigurationsdatei, die es dazu bringt, mit Coinbase oder Binance zu kommunizieren. Der unterstützte Weg ist ein Importer: Sie laden den CSV-Export der Börse herunter (oder holen ihn mit Ihrem eigenen Skript ab) und konvertieren ihn mit beangulp in Beancount-Transaktionen – dem Importer-Framework, das das in Beancount 2 integrierte beancount.ingest abgelöst hat. beancount.ingest existiert in Beancount 3 nicht mehr.

Wenn Sie tatsächlich ein Fetch-Skript schreiben, gehört dessen Anmeldedatendatei allein Ihnen – nichts in der Beancount-Toolchain liest sie:

# Configuration for YOUR OWN fetch script. No Beancount tool reads this file.
exchanges:
  coinbase:
    api_key: "your_api_key"
    api_secret: "your_api_secret"
    passphrase: "your_passphrase"
  binance:
    api_key: "your_api_key"
    api_secret: "your_api_secret"

Automatisierte Abstimmung​

Richten Sie eine automatisierte Saldenprüfung ein:

; Balance assertions for automated verification
2024-01-31 balance Assets:Crypto:Coinbase:BTC    2.5 BTC
2024-01-31 balance Assets:Crypto:Binance:ETH    15.0 ETH
2024-01-31 balance Assets:Crypto:Kraken:ADA   1000.0 ADA

Diese drei Zahlen stammen aus Ihren Börsenansichten, nicht von dieser Seite, daher wird der obige Block gegen nichts verifizieren, bis Ihre eigenen Transaktionen im Ledger sind. Zwei Regeln entscheiden, ob er überhaupt verifiziert. Eine balance-Direktive prüft den Saldo zu Beginn des genannten Tages, also sieht eine auf den 31.01.2024 datierte Prüfung nichts, was am 31.01.2024 gebucht wurde – datieren Sie sie auf den Tag nach dem Zeitraum, den Sie abschließen. Und jedes geprüfte Konto muss geöffnet sein, weshalb Assets:Crypto:Kraken:ADA im Abschnitt Grundlegende Kontenhierarchie oben erscheint.

Verwaltete Preise in einem gehosteten Ledger​

Verwenden Sie Live Prices, um eine Bewertungswährung und unterstützte Krypto-Assets auszuwählen, und fügen Sie dann die generierten Includes in Ihr gehostetes Ledger ein. Die Asset-Symbole müssen mit Ihren Beständen übereinstimmen. Feeds liefern datierte Bewertungspreise; sie legen nicht den Ertragsbetrag oder die Anschaffungskosten von Staking-Belohnungen und Airdrops fest.

Ihr eigener Preis hat für dasselbe Datum und Paar Vorrang, einschließlich des reziproken Paares. Ein zwischengespeichertes Kursangebot kann während einer Störung veraltet sein, prüfen Sie also dessen Beobachtungszeitpunkt. Der lokale Abruf-Workflow unten bleibt für Upstream-Beancount und Fava nützlich.

Preise aktuell halten​

Preise leben im Ledger als price-Direktiven. Upstream-Beancount 3.2.3 ruft sie nicht selbst ab; gehostete verwaltete Includes verwenden die oben beschriebene Beancount.io-Loader-Erweiterung. Es gibt keine custom "price-source"-Direktive – ein bloßes Rohstoffsymbol ist nicht einmal ein gültiger custom-Wert, diese Zeile ist also ein Syntaxfehler – und kein beancount.plugins.forecast-Modul; der Loader bricht mit einem Importfehler ab, wenn Sie es benennen.

Aktivieren Sie beanprice innerhalb der verwalteten Engine mit bea engine enable beanprice und rufen Sie dann Kurse mit bea price main.beancount ab. Es liest ein price:-Metadatenfeld aus jeder commodity-Direktive in der Form "<Kurswährung>:<Quellmodul>/<Ticker>" und schreibt price-Direktiven, die Sie an Ihr Ledger anhängen:

1970-01-01 commodity BTC
  name: "Bitcoin"
  asset-class: "cryptocurrency"
  price: "USD:beanprice.sources.coinbase/BTC-USD"
 
1970-01-01 commodity ETH
  name: "Ethereum"
  asset-class: "cryptocurrency"
  price: "USD:beanprice.sources.coinbase/ETH-USD"
 
; Example quotes to append after reviewing the output of bea price - and what you would otherwise type by hand
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD

Jede andere Metadaten, die Sie einem Rohstoff anhängen – sector, website oder das früher in dieser Anleitung verwendete price-source-Feld – sind freie Dokumentation zu Ihrem eigenen Nutzen. Der Loader speichert sie, und kein Tool handelt danach.

Steueroptimierungsstrategien​

Steuerverlustverwertung​

Implementieren Sie eine systematische Steuerverlust-Verwertung:

; The lot being harvested, so this block stands on its own
2024-03-01 * "Buy ADA on Binance"
  Assets:Crypto:Binance:ADA       1000 ADA {0.60 USD}
  Assets:Crypto:Binance:USD    -600.00 USD
 
; Identify positions with unrealized losses
2024-12-15 * "Tax loss harvesting - Sell ADA at loss"
  Assets:Crypto:Binance:ADA      -1000 ADA {0.60 USD} @ 0.45 USD
  Assets:Crypto:Binance:USD       450.00 USD  ; gross proceeds
  Expenses:Crypto:Fees:Trading      5.00 USD
  Assets:Crypto:Binance:USD        -5.00 USD
  Expenses:CapitalLoss:Crypto     150.00 USD  ; 600.00 basis - 450.00 proceeds
 
; Repurchase after wash sale period (31 days)
2025-01-16 * "Repurchase ADA after wash sale period"
  Assets:Crypto:Binance:ADA      1000 ADA {0.45 USD}
  Assets:Crypto:Binance:USD     -450.00 USD
  Expenses:Crypto:Fees:Trading     5.00 USD
  Assets:Crypto:Binance:USD       -5.00 USD

Langfristige vs Kurzfristige Gewinne​

Verfolgen Sie Haltedauern für die Steueroptimierung:

; Use metadata to track purchase dates
2024-01-01 * "BTC Purchase - Long-term hold" ^long-term-btc
  Assets:Crypto:Coinbase:BTC  1.0 BTC {40000.00 USD}
  Assets:Crypto:Coinbase:USD -40000.00 USD
 
; Sell after one year for long-term capital gains treatment
2025-01-02 * "BTC Sale - Long-term capital gains" ^long-term-btc
  Assets:Crypto:Coinbase:BTC    -1.0 BTC {40000.00 USD} @ 55000.00 USD
  Assets:Crypto:Coinbase:USD   55000.00 USD
  Income:CapitalGains:LongTerm -15000.00 USD  ; 55,000.00 proceeds - 40,000.00 basis

Der ^long-term-btc-Link auf beiden Einträgen ist es, der es Ihnen später ermöglicht, Kauf und Verkauf gemeinsam abzurufen; Beancount verfolgt Haltedauern nicht selbst.

Berichterstattung und Analysen​

Portfolio-Zusammenfassungsberichte​

Berechnen Sie den Anteil jeder Kryptowährung am Portfolio in einer Bewertungswährung. Dieses Beispiel verwendet USD-Preise, die am 31. März 2024 verfügbar waren, und Bestände vor dem 1. April. Ändern Sie beide Daten zusammen für ein anderes Berichtsdatum. Führen Sie die SELECT-Anweisung unten in Ihrem lokalen BQL-Abfragetool aus.

-- Portfolio allocation by cryptocurrency
SELECT
  currency,
  units(sum(position)) AS total_units,
  convert(sum(position), 'USD', 2024-03-31) AS allocation_value
FROM close ON 2024-04-01
WHERE account ~ '^Assets:Crypto:'
GROUP BY currency
ORDER BY currency;

Prüfen Sie, dass jeder von null verschiedene allocation_value in USD ist, bevor Sie Prozentsätze berechnen. Die Umrechnung verwendet aufgezeichnete Preise, die am oder vor dem Bewertungsdatum verfügbar sind. Eine fehlende Umrechnung kann einen Betrag in seiner ursprünglichen Währung belassen. Wenn ein BTC-, ETH- oder anderer Nicht-USD-Betrag verbleibt, ist die Bewertung unvollständig. Fügen Sie die fehlenden datierten Preise hinzu und führen Sie die Abfrage erneut aus; behandeln Sie nicht bepreiste Assets nicht als null und addieren Sie keine fremden Währungseinheiten.

Addieren Sie die USD-Beträge, um das Portfolio-Gesamt zu erhalten. Berechnen Sie dann die Allokation jedes Assets als Asset-USD-Wert / Gesamt-USD-Wert * 100. Behalten Sie die volle Genauigkeit bei, bis Sie den Prozentsatz anzeigen. Zum Beispiel ergeben Bestände von 1 BTC und 3 ETH, bepreist mit 200 USD pro BTC und 20 USD pro ETH:

AssetUSD-WertAllokationsberechnungAngezeigter Anteil
BTC200200 / 260 * 10076,92 %
ETH6060 / 260 * 10023,08 %
Gesamt260260 / 260 * 100100,00 %

Das Runden einzelner Anteile auf zwei Dezimalstellen kann dazu führen, dass ihre angezeigte Summe leicht von 100 % abweicht. Ein Bestand mit Nullwert wird möglicherweise leer angezeigt. Berichten Sie für ein leeres Portfolio oder eine Gesamt-USD-Summe von null die Allokationen als nicht verfügbar und teilen Sie nicht durch null. Dieses Beispiel beschreibt positive Asset-Bestände; negative Salden erfordern die Interpretation vorzeichenbehafteter Engagements anstelle gewöhnlicher Portfolio-Anteile.

Leistungsanalyse​

Berichten Sie den Schlusswert des Portfolios jedes Monats unter Verwendung aller Bestände vor dem nächsten Monat. Setzen Sie das Bewertungsdatum auf das Monatsende, damit spätere Preise den Schnappschuss nicht verändern können. Diese Beispiele berichten in USD. Führen Sie jedes SELECT separat in Ihrem lokalen BQL-Abfragetool aus.

Für den 31. Januar:

SELECT convert(sum(position), 'USD', 2024-01-31) AS portfolio_value
FROM close ON 2024-02-01
WHERE account ~ '^Assets:Crypto:';

Für den 29. Februar:

SELECT convert(sum(position), 'USD', 2024-02-29) AS portfolio_value
FROM close ON 2024-03-01
WHERE account ~ '^Assets:Crypto:';

Für den 31. März:

SELECT convert(sum(position), 'USD', 2024-03-31) AS portfolio_value
FROM close ON 2024-04-01
WHERE account ~ '^Assets:Crypto:';

FROM close ON schließt Buchungen aus, die am oder nach seinem Stichtag datiert sind. Das Datum innerhalb von convert wählt Preise aus, die am oder vor dem Berichtsdatum verfügbar sind. Ändern Sie für einen anderen Monat beide Daten zusammen. Fordern Sie jeden Monat an, den Sie berichten möchten, einschließlich Monate ohne Transaktionen. Prüfen Sie auf nicht umgerechnete Währungen wie oben beschrieben, bevor Sie das Ergebnis als USD-Gesamtsumme behandeln.

Nehmen wir zum Beispiel an, der Januar endet mit 2 BTC, bepreist mit je 100 USD, und 3 ETH zu je 10 USD. Der Verkauf von 1 BTC im Februar lässt 1 BTC und 3 ETH übrig. Wenn der März keine Trades hat, aber die aufgezeichneten Preise auf 200 USD pro BTC und 20 USD pro ETH steigen, sind die Schnappschüsse:

MonatsendeSchlusswert der Kryptos
31. Januar2 * 100 + 3 * 10 = 230 USD
29. Februar1 * 100 + 3 * 10 = 130 USD
31. März1 * 200 + 3 * 20 = 260 USD

Der Februar-Wert setzt keine neuen Preisdirektiven in diesem Monat voraus. Der @-Preis eines Verkaufs erfasst seinen Erlös; er erstellt keine Marktpreis-Direktive. Diese Abfragen decken nur Assets:Crypto:-Konten ab, also sind anderswo gehaltene Barerlöse ausgeschlossen.

Das Gruppieren von Buchungen nach Transaktionsmonat misst die Bewegungen jedes Monats, nicht die kumulativen Schlussbestände. Es lässt auch Monate ohne Transaktionen aus. Änderungen zwischen Schlusswerten umfassen Käufe, Verkäufe, Transfers und Preisänderungen. Sie sind keine um Cashflows bereinigten Anlagerenditen.

Einkommensanalyse​

Analysieren Sie Ertragsquellen:

-- Income breakdown by source
SELECT
  account,
  sum(position) as total_income
WHERE account ~ "Income:Crypto"
GROUP BY account
ORDER BY total_income DESC;

Beste Praktiken und Tipps​

1. Konsistente Erfassung​

  • Erfassen Sie Transaktionen sofort nach der Ausführung
  • Verwenden Sie standardisierte Transaktionsbeschreibungen
  • Fügen Sie Transaktions-Hashes in die Metadaten ein

2. Regelmäßige Abstimmung​

  • Überprüfen Sie wöchentlich die Salden über alle Plattformen hinweg
  • Verwenden Sie Saldenprüfungen, um Abweichungen zu erkennen
  • Achten Sie auf fehlende Transaktionen

3. Backup und Sicherheit​

  • Sichern Sie Ihre Beancount-Dateien regelmäßig
  • Verwenden Sie Versionskontrolle (Git) zur Änderungsverfolgung
  • Verschlüsseln Sie sensible Daten

4. Dokumentation​

  • Dokumentieren Sie Ihre Entscheidungen zur Kontostruktur
  • Führen Sie Notizen zu komplexen Transaktionen
  • Bewahren Sie Aufzeichnungen über API-Konfigurationen auf

5. Steuerliche Vorbereitung​

  • Erstellen Sie vierteljährlich Berichte für die Steuerplanung
  • Führen Sie detaillierte Aufzeichnungen für Prüfungszwecke
  • Konsultieren Sie bei komplexen Situationen Steuerfachleute

Fazit​

Eine effektive Verfolgung eines Kryptowährungs-Portfolios erfordert Präzision, Konsistenz und die richtigen Werkzeuge. Beancount.io bietet die nötige Flexibilität und Leistung, um komplexe Krypto-Portfolios über mehrere Börsen, Wallets und DeFi-Protokolle hinweg zu verwalten.

Wesentliche Vorteile der Nutzung von Beancount.io für die Krypto-Portfolio-Verfolgung:

  • Vollständiges Daten-Eigentum: Ihre Daten im Plain-Text-Format
  • Präzise Anschaffungskosten: Lot-basierte Verfolgung mit spezifischer Identifikation
  • Unbegrenzte Flexibilität: Individuelle Kontostrukturen und Berichte
  • Steueroptimierung: Fortgeschrittene Strategien zur Minimierung der Steuerlast
  • Zukunftssicher: Offenes Format gewährleistet langfristige Zugänglichkeit

Beginnen Sie mit einem einfachen Setup und erweitern Sie Ihre Verfolgung schrittweise, während Ihr Portfolio an Komplexität zunimmt. Die Investition in ein ordnungsgemäßes Setup wird sich in genauer Berichterstattung, Steueroptimierung und Portfolio-Einblicken auszahlen.

Bereit, die Kontrolle über Ihr Kryptowährungs-Portfolio zu übernehmen? Starten Sie noch heute mit Beancount.io.

Quelle: https://beancount.io/de/docs/Solutions/cryptocurrency-portfolio-tracking