複数の取引所、ウォレット、DeFiプロトコルにまたがる暗号通貨ポートフォリオの管理は困難な場合があります。この包括的なガイドでは、Beancount.ioの強力なプレーンテキスト会計システムを使用して、正確な暗号通貨ポートフォリオ追跡を設定・維持する方法を説明します。
ライブの暗号通貨サンプル元帳を探索する:
従来のポートフォリオトラッカーが不十分な理由
暗号通貨ポートフォリオツールの一般的な問題
- 限られた取引所サポート: 多くのツールはすべての取引所やDeFiプロトコルをサポートしていません
- 不正確な取得原価: 簡素化されたFIFO/LIFO計算では複雑なシナリオを見落とします
- 欠落した取引: APIの制限や手動入力のギャップ
- カスタマイズ不可: 固定されたカテゴリとレポート構造
- プライバシー上の懸念: 第三者サービスとのAPIキー共有
- ベンダーロックイン: 独自のデータ形式と限られたエクスポートオプション
Beancount.ioの利点
- 完全なコントロール: プレーンテキスト形式でデータを所有
- 無制限のカスタマイズ: 必要な任意の勘定科目構造を作成可能
- 正確な取得原価: ロットベースの追跡と特定識別
- マルチプロトコルサポート: 任意の取引所、ウォレット、DeFiプロトコルを処理
- 透明な計算: 数値がどのように計算されるかを正確に確認可能
- 将来性: プレーンテキスト形式により長期的なアクセシビリティを保証
暗号通貨ポートフォリオ構造の設定
基本の勘定科目階層
暗号通貨エコシステムを反映した包括的な勘定科目構造から始めます:
; 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ここで1つの命名規則が重要で、パーサーは慣例ではなく強制します: すべての勘定科目コンポーネントとすべての商品シンボルは、大文字または数字で始まる必要があります。 Compoundは自社のインターフェース全体で受領トークンcUSDCと表記しますが、Assets:DeFi:Compound:cUSDCとcUSDC商品はどちらもレクサーエラーです。CUSDCと表記し、プロトコル自体の表記は商品のname:メタデータに保持してください。
メタデータ付き商品定義
豊富なメタデータで暗号通貨を定義し、追跡を改善します:
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"複数取引所ポートフォリオ追跡
取引所間での購入記録
正確な取得原価で異なる取引所間の同じ暗号通貨を追跡します:
; 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取引所間の転送
取得原価を維持しながら取引所間の転送を追跡します:
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}アービトラージ機会
アービトラージは2つの場所にまたがる1つの経済事象であるため、1つの取引として記録します。このエントリは、Coinbaseで保有している10 ETHを$2,580.00で売却し、Binanceで$2,500.00のポジションを即座に回復します:
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コピーすべき3つのこと:
- 転記の間に空白行を入れないでください。 空白行は取引を終了し、Beancountはその後の転記で構文エラーを報告します。代わりにインデントされた
;コメントを使用してレッグにラベルを付けます — 上記の2つのコメント行がその役割を果たしています。 - 利益は処分の利益である$800.00であり、
Income勘定科目が貸方を保持するためマイナスです。$55.00の手数料は別物です: それは$800.00のグロススプレッドを$745.00の利益に変えるもので、独自の2つの転記で既に記録されています。 - 売却レッグは既に保有しているロットを減らします。このエントリは、以前Coinbaseで$2,500.00で購入した10 ETHを想定しています。そのロットがなければ、減算は記帳するものがありません。
高度な取得原価管理
ロットベースの追跡
Beancount.ioのロットベースシステムは正確な取得原価追跡を提供します:
; 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利益と損失の符号規則
Income勘定科目は貸方を保持するため、Beancountはそれらを負の数として保存します。したがって、以下のすべての利益は収入勘定科目へのマイナス転記であり、すべての損失は費用勘定科目へのプラス転記です。手数料は両方から分離しています: それはそれ自体が費用であるため、利益からも差し引くと二重に控除され、取引のバランスが崩れます。
1回の処分では、計算は常に次のようになります:
gain (or loss) = gross proceeds - cost basis of the lots removed
net cash = gross proceeds - fees特定識別法
最適な税務管理のために特定のロットを売却します。減算転記でロットのコストを指定することが、Beancountにおける「特定識別」の意味であり、デフォルトのSTRICTブッキングで機能します:
; 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最古または最新のロットの売却
異なるコストを指定すると異なるロットが選択されます。これらの2つの売却は$40,000.00ロット、次に$45,000.00ロットを取ります — 上記の例で$50,000.00ロットが使用された後に残っている2つ — これはFIFOとLIFOが自動的に行うのと同じ選択を手動で明示したものです:
; 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同じ売却価格、異なるロット、実現利益で$2,500.00の差。Beancountにロットを選択させたい場合は、コストを指定する代わりに勘定科目にブッキングメソッドを設定します — openディレクティブに"FIFO"、"LIFO"、または"HIFO"を指定します。詳細は在庫管理を参照してください。
ポートフォリオパフォーマンス分析
価格追跡の設定
正確な評価のための自動価格フィードを設定します:
; 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ポートフォリオ配分の追跡
Beancount.ioのレポート機能を使用して配分を分析します:
-- 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パフォーマンス指標
主要業績評価指標を追跡します:
-- 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"ステーキングとDeFi統合
ステーキング報酬の追跡
適切な収入認識でステーキング報酬を記録します。到着するユニットと認識される収入は2つの側面から見た同じイベントであるため、それらの重みは相殺する必要があります: [units] × [price]の資産が入り、同じドル額の収入が出ます — そして収入は貸方なのでマイナスです。
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{2,500.00 USD}と{0.50 USD}は外部評価です。Beancountはあなたが書いたものを保存します。価格を取得したり、どのクォートが正しいかを判断したりしません。情報源 — 実際に売却する取引所や公表されたインデックス — を選択し、一貫して使用してください。その数値はあなたの収入であり将来の取得原価でもあるからです。
報酬の基準は一度だけ認識される
上記で認識された$200.00は、0.08 ETHの取得原価になります。後で売却すると、報酬日以降の変動のみが実現されます:
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のキャピタルゲインであり、$240.00ではありません — 最初の$200.00は1月に既に収入でした。全体の$240.00を利益として記帳することは、報酬収入が二重にカウントされる最も一般的な方法です。報酬がいつ課税対象になるか、どの税率で課されるかは管轄によって異なります。元帳は受領と処分を別々に記録するため、どちらの処理もそこから報告できます。
DeFi利回り追跡
複雑なDeFiポジションを追跡します:
流動性提供は2つの商品を3つ目の商品と交換するため、すべてのレッグが同じ通貨で重み付けされる必要があります。取引のバランスが取れるようにです。ETHとLPレッグはコストを保持しているため既にバランスが取れています。ステーブルコインレッグには明示的な@ 1.00 USDが必要です。そうしないと、Beancountは25,000ユニットのUSDCが出て$25,000.00の価値が入ってくると見なし、これらは異なる商品であり相殺されません。
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自動ポートフォリオ管理
取引所データのインポート
Beancountには取引所APIクライアントは含まれておらず、CoinbaseやBinanceと通信させるための設定ファイルもありません。サポートされている方法はインポーターです: 取引所のCSVエクスポートをダウンロードし(または独自のスクリプトで取得し)、beangulpを使用してBeancount取引に変換します。これはBeancount 2の組み込みbeancount.ingestに代わるインポーターフレームワークです。beancount.ingestはBeancount 3には存在しません。
フェッチスクリプトを書く場合、その資格情報ファイルはあなただけのものです — Beancountツールチェーン内の何もそれを読み取りません:
# 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"自動照合
自動残高検証を設定します:
; 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これら3つの数値はあなたの取引所画面からのものであり、このページからのものではありません。したがって、上記のブロックは、あなた自身の取引が元帳に入力されるまで何も検証しません。2つのルールが検証の可否を決定します。balanceディレクティブは指定された日の開始時点での残高を検証するため、2024-01-31日付の検証は2024-01-31に転記されたものを認識しません — 締めている期間の翌日に日付を設定してください。そして、検証されるすべての勘定科目はオープンである必要があります。これがAssets:Crypto:Kraken:ADAが上記の基本の勘定科目階層セクションに登場する理由です。
価格を最新に保つ
価格はpriceディレクティブとして元帳に存在し、Beancount 3.2.3内の何もそれを取得しません。custom "price-source"ディレクティブはありません — 裸の商品シンボルは有効なcustom値ですらないため、その行は構文エラーです — そして**beancount.plugins.forecastモジュールもありません**。名前を指定するとローダーはインポートエラーで停止します。
存在するのはbeanpriceです。これは別のパッケージ(pip install beanprice)で、bean-priceコマンドを提供します。各commodityディレクティブのprice:メタデータフィールドを"<引用通貨>:<ソースモジュール>/<ティッカー>"の形式で読み取り、元帳に追記するpriceディレクティブを書き出します:
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"
; What bean-price appends - and what you would otherwise type by hand
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD商品に添付する他のメタデータ — sector、website、またはこのガイドで前述したprice-sourceフィールド — はあなた自身のための自由形式のドキュメントです。ローダーはそれを保存しますが、どのツールもそれに基づいて動作しません。
税務最適化戦略
タックスロスハーベスティング
体系的なタックスロスハーベスティングを実装します:
; 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長期vs短期利益
税務最適化のための保有期間の追跡:
; 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両方のエントリの^long-term-btcリンクにより、後で購入と売却を一緒に引き出すことができます。Beancount自体は保有期間を追跡しません。
レポートと分析
ポートフォリオサマリーレポート
包括的なポートフォリオレポートを生成します:
-- Portfolio allocation by cryptocurrency
SELECT
commodity,
sum(position) as total_units,
value(sum(position)) as market_value,
value(sum(position)) / (
SELECT value(sum(position))
FROM positions
WHERE account ~ "Assets:Crypto"
) * 100 as allocation_percentage
WHERE account ~ "Assets:Crypto"
GROUP BY commodity
ORDER BY market_value DESC;パフォーマンス分析
時間経過に伴うポートフォリオパフォーマンスを追跡します:
-- Monthly portfolio performance
SELECT
year(date) as year,
month(date) as month,
value(sum(position)) as portfolio_value
WHERE account ~ "Assets:Crypto"
GROUP BY year, month
ORDER BY year, month;収入分析
収入源を分析します:
-- Income breakdown by source
SELECT
account,
sum(position) as total_income
WHERE account ~ "Income:Crypto"
GROUP BY account
ORDER BY total_income DESC;ベストプラクティスとヒント
1. 一貫した記録
- 実行後すぐに取引を記録
- 標準化された取引説明を使用
- メタデータに取引ハッシュを含める
2. 定期的な照合
- 全プラットフォームで毎週残高を検証
- 残高検証を使用して不一致を検出
- 欠落した取引を監視
3. バックアップとセキュリティ
- Beancountファイルを定期的にバックアップ
- 変更追跡にバージョン管理(Git)を使用
- 機密データを暗号化
4. ドキュメント
- 勘定科目構造の決定を文書化
- 複雑な取引に関するメモを維持
- API設定の記録を保持
5. 税務準備
- 税務計画のため四半期ごとにレポートを生成
- 監査目的の詳細な記録を維持
- 複雑な状況では税務専門家に相談
結論
効果的な暗号通貨ポートフォリオ追跡には、精度、一貫性、適切なツールが必要です。Beancount.ioは、複数の取引所、ウォレット、DeFiプロトコルにまたがる複雑な暗号通貨ポートフォリオを管理するために必要な柔軟性とパワーを提供します。
暗号通貨ポートフォリオ追跡にBeancount.ioを使用する主な利点:
- 完全なデータ所有権: プレーンテキスト形式でのデータ
- 正確な取得原価: ロットベースの追跡と特定識別
- 無制限の柔軟性: カスタム勘定科目構造とレポート
- 税務最適化: 税負担を最小化する高度な戦略
- 将来性: オープン形式により長期的なアクセシビリティを保証
基本的な設定から始め、ポートフォリオの複雑さが増すにつれて追跡を段階的に拡張してください。適切な設定への投資は、正確なレポート、税務最適化、ポートフォリオインサイトという形で報われます。
暗号通貨ポートフォリオのコントロールを手に入れる準備はできましたか? Beancount.ioを今すぐ始めましょう。