Перейти к основному содержимому

Отслеживание криптопортфеля с методом FIFO в Beancount

Отслеживание криптопортфеля в Beancount на разных биржах с методом FIFO, лотами и анализом эффективности в одной книге учета.

Управление криптовалютным портфелем across numerous exchanges, wallets, и DeFi-протоколов может быть сложной задачей. Это подробное руководство показывает, как настроить и поддерживать точное отслеживание криптовалютного портфеля с помощью мощной системы учёта plain-text Beancount.io.

Изучите живой пример журнала криптовалют:

Открыть Cryptocurrency Example Ledger в новой вкладке

Почему традиционные трекеры портфеля не справляются​

Распространённые проблемы с инструментами для портфелей криптовалют​

  • Ограниченная поддержка бирж: многие инструменты не поддерживают все биржи или DeFi-протоколы
  • Неточная стоимость приобретения: упрощённые расчёты FIFO/LIFO упускают сложные сценарии
  • Пропущенные транзакции: ограничения API и пробелы при ручном вводе
  • Отсутствие настройки: фиксированные категории и структуры отчётности
  • Проблемы конфиденциальности: передача API-ключей сторонним сервисам
  • Привязка к поставщику: проприетарные форматы данных и ограниченные возможности экспорта

Преимущества Beancount.io​

  • Полный контроль: владейте своими данными в формате plain-text
  • Безграничная настройка: создавайте любую нужную структуру счетов
  • Точная стоимость приобретения: учёт по лотам с конкретной идентификацией
  • Поддержка множества протоколов: работа с любой биржей, кошельком или DeFi-протоколом
  • Прозрачные расчёты: видите в точности, как вычисляются числа
  • Устойчивость к будущему: формат plain-text обеспечивает долгосрочную доступность

Настройка структуры вашего криптопортфеля​

Базовая иерархия счетов​

Начните с комплексной структуры счетов, которая отражает вашу криптоэкосистему:

; 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

Здесь важен один нюанс именования, и парсер требует его соблюдения, а не просто рекомендует: каждый компонент счёта и каждый символ товара должен начинаться с заглавной буквы или цифры. 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}

Возможности арбитража​

Арбитраж — это одно экономическое событие на двух площадках, поэтому записывайте его как одну транзакцию. Эта запись продаёт 10 ETH, которые вы уже держите на Coinbase, по $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

Три вещи, которые нужно скопировать:

  • Никогда не оставляйте пустую строку между проводками. Пустая строка завершает транзакцию, и Beancount сообщает о синтаксической ошибке для проводок после неё. Используйте комментарии ; с отступом для обозначения частей сделки — именно это делают две строки комментариев выше.
  • Прибыль — это прибыль от выбытия, $800,00, и она отрицательная, потому что счета Income содержат кредиты. $55,00 комиссий — это отдельная величина: именно она превращает $800,00 валовой спреда в $745,00 прибыли, и она уже записана в двух собственных проводках.
  • Проводка продажи уменьшает лот, который у вас уже должен быть на руках. Эта запись предполагает 10 ETH, купленных ранее на Coinbase по $2 500,00; без этого лота уменьшению не с чем соотноситься.

Расширенное управление себестоимостью​

Отслеживание по лотам​

Система учёта по лотам 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 хранит их как отрицательные числа. Поэтому каждая прибыль ниже — это отрицательная проводка на счёт доходов, а каждый убыток — положительная проводка на счёт расходов. Комиссия отдельна от обеих: это расход сам по себе, поэтому вычитание её также из прибыли привело бы к двойному вычету и оставило бы транзакцию несбалансированной.

Для одного выбытия арифметика всегда такова:

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

Продажа самого старого или самого нового лота​

Указание другой стоимости выбирает другой лот. Эти две продажи берут лот за $40 000,00, затем лот за $45 000,00 — два оставшихся после того, как лот за $50 000,00 ушёл в примере выше — что является тем же выбором, который 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, установите метод учёта на счёте вместо указания стоимости — "FIFO", "LIFO" или "HIFO" в директиве open, описанной в Управлении запасами.

Анализ производительности портфеля​

Настройка отслеживания цен​

Настройте автоматические потоки цен для точной оценки:

Для размещённых книг Live Prices предоставляет поддерживаемые пары автоматически. Статические директивы ниже показывают данные, которые использует оценка, и остаются полезными для воспроизводимых локальных примеров.

; 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"

Интеграция Staking и DeFi​

Отслеживание вознаграждений за стейкинг​

Записывайте награды за стейкинг с правильным признанием дохода. Поступающие единицы и признаваемый доход — это одно и то же событие, видимое с двух сторон, поэтому их веса должны взаимно уничтожаться: [единицы] × [цена] актива на входе, то же количество долларов дохода на выходе — а доход — это кредит, поэтому он отрицательный.

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 уже были доходом в январе. Признание всех $240,00 как прибыли — самый распространённый способ двойного учёта дохода от наград. Когда награда становится налогооблагаемой и по какой ставке — зависит от юрисдикции; журнал фиксирует получение и выбытие отдельно, чтобы можно было отчитаться по любому из подходов.

Отслеживание доходности DeFi​

Отслеживайте сложные позиции DeFi:

Предоставление ликвидности обменивает два товара на третий, поэтому каждая часть должна весить в одной валюте, прежде чем транзакция сможет сбалансироваться. Части 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-экспорт биржи (или получаете его своим скриптом) и конвертируете его в транзакции Beancount с помощью beangulp, фреймворка импортёров, пришедшего на смену встроенному beancount.ingest из Beancount 2. 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

Эти три числа берутся из ваших экранов биржи, а не с этой страницы, поэтому блок выше не будет сверяться ни с чем, пока ваши собственные транзакции не окажутся в журнале. Два правила определяют, будет ли он вообще сверяться. Директива balance утверждает баланс на начало указанного дня, поэтому утверждение, датированное 2024-01-31, не видит ничего, проведённого 2024-01-31 — датируйте его днём после периода, который закрываете. И каждый утверждаемый счёт должен быть открыт, вот почему Assets:Crypto:Kraken:ADA появляется в разделе Базовая иерархия счетов выше.

Управляемые цены в размещённом журнале​

Используйте Live Prices, чтобы выбрать валюту оценки и поддерживаемые криптоактивы, затем вставьте сгенерированные include-блоки в ваш размещённый журнал. Символы активов должны соответствовать вашим активам. Потоки предоставляют датированные цены оценки; они не задают сумму дохода или стоимость приобретения наград за стейкинг и аирдропов.

Ваша собственная цена имеет приоритет для той же даты и пары, включая обратную пару. Кэшированная котировка может устареть во время сбоя, поэтому проверяйте время её наблюдения. Рабочий процесс локального получения данных ниже остаётся полезным для вышестоящих Beancount и Fava.

Поддержание актуальности цен​

Цены живут в журнале как директивы price. Вышестоящий Beancount 3.2.3 не получает их сам; размещённые управляемые include-блоки используют расширение загрузчика Beancount.io, описанное выше. Не существует директивы custom "price-source" — голый символ товара даже не является допустимым значением custom, поэтому такая строка является синтаксической ошибкой — и не существует модуля beancount.plugins.forecast; загрузчик останавливается с ошибкой импорта, если вы его укажете.

Включите beanprice внутри управляемого движка с помощью bea engine enable beanprice, затем получайте котировки с помощью bea price main.beancount. Он читает поле метаданных price: в каждой директиве commodity в форме "<валюта котировки>:<модуль источника>/<тикер>" и записывает директивы 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"
 
; 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

Любые другие метаданные, которые вы прикрепляете к товару — 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 сам не отслеживает периоды владения.

Отчеты и аналитика​

Отчеты по портфелю​

Рассчитайте долю каждой криптовалюты в портфеле в одной валюте оценки. В этом примере используются цены в USD, доступные на 31 марта 2024 года, и активы до 1 апреля. Меняйте обе даты вместе для другой отчётной даты. Выполните приведённый ниже оператор SELECT в вашем локальном инструменте запросов BQL.

-- 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;

Убедитесь, что каждое ненулевое значение allocation_value указано в USD, прежде чем рассчитывать проценты. Преобразование использует записанные цены, доступные на дату оценки или раньше. Отсутствующее преобразование может оставить сумму в её исходной валюте. Если какая-либо сумма BTC, ETH или иная не в USD остаётся, оценка неполна. Добавьте недостающие датированные цены и повторите; не рассматривайте активы без цен как нулевые и не добавляйте единицы несвязанных валют.

Сложите суммы в USD, чтобы получить итог по портфелю. Затем рассчитайте долю каждого актива как стоимость актива в USD / итоговая стоимость в USD * 100. Сохраняйте полную точность до отображения процента. Например, активы из 1 BTC и 3 ETH по цене 200 USD за BTC и 20 USD за ETH дают:

АктивСтоимость в USDРасчёт долиОтображаемая доля
BTC200200 / 260 * 10076,92%
ETH6060 / 260 * 10023,08%
Итого260260 / 260 * 100100,00%

Округление отдельных долей до двух знаков после запятой может привести к тому, что их отображаемая сумма будет немного отличаться от 100%. Запас с нулевой стоимостью может отображаться пустым. Для пустого портфеля или нулевого итога в USD сообщайте о долях как о недоступных и не делите на ноль. Этот пример описывает положительные активы; отрицательные балансы требуют интерпретации знаковых экспозиций вместо обычных долей портфеля.

Аналитика производительности​

Отчитывайтесь о стоимости портфеля на конец каждого месяца, используя все активы до следующего месяца. Установите дату оценки на конец месяца, чтобы более поздние цены не могли изменить снимок. В этих примерах отчётность ведётся в USD. Выполняйте каждый SELECT отдельно в вашем локальном инструменте запросов BQL.

Для 31 января:

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

Для 29 февраля:

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

Для 31 марта:

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

FROM close ON исключает проводки, датированные его отсечкой или позже. Дата внутри convert выбирает цены, доступные на отчётную дату или раньше. Для другого месяца меняйте обе даты вместе. Запрашивайте каждый месяц, за который хотите отчитаться, включая месяцы без транзакций. Проверяйте наличие неконвертированных валют, как описано выше, прежде чем рассматривать результат как итог в USD.

Например, предположим, что январь заканчивается 2 BTC по цене 100 USD каждый и 3 ETH по 10 USD каждый. Продажа 1 BTC в феврале оставляет 1 BTC и 3 ETH. Если в марте нет сделок, но записанные цены растут до 200 USD за BTC и 20 USD за ETH, снимки таковы:

Конец месяцаСтоимость крипты на закрытие
31 января2 * 100 + 3 * 10 = 230 USD
29 февраля1 * 100 + 3 * 10 = 130 USD
31 марта1 * 200 + 3 * 20 = 260 USD

Значение за февраль предполагает отсутствие новых директив цен в этом месяце. Цена @ при продаже фиксирует её выручку; она не создаёт директиву рыночной цены. Эти запросы охватывают только счета Assets:Crypto:, поэтому денежная выручка, хранящаяся в другом месте, исключена.

Группировка проводок по месяцу транзакции измеряет движения каждого месяца, а не накопленные активы на закрытие. Она также пропускает месяцы без транзакций. Изменения между значениями на закрытие включают покупки, продажи, переводы и изменения цен. Это не доходность инвестиций, скорректированная на денежные потоки.

Анализ доходов​

Анализируйте источники дохода:

-- 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 обеспечивает гибкость и мощность, необходимые для управления сложными криптопортфелями across numerous exchanges, wallets, и DeFi-протоколов.

Ключевые преимущества использования Beancount.io для отслеживания криптопортфеля:

  • Полное владение данными: ваши данные в формате plain-text
  • Точная стоимость приобретения: учёт по лотам с конкретной идентификацией
  • Безграничная гибкость: настраиваемые структуры счетов и отчётности
  • Налоговая оптимизация: продвинутые стратегии для минимизации налоговых обязательств
  • Устойчивость к будущему: открытый формат обеспечивает долгосрочную доступность

Начните с базовой настройки и постепенно расширяйте отслеживание по мере роста сложности вашего портфеля. Инвестиции в правильную настройку окупятся точной отчётностью, налоговой оптимизацией и пониманием портфеля.

Готовы взять под контроль свой криптовалютный портфель? Начните работу с Beancount.io уже сегодня.

Источник: https://beancount.io/ru/docs/Solutions/cryptocurrency-portfolio-tracking