Перейти до основного вмісту

Криптопортфель із собівартістю в Beancount

Ведення криптовалютного портфеля в Beancount через біржа, з визначенням вартості, партіями (lots) та аналізом ефективности в одному журналі.

Керування криптовалютним портфелем через кілька бірж, гаманців і DeFi-протоколів може бути складним завданням. Цей вичерпний посібник показує, як налаштувати й підтримувати точне відстеження криптовалютного портфеля за допомогою потужної системи бухгалтерії у простому тексті від Beancount.io.

Ознайомтеся з робочим прикладом леджера для криптовалют:

Відкрити Cryptocurrency Example Ledger у новій вкладці

Чому традиційні трекери портфеля не справляються​

Поширені проблеми з інструментами для крипто портфеля​

  • Обмежена підтримка бірж: багато інструментів не підтримують усі біржі чи 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

Тут спрацьовує одне правило найменування, і парсер забезпечує його виконання, а не угода: кожен компонент рахунку та кожен символ товару мають починатися з великої літери або цифри. 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"

Стейкінг та інтеграція 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, щоб вибрати валюту оцінки та підтримувані криптоактиви, а потім вставте згенеровані включення у свій розміщений леджер. Символи активів мають відповідати вашим активам. Джерела надають датовані ціни оцінки; вони не встановлюють суму доходу чи вартість придбання винагород за стейкінг і аірдропів.

Ваша власна ціна має пріоритет для тієї самої дати й пари, включно з оберненою парою. Кешована котировка може бути застарілою під час збою, тож перевіряйте час її спостереження. Робочий процес локального отримання нижче залишається корисним для upstream Beancount і Fava.

Підтримка актуальності цін​

Ціни живуть у леджері як директиви price. Upstream Beancount 3.2.3 не отримує їх сам; розміщені керовані включення використовують розширення завантажувача 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

Довгострокові проти короткострокових прибутків​

Відстежуйте періоди утримання для оптимізації податків:

; 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 забезпечує гнучкість і потужність, потрібні для управління складними криптопортфелями через кілька бірж, гаманців і DeFi-протоколів.

Ключові переваги використання Beancount.io для відстеження криптопортфеля:

  • Повне володіння даними: ваші дані у форматі простого тексту
  • Точна база витрат: відстеження на основі лотів з конкретною ідентифікацією
  • Необмежена гнучкість: власні структури рахунків і звітність
  • Оптимізація податків: передові стратегії для мінімізації податкових зобов'язань
  • Стійкість до майбутнього: відкритий формат забезпечує довгострокову доступність

Почніть з базового налаштування й поступово розширюйте відстеження в міру зростання складності вашого портфеля. Інвестиція в належне налаштування окупиться точною звітністю, оптимізацією податків та інсайтами щодо портфеля.

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

Джерело: https://beancount.io/uk/docs/Solutions/cryptocurrency-portfolio-tracking