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

Шаблоны и примеры для криптовалют

Практические шаблоны Beancount и реальные примеры для распространенных сценариев с криптовалютами, включая торговлю, майнинг, стейкинг, аирдропы и деятельность в DeFi.

Это руководство содержит практические шаблоны Beancount и реальные примеры для распространенных сценариев с криптовалютами. Скопируйте и адаптируйте эти шаблоны для своих нужд бухгалтерии криптовалют.

Как читать эти блоки

Каждый блок в ограничителях ниже относится к одному из трех типов, и они не взаимозаменяемы:

  • Шаблоны содержат заполнители в [КВАДРАТНЫХ СКОБКАХ] и даты ГГГГ-ММ-ДД. Они не будут загружаться, пока вы не подставите реальные значения — скобки не являются синтаксисом 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

Инструкции по использованию

  1. Скопируйте соответствующий шаблон для вашего типа транзакции

  2. Замените каждый заполнитель. Шаблон не является допустимым Beancount, пока ГГГГ-ММ-ДД и каждый токен в [КВАДРАТНЫХ СКОБКАХ] не исчезнут — скобки не являются синтаксисом Beancount, и оставшаяся скобка — это ошибка разбора, а не молча игнорируемое значение. Подстановка механическая:

    ЗаполнительПодстановкаПример
    ГГГГ-ММ-ДДдата транзакции2024-03-20
    [СУММА]единицы актива, без кавычек0.5
    [КРИПТО]символ актива, заглавными буквамиBTC
    [БИРЖА]компонент счета для площадкиCoinbase
    [СЕБЕСТОИМОСТЬ]поединичная себестоимость удаляемого лота45000.00
    [ЦЕНА_ПРОДАЖИ]поединичная цена продажи48000.00
    [ВАЛОВАЯ_ВЫРУЧКА][СУММА] × [ЦЕНА_ПРОДАЖИ], до вычета комиссий24000.00
    [КОМИССИЯ]комиссия площадки, в валюте, в которой она взималась30.00
    [ПРИБЫЛЬ][ВАЛОВАЯ_ВЫРУЧКА][СУММА] × [СЕБЕСТОИМОСТЬ]1500.00

    Подстановка этой колонки в шаблон Продажа криптовалюты воспроизводит проработанный пример, напечатанный под ним, — это самый быстрый способ проверить, что вы правильно поняли шаблон.

  3. Скорректируйте названия счетов, чтобы они соответствовали вашей структуре счетов, и убедитесь, что каждый из них открыт Шаблоном структуры счетов — счет, который никогда не открывался, — это ошибка загрузки, а не предупреждение

  4. Добавьте метаданные по мере необходимости для налоговой отчетности или отслеживания

  5. Проверьте расчеты с помощью bea --file ваш-файл.bean check перед финализацией записей. Запись, которая не сбалансирована или уменьшает лот, которого у вас нет, завершится ошибкой здесь, а не молча создаст неправильный отчет

Лучшие практики

  • Используйте согласованные соглашения об именовании
  • Включайте идентификаторы транзакций в метаданные
  • Документируйте сложные транзакции тщательно
  • Проверяйте обменные курсы и цены
  • Регулярно создавайте резервные копии ваших файлов

Эти шаблоны обеспечивают прочную основу для бухгалтерии криптовалют в Beancount.io. Настройте их в соответствии с вашими конкретными потребностями и торговыми паттернами.

Источник: https://beancount.io/ru/docs/Tips/cryptocurrency-templates-examples