Это руководство содержит практические шаблоны Beancount и реальные примеры для типичных криптовалютных сценариев. Копируйте и адаптируйте эти шаблоны под свои задачи учёта криптовалют.
Как читать эти блоки
Каждый блок в тройных кавычках ниже — это одно из трёх, и они не взаимозаменяемы:
- Шаблоны содержат заполнители
[В КВАДРАТНЫХ СКОБКАХ]и датыYYYY-MM-DD. Они не загрузятся, пока вы не подставите реальные значения — квадратные скобки не являются синтаксисом Beancount. - Примеры расположены непосредственно под своим шаблоном, содержат реальные даты и суммы и написаны так, чтобы загружаться. Каждому из них всё ещё нужно, чтобы счета, которых он касается, были открыты, — именно для этого служит Шаблон структуры счетов ниже. Единственное исключение — блок сверки, который утверждает балансы, удовлетворить которые может только ваш собственный реестр.
- Блок Арбитраж с флеш-кредитом — это псевдокод, и он помечен как таковой там, где встречается.
Через все они проходят две конвенции:
- Счета доходов содержат кредиты, поэтому они отрицательные. Реализованная прибыль — это отрицательная проводка на
Income:CapitalGains:…; реализованный убыток — положительная проводка наExpenses:CapitalLoss:…. Перепутать это местами — самый распространённый способ, которым криптопроводка не сходится. - Комиссия записывается один раз как расход и один раз как уменьшение денежных средств. Валовой доход поступает на счёт денежных средств, комиссия списывается обратно с него, и разница — это то, что фактически попадает на ваш счёт.
Изучите живой пример реестра криптовалют:
Шаблон базовой настройки
Шаблон структуры счетов
; =============================================================================
; CRYPTOCURRENCY ACCOUNT SETUP TEMPLATE
; =============================================================================
; Bank Accounts
1970-01-01 open Assets:Checking
; Exchange Accounts
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: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:Binance:ADA
; On-Chain and Mining Accounts
1970-01-01 open Assets:Crypto:Ethereum:ETH
1970-01-01 open Assets:Crypto:Polygon:ETH
1970-01-01 open Assets:Crypto:Mining:BTC
; Wallet Accounts
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
; 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
; Income Accounts
1970-01-01 open Income:Crypto:Staking:ETH
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:CapitalGains:Crypto
1970-01-01 open Income:CapitalGains:LongTerm
; Expense Accounts
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:Crypto:Bridge:Fees
1970-01-01 open Expenses:Crypto:Mining:Electricity
1970-01-01 open Expenses:CapitalLoss:Crypto
; Commodity Definitions
1970-01-01 commodity BTC
name: "Bitcoin"
asset-class: "cryptocurrency"
1970-01-01 commodity ETH
name: "Ethereum"
asset-class: "cryptocurrency"
1970-01-01 commodity USDC
name: "USD Coin"
asset-class: "stablecoin"
; Compound writes this receipt token "cUSDC", but a Beancount commodity
; and every account component must start with a capital letter or a digit,
; so the ledger spells it CUSDC and keeps the display name in metadata.
1970-01-01 commodity CUSDC
name: "cUSDC (Compound USD Coin)"
asset-class: "defi-receipt"Шаблоны торговли
Базовая покупка криптовалюты
; Template: Buy cryptocurrency on exchange
YYYY-MM-DD * "Buy [AMOUNT] [CRYPTO] on [EXCHANGE]"
Assets:Crypto:[EXCHANGE]:[CRYPTO] [AMOUNT] [CRYPTO] {[PRICE] USD}
Assets:Crypto:[EXCHANGE]:USD -[TOTAL_COST] USD
Expenses:Crypto:Fees:Trading [FEE] USD
Assets:Crypto:[EXCHANGE]:USD -[FEE] USD
; Example: Buy 1 BTC on Coinbase
2024-01-15 * "Buy 1 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Продажа криптовалюты
; Template: Sell cryptocurrency on exchange
YYYY-MM-DD * "Sell [AMOUNT] [CRYPTO] on [EXCHANGE]"
Assets:Crypto:[EXCHANGE]:[CRYPTO] -[AMOUNT] [CRYPTO] {[COST_BASIS] USD} @ [SALE_PRICE] USD
Assets:Crypto:[EXCHANGE]:USD [GROSS_PROCEEDS] USD
Expenses:Crypto:Fees:Trading [FEE] USD
Assets:Crypto:[EXCHANGE]:USD -[FEE] USD
Income:CapitalGains:Crypto -[GAIN] USD ; a loss is a positive Expenses:CapitalLoss:Crypto instead
; Example: Sell 0.5 BTC with a gain
2024-03-20 * "Sell 0.5 BTC on Coinbase"
Assets:Crypto:Coinbase:BTC -0.5 BTC {45000.00 USD} @ 48000.00 USD
Assets:Crypto:Coinbase:USD 24000.00 USD ; gross proceeds, 0.5 * 48,000.00
Expenses:Crypto:Fees:Trading 30.00 USD
Assets:Crypto:Coinbase:USD -30.00 USD ; the fee leaves the same cash account
Income:CapitalGains:Crypto -1500.00 USD ; 24,000.00 proceeds - 22,500.00 basisВыбывающий лот стоит $22 500,00 по себестоимости, продажа приносит $24 000,00 валовой выручки, и $30,00 из них уходит бирже — таким образом поступает $23 970,00 денежных средств и реализуется прибыль $1 500,00. Не вычитайте комиссию из прибыли: комиссия уже является расходом, и вычитание её во второй раз — это то, что оставляет проводку несбалансированной.
Обмен криптовалюты на криптовалюту
; Template: Trade one crypto for another
YYYY-MM-DD * "Trade [AMOUNT1] [CRYPTO1] for [AMOUNT2] [CRYPTO2]"
Assets:Crypto:[EXCHANGE]:[CRYPTO1] -[AMOUNT1] [CRYPTO1] {[COST_BASIS] USD}
Assets:Crypto:[EXCHANGE]:[CRYPTO2] [AMOUNT2] [CRYPTO2] {[NEW_PRICE] USD}
Income:CapitalGains:Crypto -[GAIN] USD ; taxable event; a loss is a positive Expenses:CapitalLoss:Crypto
Expenses:Crypto:Fees:Trading [FEE] USD
Assets:Crypto:[EXCHANGE]:USD -[FEE] USD
; Example: Trade BTC for ETH
2024-02-10 * "Trade 1 BTC for 20 ETH on Binance"
Assets:Crypto:Binance:BTC -1.0 BTC {46000.00 USD}
Assets:Crypto:Binance:ETH 20 ETH {2400.00 USD}
Income:CapitalGains:Crypto -2000.00 USD ; 48,000.00 received - 46,000.00 basis
Expenses:Crypto:Fees:Trading 40.00 USD
Assets:Crypto:Binance:USD -40.00 USDОбмен криптовалюты на криптовалюту выбывает первый товар, поэтому он реализует прибыль точно так же, как продажа за наличные: 20 ETH, приобретённых по $2 400,00, — это $48 000,00 полученной стоимости против $46 000,00 базы BTC. Комиссия $40,00 уплачивается наличными и не меняет прибыль.
Шаблоны переводов
Перевод с биржи на кошелек
; Template: Transfer crypto from exchange to wallet
YYYY-MM-DD * "Transfer [AMOUNT] [CRYPTO] from [EXCHANGE] to [WALLET]"
Assets:Crypto:[EXCHANGE]:[CRYPTO] -[AMOUNT] [CRYPTO] {[COST_BASIS] USD}
Assets:Crypto:Wallet:[WALLET]:[CRYPTO] [AMOUNT] [CRYPTO] {[COST_BASIS] USD}
Expenses:Crypto:Fees:Withdrawal [FEE] [CRYPTO] {[COST_BASIS] USD}
Assets:Crypto:[EXCHANGE]:[CRYPTO] -[FEE] [CRYPTO] {[COST_BASIS] USD}
; Example: Transfer BTC to Ledger
2024-01-20 * "Transfer 1 BTC from Coinbase to Ledger"
Assets:Crypto:Coinbase:BTC -1.0 BTC {45000.00 USD}
Assets:Crypto:Wallet:Ledger:BTC 1.0 BTC {45000.00 USD}
Expenses:Crypto:Fees:Withdrawal 0.0005 BTC {45000.00 USD}
Assets:Crypto:Coinbase:BTC -0.0005 BTC {45000.00 USD}Перевод — это не выбытие, поэтому он ничего не реализует: та же себестоимость {45000.00 USD} путешествует с монетами, и принимающий счёт наследует базу. Из этого следуют два последствия. Комиссия за вывод уплачивается в BTC и относится на расходы по той же себестоимости, поэтому она также ничего не реализует — если ваш подход говорит об обратном, оцените комиссию с @ и добавьте проводку прибыли. И отправляющий счёт должен уже содержать 1,0005 BTC именно по этой себестоимости, а не 1,0, потому что комиссия списывается из того же лота. Уменьшение без соответствующего лота не проведётся, как бы хорошо ни сходились итоги.
Перевод между биржами
; Template: Transfer between exchanges
YYYY-MM-DD * "Transfer [AMOUNT] [CRYPTO] from [EXCHANGE1] to [EXCHANGE2]"
Assets:Crypto:[EXCHANGE1]:[CRYPTO] -[AMOUNT] [CRYPTO] {[COST_BASIS] USD}
Assets:Crypto:[EXCHANGE2]:[CRYPTO] [AMOUNT] [CRYPTO] {[COST_BASIS] USD}
Expenses:Crypto:Fees:Network [FEE] [CRYPTO] {[COST_BASIS] USD}
Assets:Crypto:[EXCHANGE1]:[CRYPTO] -[FEE] [CRYPTO] {[COST_BASIS] USD}
; Example: Transfer ETH from Coinbase to Binance
2024-02-05 * "Transfer 10 ETH from Coinbase to Binance"
Assets:Crypto:Coinbase:ETH -10 ETH {2500.00 USD}
Assets:Crypto:Binance:ETH 10 ETH {2500.00 USD}
Expenses:Crypto:Fees:Network 0.01 ETH {2500.00 USD}
Assets:Crypto:Coinbase:ETH -0.01 ETH {2500.00 USD}Шаблоны стейкинга
Стейкинг Ethereum
; Template: Stake ETH
YYYY-MM-DD * "Stake [AMOUNT] ETH"
Assets:Crypto:Wallet:MetaMask:ETH -[AMOUNT] ETH {[PRICE] USD}
Assets:Staking:Ethereum:ETH [AMOUNT] ETH {[PRICE] USD}
Expenses:Crypto:Fees:Network [FEE] ETH {[PRICE] USD}
Assets:Crypto:Wallet:MetaMask:ETH -[FEE] ETH {[PRICE] USD}
; Example: Stake 32 ETH
2024-01-10 * "Stake 32 ETH on Ethereum 2.0"
Assets:Crypto:Wallet:MetaMask:ETH -32 ETH {2500.00 USD}
Assets:Staking:Ethereum:ETH 32 ETH {2500.00 USD}
Expenses:Crypto:Fees:Network 0.01 ETH {2500.00 USD}
Assets:Crypto:Wallet:MetaMask:ETH -0.01 ETH {2500.00 USD}Награды за стейкинг
; Template: Receive staking rewards
YYYY-MM-DD * "[CRYPTO] Staking Rewards - [PERIOD]"
Assets:Staking:[PROTOCOL]:[CRYPTO] [AMOUNT] [CRYPTO] {[PRICE] USD}
Income:Crypto:Staking:[CRYPTO] -[VALUE] USD ; [VALUE] = [AMOUNT] * [PRICE]
; Example: ETH staking rewards
2024-02-01 * "ETH Staking Rewards - January"
Assets:Staking:Ethereum:ETH 0.08 ETH {2600.00 USD}
Income:Crypto:Staking:ETH -208.00 USD ; 0.08 * 2,600.00Вознаграждение — это доход, полученный в натуральной форме, поэтому две проводки описывают одно и то же событие с обеих сторон: 0,08 ETH поступает с базой $2 600,00 за единицу, и соответствующий доход $208,00 является кредитом — отрицательным. {2,600.00 USD} — это внешняя цена, которую вы должны получить сами; Beancount записывает её, но не извлекает. Возьмите её с биржи или индекса, которым вы фактически пользуетесь, и придерживайтесь одного источника в течение всего года.
Эти $208,00 также становятся себестоимостью вознаграждения с этого момента. Когда вы в конечном счёте продадите 0,08 ETH, прибылью будет только изменение с этой даты — $208,00 уже были обложены налогом как доход и не должны признаваться дважды. Облагается ли доход налогом при получении или при выбытии, зависит от юрисдикции; реестр в любом случае фиксирует факты.
Шаблоны DeFi
Предоставление ликвидности на Uniswap
; Template: Add liquidity to Uniswap pool
YYYY-MM-DD * "Add liquidity to [TOKEN1]-[TOKEN2] pool"
Assets:Crypto:Wallet:MetaMask:[TOKEN1] -[AMOUNT1] [TOKEN1] {[PRICE1] USD}
Assets:Crypto:Wallet:MetaMask:[TOKEN2] -[AMOUNT2] [TOKEN2] {[PRICE2] USD}
Assets:DeFi:Uniswap:[TOKEN1]-[TOKEN2]-LP [LP_AMOUNT] [LP_TOKEN] {[LP_PRICE] USD}
Expenses:Crypto:Fees:Network [FEE] ETH {[ETH_PRICE] USD}
Assets:Crypto:Wallet:MetaMask:ETH -[FEE] ETH {[ETH_PRICE] USD}
; Example: Add ETH-USDC liquidity
2024-01-15 * "Add liquidity to ETH-USDC pool"
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-V3-ETH-USDC {500.00 USD}
Expenses:Crypto:Fees:Network 0.02 ETH {2500.00 USD}
Assets:Crypto:Wallet:MetaMask:ETH -0.02 ETH {2500.00 USD}Сверяйте это по одному товару за раз: $25 000,00 ETH плюс $25 000,00 USDC уходят, поступает $50 000,00 токена LP, и комиссия за газ переносит $50,00 ETH из кошелька в расходы. Часть со стейблкоином несёт @ 1.00 USD, потому что он хранится без базы себестоимости — без ценовой аннотации его вес составляет 25 000 USDC, что не может погасить доллары. Во многих юрисдикциях внесение в пул само по себе является выбытием обоих токенов; эта проводка намеренно переносит базу, поэтому добавьте проводки прибыли, если ваш подход этого требует.
Кредитование на Compound
; Template: Supply assets to Compound
YYYY-MM-DD * "Supply [AMOUNT] [TOKEN] to Compound"
Assets:Crypto:Wallet:MetaMask:[TOKEN] -[AMOUNT] [TOKEN] @ [TOKEN_PRICE] USD
Assets:DeFi:Compound:C[TOKEN] [C_AMOUNT] C[TOKEN] {[C_PRICE] USD}
Expenses:Crypto:Fees:Network [FEE] ETH {[ETH_PRICE] USD}
Assets:Crypto:Wallet:MetaMask:ETH -[FEE] ETH {[ETH_PRICE] USD}
; Example: Supply USDC to Compound
2024-01-20 * "Supply 10000 USDC to Compound"
Assets:Crypto:Wallet:MetaMask:USDC -10000 USDC @ 1.00 USD
Assets:DeFi:Compound:CUSDC 500 CUSDC {20.00 USD}
Expenses:Crypto:Fees:Network 0.008 ETH {2500.00 USD}
Assets:Crypto:Wallet:MetaMask:ETH -0.008 ETH {2500.00 USD}Две вещи позволяют этому загрузиться. Часть с USDC несёт @ 1.00 USD, поэтому обе стороны обмена весят в одной валюте — без этого Beancount видит, как появляется $10 000,00 CUSDC против исчезающих 10 000 единиц USDC, которые являются разными товарами и не сокращаются. И токен получения — это CUSDC, а не cUSDC: строчная первая буква — это ошибка лексера как в компоненте счёта, так и в символе товара, как бы протокол ни писал его в своём собственном интерфейсе.
Шаблоны майнинга
Награды за майнинг
; Template: Receive mining rewards
YYYY-MM-DD * "[CRYPTO] Mining Reward - [POOL/SOLO]"
Assets:Crypto:Mining:[CRYPTO] [AMOUNT] [CRYPTO] {[PRICE] USD}
Income:Crypto:Mining:[CRYPTO] -[VALUE] USD ; [VALUE] = [AMOUNT] * [PRICE]
; Example: Bitcoin mining reward
2024-01-15 * "BTC Mining Reward - Slush Pool"
Assets:Crypto:Mining:BTC 0.01 BTC {45000.00 USD}
Income:Crypto:Mining:BTC -450.00 USD ; 0.01 * 45,000.00Расходы на майнинг
; Template: Mining operational expenses
YYYY-MM-DD * "Mining [EXPENSE_TYPE] - [PERIOD]"
Expenses:Crypto:Mining:[EXPENSE_TYPE] [AMOUNT] USD
Assets:Checking -[AMOUNT] USD
; Example: Mining electricity costs
2024-01-31 * "Mining Electricity - January"
Expenses:Crypto:Mining:Electricity 800.00 USD
Assets:Checking -800.00 USDШаблоны аирдропов
Аирдропы токенов
; Template: Receive token airdrop
YYYY-MM-DD * "[TOKEN] Airdrop from [PROJECT]"
Assets:Crypto:Wallet:[WALLET]:[TOKEN] [AMOUNT] [TOKEN] {[PRICE] USD}
Income:Crypto:Airdrops -[VALUE] USD ; [VALUE] = [AMOUNT] * [PRICE]
; Example: UNI token airdrop
2024-03-01 * "UNI Airdrop from Uniswap"
Assets:Crypto:Wallet:MetaMask:UNI 400 UNI {8.00 USD}
Income:Crypto:Airdrops -3200.00 USD ; 400 * 8.00Как и вознаграждение за стейкинг, признанная стоимость аирдропа становится его базой себестоимости. Записывайте цену, которую вы можете обосновать, — первую ликвидную котировку токена из источника, который вы называете, — а не круглое число.
Продвинутые шаблоны
Арбитраж флэш-кредита
Этот блок — псевдокод, а не шаблон. Он намечает последовательность перемещений стоимости внутри флеш-кредита. Он не загрузится даже после подстановки значений, потому что пустые строки между группами завершают проводку — Beancount сообщает о синтаксической ошибке в проводках, следующих за одной из них. Записывайте реальный флеш-кредит как одну проводку без пустых строк (помечая этапы комментариями ; с отступом), опуская промежуточные этапы, которые сокращаются до нуля внутри одного блока.
Pseudocode: flash loan arbitrage
borrow Assets:Crypto:Temp:FlashLoan +[LOAN_AMOUNT] [TOKEN]
Liabilities:DeFi:[PROTOCOL]:Flash -[LOAN_AMOUNT] [TOKEN]
execute Assets:Crypto:Temp:FlashLoan -[LOAN_AMOUNT] [TOKEN]
Assets:Crypto:Temp:Arbitrage +[RETURN_AMOUNT] [TOKEN]
repay Liabilities:DeFi:[PROTOCOL]:Flash +[LOAN_AMOUNT] [TOKEN]
Assets:Crypto:Temp:Arbitrage -[LOAN_PLUS_FEE] [TOKEN]
keep Assets:Crypto:Wallet:[WALLET]:[TOKEN] +[PROFIT] [TOKEN]
Income:Crypto:Arbitrage -[PROFIT_USD] USDВсё, чего коснулся кредит, исчезает к концу блока, поэтому реестру фактически нужно записать прибыль и комиссию протокола. Пример арбитража в руководстве по отслеживанию портфеля показывает форму одной проводки.
Кроссчейн-мост
; Template: Bridge assets across chains
YYYY-MM-DD * "Bridge [AMOUNT] [TOKEN] from [CHAIN1] to [CHAIN2]"
Assets:Crypto:[CHAIN1]:[TOKEN] -[AMOUNT] [TOKEN] {[PRICE] USD}
Assets:Crypto:[CHAIN2]:[TOKEN] [AMOUNT] [TOKEN] {[PRICE] USD}
Expenses:Crypto:Bridge:Fees [FEE] [TOKEN] {[PRICE] USD}
Assets:Crypto:[CHAIN1]:[TOKEN] -[FEE] [TOKEN] {[PRICE] USD}
; Example: Bridge ETH to Polygon
2024-02-05 * "Bridge 5 ETH from Ethereum to Polygon"
Assets:Crypto:Ethereum:ETH -5 ETH {2600.00 USD}
Assets:Crypto:Polygon:ETH 5 ETH {2600.00 USD}
Expenses:Crypto:Bridge:Fees 0.01 ETH {2600.00 USD}
Assets:Crypto:Ethereum:ETH -0.01 ETH {2600.00 USD}Шаблоны с налоговой оптимизацией
Сбор налоговых убытков
; Template: Tax loss harvesting
YYYY-MM-DD * "Tax loss harvesting - Sell [CRYPTO] at loss"
Assets:Crypto:[EXCHANGE]:[CRYPTO] -[AMOUNT] [CRYPTO] {[HIGH_COST_BASIS] USD}
Assets:Crypto:[EXCHANGE]:USD [PROCEEDS] USD
Expenses:Crypto:Fees:Trading [FEE] USD
Assets:Crypto:[EXCHANGE]:USD -[FEE] USD
Expenses:CapitalLoss:Crypto [LOSS] USD
; Example: Harvest ADA loss
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, 1,000 * 0.45
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Убыток — это зеркальное отражение прибыли: $600,00 базы уходит, поступает $450,00 валовой выручки, и разница $150,00 — это положительная проводка на счёт расходов. Фактически поступает $445,00 денежных средств, после комиссии $5,00.
Долгосрочный прирост капитала
; Template: Long-term capital gains sale
YYYY-MM-DD * "Long-term sale - [CRYPTO] held > 1 year"
date-acquired: "[PURCHASE_DATE]"
holding-period: "[DAYS] days"
Assets:Crypto:[EXCHANGE]:[CRYPTO] -[AMOUNT] [CRYPTO] {[COST_BASIS] USD} @ [SALE_PRICE] USD
Assets:Crypto:[EXCHANGE]:USD [GROSS_PROCEEDS] USD
Expenses:Crypto:Fees:Trading [FEE] USD
Assets:Crypto:[EXCHANGE]:USD -[FEE] USD
Income:CapitalGains:LongTerm -[GAIN] USD
; Example: Long-term BTC sale
2025-02-01 * "Long-term sale - BTC held 382 days"
date-acquired: "2024-01-15"
holding-period: "382 days"
Assets:Crypto:Coinbase:BTC -1.0 BTC {45000.00 USD} @ 55000.00 USD
Assets:Crypto:Coinbase:USD 55000.00 USD
Expenses:Crypto:Fees:Trading 50.00 USD
Assets:Crypto:Coinbase:USD -50.00 USD
Income:CapitalGains:LongTerm -10000.00 USD ; 55,000.00 proceeds - 45,000.00 basisПрибыль составляет $10 000,00, а не $9 950,00: комиссия $50,00 уже записана как расход, поэтому вычитание её из прибыли вычло бы её дважды. Income:CapitalGains:LongTerm — это отдельный счёт от Income:CapitalGains:Crypto только для того, чтобы период владения был виден в отчёте — Beancount не вычисляет периоды владения за вас, поэтому метаданные date-acquired и holding-period стоит сохранять.
Шаблоны сверки
Ежемесячная проверка баланса
; Template: Monthly balance assertions
YYYY-MM-DD balance Assets:Crypto:[EXCHANGE]:[CRYPTO] [EXPECTED_BALANCE] [CRYPTO]
YYYY-MM-DD balance Assets:Crypto:Wallet:[WALLET]:[CRYPTO] [EXPECTED_BALANCE] [CRYPTO]
; Example: January balance 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:Wallet:Ledger:BTC 1.0 BTCВ отличие от других примеров здесь, этот не является самодостаточным по замыслу: суммы — это то, что показывают экраны вашей собственной биржи, и утверждение не пройдёт, пока ваши проводки не окажутся в реестре — в чём и весь смысл. Обратите внимание, что balance проверяет баланс на начало указанного дня, поэтому датируйте утверждение днём после периода, который вы закрываете.
Обновления цен
; Template: Daily price updates
YYYY-MM-DD price [CRYPTO] [PRICE] USD
; Example: Daily prices
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD
2024-01-15 price ADA 0.50 USDДля размещённого реестра Live Prices может автоматически поддерживать поддерживаемые цены оценки криптовалют. Оставьте статические цены выше для воспроизводимых примеров. Управляемые цены не заполняют цену сделки, доход от стейкинга или базу себестоимости аирдропа; записывайте эти значения проводок явно.
Инструкции по использованию
-
Скопируйте соответствующий шаблон для вашего типа проводки
-
Замените каждый заполнитель. Шаблон не является допустимым Beancount, пока
YYYY-MM-DDи каждый токен[В КВАДРАТНЫХ СКОБКАХ]не исчезнут — скобки не являются синтаксисом Beancount, и оставшаяся скобка — это ошибка разбора, а не молча проигнорированное значение. Подстановка механическая:Заполнитель Замена Пример YYYY-MM-DDдата проводки 2024-03-20[AMOUNT]единицы товара, без кавычек 0.5[CRYPTO]символ товара, заглавными буквами BTC[EXCHANGE]компонент счёта для площадки Coinbase[COST_BASIS]себестоимость за единицу выбывающего лота 45000.00[SALE_PRICE]цена за единицу, по которой вы продали 48000.00[GROSS_PROCEEDS][AMOUNT]×[SALE_PRICE], до комиссий24000.00[FEE]комиссия площадки в валюте, в которой она была начислена 30.00[GAIN][GROSS_PROCEEDS]−[AMOUNT]×[COST_BASIS]1500.00Подстановка этого столбца в шаблон Продажа криптовалюты воспроизводит разобранный пример, напечатанный под ним, — это самый быстрый способ проверить, что вы правильно прочитали шаблон.
-
Скорректируйте названия счетов в соответствии с вашей структурой счетов и убедитесь, что каждый из них открыт Шаблоном структуры счетов — счёт, который никогда не открывался, это ошибка загрузки, а не предупреждение
-
Добавьте метаданные по мере необходимости для налоговой отчётности или отслеживания
-
Проверьте расчёты с помощью
bea --file your-file.bean checkперед финализацией проводок. Проводка, которая не сходится или уменьшает лот, которого у вас нет, терпит неудачу там, а не тихо выдаёт неверный отчёт
Лучшие практики
- Используйте согласованные соглашения об именовании
- Включайте идентификаторы проводок в метаданные
- Тщательно документируйте сложные проводки
- Проверяйте обменные курсы и цены
- Регулярно создавайте резервные копии своих файлов
Эти шаблоны обеспечивают прочную основу для учёта криптовалют в Beancount.io. Настройте их под свои конкретные потребности и торговые паттерны.