Salta al contingut principal

Plantillas y Ejemplos de Criptomonedas

Plantillas prácticas de Beancount y ejemplos del mundo real para escenarios comunes de cripto, incluyendo trading, minería, staking, airdrops y DeFi.

Esta guía proporciona plantillas prácticas de Beancount y ejemplos del mundo real para escenarios comunes de criptomonedas. Copia y adapta estas plantillas para tus necesidades de contabilidad de cripto.

Cómo leer estos bloques

Cada bloque con código a continuación es una de tres cosas, y no son intercambiables:

  • Plantillas contienen marcadores de posición [CORCHETES] y fechas AAAA-MM-DD. No se cargarán hasta que sustituyas valores reales — los corchetes no son sintaxis de Beancount.
  • Ejemplos se colocan directamente debajo de su plantilla, llevan fechas y cantidades reales, y están escritos para cargarse. Cada uno aún necesita que las cuentas que toca estén abiertas, que es para lo que sirve la Plantilla de Estructura de Cuentas de abajo. La única excepción es el bloque de conciliación, que verifica saldos que solo tu propio libro mayor puede satisfacer.
  • El bloque de Arbitraje Flash Loan es seudocódigo, y está etiquetado como tal donde aparece.

Dos convenciones recorren todos ellos:

  • Las cuentas de ingresos mantienen créditos, por lo que son negativas. Una ganancia realizada es un apunte negativo en Income:CapitalGains:…; una pérdida realizada es un apunte positivo en Expenses:CapitalLoss:…. Invertir esto es la única razón más común por la que una entrada de cripto no cuadra.
  • Una comisión se registra una vez como gasto y una vez como reducción de efectivo. Los ingresos brutos van a la cuenta de efectivo, la comisión sale de ella, y la diferencia es lo que realmente llega a tu cuenta.

Explora un libro mayor de cripto de ejemplo en vivo:

Obre Libro Mayor de Cripto de Ejemplo en una pestanya nova

Plantilla de Estructura de Cuentas

Estructura de Cuentas Básica

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

Plantillas de Trading

Compra Básica de Criptomonedas

; 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

Venta de Criptomonedas

; 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

El lote vendido vale $22,500.00 al costo, la venta genera $24,000.00 brutos, y $30.00 de eso van al exchange — así que $23,970.00 de efectivo llegan y se realiza una ganancia de $1,500.00. No netees la comisión dentro de la ganancia: la comisión ya es un gasto, y restarla una segunda vez es lo que deja la transacción sin cuadrar.

Intercambio de Cripto a Cripto

; 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

Un intercambio de cripto a cripto dispone del primer activo, por lo que realiza una ganancia exactamente igual que una venta por efectivo: 20 ETH adquiridos a $2,400.00 son $48,000.00 de valor recibido contra una base de $46,000.00 en BTC. La comisión de $40.00 se paga en efectivo y no cambia la ganancia.

Plantillas de Transferencia

Transferencia de Exchange a Wallet

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

Una transferencia no es una disposición, por lo que no realiza nada: el mismo costo de {45000.00 USD} viaja con las monedas y la cuenta receptora hereda la base. Dos consecuencias siguen: la comisión de retiro se paga en BTC y se gasta a ese mismo costo, por lo que no realiza ganancia alguna — si tu tratamiento dice lo contrario, valora la comisión con @ y añade una ganancia. Y la cuenta emisora debe mantener 1.0005 BTC a ese costo exacto, no 1.0, porque la comisión sale del mismo lote. Una reducción sin lote que coincida no se registra, por muy bien que cuadren los totales.

Transferencia Entre Exchanges

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

Plantillas de Staking

Staking de 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}

Recompensas de Staking

; 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

Una recompensa es ingreso recibido en especie, por lo que los dos apuntes describen el mismo evento desde dos lados: 0.08 ETH llegan con una base de $2,600.00 por unidad, y los $208.00 correspondientes de ingreso son un crédito — negativo. El {2,600.00 USD} es un precio externo que debes obtener tú mismo; Beancount lo registra, no lo busca. Anótalo desde el exchange o índice que realmente uses, y mantén la misma fuente durante todo el año.

Ese $208.00 también es la base de costo de la recompensa desde aquí en adelante. Cuando eventualmente vendas los 0.08 ETH, solo el movimiento desde esta fecha es una ganancia — el $208.00 ya ha sido gravado como ingreso y no debe reconocerse dos veces. Si ese ingreso es gravable al recibirlo o al disponer de él difiere según la jurisdicción; el libro mayor solo registra los hechos.

Plantillas de DeFi

Provisión de Liquidez en 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}

Concilia un activo a la vez: $25,000.00 de ETH más $25,000.00 de USDC salen, llegan $50,000.00 del token LP, y la comisión de gas mueve $50.00 de ETH desde la wallet al gasto. La pata de stablecoin lleva @ 1.00 USD porque se mantiene sin base de costo — sin la anotación de precio, su peso serían 25,000 USDC, que no pueden cancelar dólares. En muchas jurisdicciones, depositar en un pool es en sí una disposición de ambos tokens; esta entrada deliberadamente traslada la base, así que añade los apuntes de ganancia si tu tratamiento lo requiere.

Préstamo en 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}

Dos cosas hacen que esta carga funcione. La pata de USDC lleva @ 1.00 USD para que ambos lados del intercambio pesen en la misma moneda — sin ello, Beancount vería aparecer $10,000.00 de CUSDC contra desaparecer 10,000 unidades de USDC, que son activos distintos y no se cancelan. Y el token recibido es CUSDC, no cUSDC: una primera letra en minúscula es un error de sintaxis tanto en un componente de cuenta como en un símbolo de activo, sin importar cómo lo escriba el protocolo en su propia interfaz.

Plantillas de Minería

Recompensas de Minería

; 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

Gastos de Minería

; 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

Plantillas de Airdrops

Airdrops de Tokens

; 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

Como una recompensa de staking, el valor reconocido del airdrop se convierte en su base de costo. Registra el precio que puedas defender — la primera cotización líquida del token, de una fuente que puedas nombrar — en lugar de un número redondeado.

Plantillas Avanzadas

Arbitraje Flash Loan

Este bloque es seudocódigo, no una plantilla. Esboza la secuencia de movimientos de valor dentro de un flash loan. No se cargará ni siquiera después de sustituir valores, porque las líneas en blanco entre los grupos terminan la transacción — Beancount reporta un error de sintaxis en los apuntes que siguen a una línea en blanco. Registra un flash loan real como una sola transacción sin líneas en blanco (etiquetando las patas con comentarios ; indentados), eliminando las patas intermedias que se netean a cero dentro del mismo bloque.

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

Todo lo que el préstamo tocó desaparece al final del bloque, así que lo que el libro mayor realmente necesita registrar es la ganancia y la comisión del protocolo. El ejemplo de arbitraje en la guía de seguimiento de cartera muestra la forma de transacción única.

Puente Entre Cadenas

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

Plantillas Optimizadas para Impuestos

Cosecha de Pérdidas Fiscales

; 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

La pérdida es la imagen espejo de una ganancia: $600.00 de base salen, llegan $450.00 de ingresos brutos, y la diferencia de $150.00 es un apunte positivo a una cuenta de gastos. $445.00 de efectivo es lo que realmente llega, después de la comisión de $5.00.

Ganancias de Capital a Largo Plazo

; 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

La ganancia es $10,000.00, no $9,950.00: la comisión de $50.00 ya está registrada como gasto, así que netearla dentro de la ganancia la deduciría dos veces. Income:CapitalGains:LongTerm es una cuenta separada de Income:CapitalGains:Crypto solo para que el período de tenencia sea visible en un informe — Beancount no calcula períodos de tenencia por ti, por lo que vale la pena llevar los metadatos date-acquired y holding-period.

Plantillas de Conciliación

Verificación de Saldo Mensual

; 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

A diferencia de los otros ejemplos aquí, este no es autocontenido por diseño: las cantidades son las que muestren las pantallas de tu propio exchange, y la verificación falla hasta que tus transacciones estén en el libro mayor — que es precisamente su propósito. Nota que balance verifica el saldo al inicio del día nombrado, así que fecha la verificación el día después del período que estás cerrando.

Actualizaciones de Precio

; 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

Instrucciones de Uso

  1. Copia la plantilla relevante para tu tipo de transacción

  2. Reemplaza cada marcador de posición. Una plantilla no es Beancount válido hasta que AAAA-MM-DD y cada token [CORCHETES] hayan desaparecido — los corchetes no son sintaxis de Beancount, y un sobrante es un error de análisis, no un valor ignorado silenciosamente. Sustituir es mecánico:

    MarcadorSustituir porEjemplo
    AAAA-MM-DDla fecha de la transacción2024-03-20
    [CANTIDAD]unidades del activo, sin comillas0.5
    [CRIPTO]el símbolo del activo, en mayúsculasBTC
    [EXCHANGE]el componente de cuenta para el lugarCoinbase
    [BASE_COSTO]el costo por unidad del lote que estás eliminando45000.00
    [PRECIO_VENTA]el precio por unidad al que vendiste48000.00
    [INGRESOS_BRUTOS][CANTIDAD] × [PRECIO_VENTA], antes de comisiones24000.00
    [COMISION]la comisión del lugar, en la moneda en que se cobró30.00
    [GANANCIA][INGRESOS_BRUTOS][CANTIDAD] × [BASE_COSTO]1500.00

    Sustituir esa columna en la plantilla de Venta de Criptomonedas reproduce el ejemplo trabajado impreso debajo, que es la forma más rápida de comprobar que has leído la plantilla correctamente.

  3. Ajusta los nombres de cuenta para que coincidan con tu estructura de cuentas, y asegúrate de que cada una esté abierta por la Plantilla de Estructura de Cuentas — una cuenta que nunca se abre es un error de carga, no una advertencia

  4. Añade metadatos según sea necesario para informes fiscales o seguimiento

  5. Verifica los cálculos con bea --file tu-archivo.bean check antes de finalizar las entradas. Una entrada que no cuadra, o que reduce un lote que no mantienes, falla allí en lugar de producir silenciosamente un informe erróneo

Mejores Prácticas

  • Usa convenciones de nomenclatura consistentes
  • Incluye IDs de transacción en los metadatos
  • Documenta transacciones complejas a fondo
  • Verifica tipos de cambio y precios
  • Mantén copias de seguridad regulares de tus archivos

Estas plantillas proporcionan una base sólida para la contabilidad de criptomonedas en Beancount.io. Personalízalas según tus necesidades específicas y patrones de trading.

Font: https://beancount.io/ca/docs/Tips/cryptocurrency-templates-examples