Управление криптовалютным портфелем across numerous exchanges, wallets, и DeFi-протоколов может быть сложной задачей. Это подробное руководство показывает, как настроить и поддерживать точное отслеживание криптовалютного портфеля с помощью мощной системы учёта plain-text Beancount.io.
Изучите живой пример журнала криптовалют:
Почему традиционные трекеры портфеля не справляются
Распространённые проблемы с инструментами для портфелей криптовалют
- Ограниченная поддержка бирж: многие инструменты не поддерживают все биржи или 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 | Расчёт доли | Отображаемая доля |
|---|---|---|---|
| BTC | 200 | 200 / 260 * 100 | 76,92% |
| ETH | 60 | 60 / 260 * 100 | 23,08% |
| Итого | 260 | 260 / 260 * 100 | 100,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 уже сегодня.