Saltar al contenido principal

Sigue una cartera cripto con base de coste en Beancount

Seguimiento de una cartera de criptomonedas en Beancount entre exchanges, con base de coste, lotes y análisis de rendimiento en un solo libro mayor.

Gestionar una cartera de criptomonedas en múltiples exchanges, carteras y protocolos DeFi puede ser un desafío. Esta guía completa te muestra cómo configurar y mantener un seguimiento preciso de tu cartera de criptomonedas usando el potente sistema de contabilidad de texto plano de Beancount.io.

Explora un libro mayor de ejemplo de criptomonedas en vivo:

Abrir Cryptocurrency Example Ledger en una pestaña nueva

Por Qué los Seguidores Tradicionales de Portafolios No Son Suficientes​

Problemas Comunes con Herramientas de Portafolio Cripto​

  • Soporte limitado de exchanges: Muchas herramientas no admiten todos los exchanges o protocolos DeFi
  • Base de costo inexacta: Los cálculos simplificados FIFO/LIFO pasan por alto escenarios complejos
  • Transacciones faltantes: Limitaciones de las API y vacíos en la entrada manual
  • Sin personalización: Categorías y estructuras de informes fijas
  • Preocupaciones de privacidad: Compartir claves de API con servicios de terceros
  • Dependencia del proveedor: Formatos de datos propietarios y opciones de exportación limitadas

Ventajas de Beancount.io​

  • Control total: Tus datos son tuyos en formato de texto plano
  • Personalización ilimitada: Crea cualquier estructura de cuentas que necesites
  • Base de costo precisa: Seguimiento por lotes con identificación específica
  • Soporte multiprotocolo: Maneja cualquier exchange, cartera o protocolo DeFi
  • Cálculos transparentes: Ve exactamente cómo se computan los números
  • A prueba de futuro: El formato de texto plano garantiza accesibilidad a largo plazo

Configurando la Estructura de tu Portafolio Cripto​

Jerarquía Básica de Cuentas​

Comienza con una estructura de cuentas completa que refleje tu ecosistema de criptomonedas:

; 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

Aquí hay una regla de nomenclatura que muerde, y el parser la aplica en lugar de la convención: cada componente de cuenta, y cada símbolo de mercancía, debe comenzar con una letra mayúscula o un dígito. Compound escribe su token de recibo cUSDC en toda su propia interfaz, pero Assets:DeFi:Compound:cUSDC y una mercancía cUSDC son ambos errores del lexer. Escríbelos CUSDC y conserva la ortografía propia del protocolo en el metadato name: de la mercancía.

Definiciones de Commodity con Metadatos​

Define tus criptomonedas con metadatos enriquecidos para un mejor seguimiento:

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"

Seguimiento de Portafolio Multi-Exchange​

Registro de Compras en Distintos Exchanges​

Rastrea la misma criptomoneda en diferentes exchanges con una base de costo precisa:

; 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

Transferencias entre Exchanges​

Rastrea transferencias entre exchanges manteniendo la base de costo:

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}

Oportunidades de Arbitraje​

Un arbitraje es un único evento económico en dos plazas, así que regístralo como una sola transacción. Esta entrada vende 10 ETH que ya tienes en Coinbase a $2,580.00 y restaura inmediatamente la posición en Binance a $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

Tres cosas que copiar:

  • Nunca dejes una línea en blanco entre asientos. Una línea en blanco termina la transacción, y Beancount reporta un error de sintaxis en los asientos posteriores. Usa comentarios ; indentados para etiquetar las patas en su lugar — que es lo que hacen las dos líneas de comentario anteriores.
  • La ganancia es la ganancia de la enajenación, $800.00, y es negativa porque las cuentas de Income mantienen créditos. Los $55.00 de comisiones son aparte: es lo que convierte $800.00 de diferencial bruto en $745.00 de beneficio, y ya está registrado en sus propios dos asientos.
  • La pata de venta reduce un lote que ya debes tener. Esta entrada asume 10 ETH comprados antes en Coinbase a $2,500.00; sin ese lote la reducción no tiene contra qué registrarse.

Gestión Avanzada de la Base de Costo​

Seguimiento basado en lotes​

El sistema por lotes de Beancount.io proporciona un seguimiento preciso de la base de costo:

; 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

La convención de signo para ganancias y pérdidas​

Las cuentas de Income mantienen créditos, así que Beancount los almacena como números negativos. Por lo tanto, cada ganancia a continuación es un asiento negativo a una cuenta de ingresos, y cada pérdida es un asiento positivo a una cuenta de gastos. La comisión es aparte de ambas: es un gasto por derecho propio, así que restarla también de la ganancia la deduciría dos veces y dejaría la transacción desbalanceada.

Para una enajenación la aritmética es siempre:

ganancia (o pérdida) = producto bruto - base de costo de los lotes eliminados
efectivo neto         = producto bruto - comisiones

Método de Identificación Específica​

Vende lotes específicos para un tratamiento fiscal óptimo. Nombrar el costo del lote en el asiento de reducción es lo que significa "identificación específica" en Beancount, y funciona con la reserva STRICT predeterminada:

; 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

Venta del lote más antiguo o más reciente​

Nombrar un costo diferente selecciona un lote diferente. Estas dos ventas toman el lote de $40,000.00 y luego el de $45,000.00 — los dos que siguen en pie después de que el de $50,000.00 se fuera en el ejemplo anterior — que es la misma selección que FIFO y LIFO harían automáticamente, escrita a mano:

; 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

Mismo precio de venta, lote diferente, $2,500.00 de diferencia en la ganancia realizada. Si prefieres que Beancount elija el lote por ti, establece un método de reserva en la cuenta en lugar de nombrar un costo — "FIFO", "LIFO" o "HIFO" en la directiva open, descrito en Gestión de inventario.

Análisis del Rendimiento del Portafolio​

Configuración del Seguimiento de Precios​

Configura fuentes de precios automatizadas para una valoración precisa:

Para libros alojados, Precios en vivo suministra los pares compatibles automáticamente. Las directivas estáticas a continuación muestran los datos que usa una valoración y siguen siendo útiles para ejemplos locales reproducibles.

; 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

Seguimiento de la Distribución del Portafolio​

Usa las funciones de informes de Beancount.io para analizar la asignación:

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

Métricas de Rendimiento​

Rastrea indicadores clave de rendimiento:

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

Integración de Staking y DeFi​

Seguimiento de Recompensas por Staking​

Registra las recompensas de staking con un reconocimiento de ingresos adecuado. Las unidades que llegan y los ingresos reconocidos son el mismo evento visto desde dos lados, así que sus pesos deben cancelarse: [unidades] × [precio] de activo entrante, la misma cantidad de dólares de ingresos salientes — y los ingresos son un crédito, así que son negativos.

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

Los {2,500.00 USD} y {0.50 USD} son valoraciones externas. Beancount almacena lo que escribas; no busca un precio ni decide qué cotización es la correcta. Elige una fuente — el exchange en el que realmente venderías, o un índice publicado — y úsala de forma consistente, porque ese número es tanto tu ingreso como tu futura base de costo.

La base de la recompensa se reconoce una vez​

Los $200.00 reconocidos arriba se convierten en la base de costo de los 0.08 ETH. Venderlos después realiza solo el movimiento desde la fecha de la recompensa:

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 de ganancia de capital, no $240.00 — los primeros $200.00 ya fueron ingresos en enero. Registrar los $240.00 completos como ganancia es la forma más común de que los ingresos por recompensas se cuenten dos veces. Cuándo se vuelve imponible la recompensa, y a qué tasa, varía según la jurisdicción; el libro mayor registra la recepción y la enajenación por separado para que cualquiera de los dos tratamientos pueda reportarse a partir de él.

Seguimiento de Rendimientos DeFi​

Rastrea posiciones DeFi complejas:

Proporcionar liquidez intercambia dos mercancías por una tercera, así que cada pata debe pesar en la misma moneda antes de que la transacción pueda balancearse. Las patas de ETH y LP ya lo hacen, porque llevan un costo; la pata de la stablecoin necesita un @ 1.00 USD explícito, de lo contrario Beancount ve salir 25,000 unidades de USDC y llegar $25,000.00 de valor, que son mercancías diferentes y no se cancelan.

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

Gestión Automatizada del Portafolio​

Importación de datos del exchange​

Beancount no incluye ningún cliente de API de exchanges, y no hay ningún archivo de configuración que lo haga hablar con Coinbase o Binance. La ruta admitida es un importer: descargas la exportación CSV del exchange (o la obtienes con tu propio script) y la conviertes en transacciones de Beancount con beangulp, el framework de importadores que sucedió al beancount.ingest integrado de Beancount 2. beancount.ingest no existe en Beancount 3.

Si escribes un script de obtención, su archivo de credenciales es solo tuyo — nada en la cadena de herramientas de Beancount lo lee:

# 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"

Conciliación Automatizada​

Configura la verificación automatizada de saldos:

; 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

Esos tres números provienen de tus pantallas de exchange, no de esta página, así que el bloque anterior no verificará contra nada hasta que tus propias transacciones estén en el libro mayor. Dos reglas deciden si verifica en absoluto. Una directiva balance afirma el saldo al comienzo del día nombrado, así que una afirmación fechada el 2024-01-31 no ve nada registrado el 2024-01-31 — fíjala el día siguiente al período que estás cerrando. Y toda cuenta afirmada debe estar abierta, que es la razón por la que Assets:Crypto:Kraken:ADA aparece en la sección Jerarquía básica de cuentas anterior.

Precios gestionados en un libro alojado​

Usa Precios en vivo para elegir una moneda de valoración y los activos cripto compatibles, luego pega los includes generados en tu libro alojado. Los símbolos de los activos deben coincidir con tus tenencias. Las fuentes proporcionan precios de valoración con fecha; no establecen el monto del ingreso ni el costo de adquisición de recompensas de staking y airdrops.

Tu propio precio tiene precedencia para la misma fecha y par, incluido el par recíproco. Una cotización en caché puede estar obsoleta durante una interrupción, así que verifica su hora de observación. El flujo de trabajo de obtención local a continuación sigue siendo útil para Beancount y Fava originales.

Mantener los precios actualizados​

Los precios viven en el libro mayor como directivas price. Beancount 3.2.3 original no los obtiene por sí mismo; los includes gestionados alojados usan la extensión del cargador de Beancount.io descrita arriba. No existe ninguna directiva custom "price-source" — un símbolo de mercancía desnudo ni siquiera es un valor custom válido, así que esa línea es un error de sintaxis — y no existe ningún módulo beancount.plugins.forecast; el cargador se detiene con un error de importación si lo nombras.

Habilita beanprice dentro del motor gestionado con bea engine enable beanprice, luego obtén cotizaciones con bea price main.beancount. Lee un campo de metadatos price: en cada directiva commodity, en la forma "<quote currency>:<source module>/<ticker>", y escribe directivas price que agregas a tu libro mayor:

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

Cualquier otro metadato que adjuntes a una mercancía — sector, website, o el campo price-source usado antes en esta guía — es documentación de forma libre para tu propio beneficio. El cargador lo almacena y ninguna herramienta actúa sobre él.

Estrategias de Optimización Fiscal​

Cosecha de Pérdidas Fiscales​

Implementa una cosecha de pérdidas fiscales sistemática:

; 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

Ganancias a Largo Plazo vs Corto Plazo​

Rastrea los períodos de tenencia para la optimización fiscal:

; 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

El enlace ^long-term-btc en ambas entradas es lo que te permite recuperar juntas la compra y la venta más tarde; Beancount no rastrea los períodos de tenencia por sí mismo.

Informes y Análisis​

Informes Resumidos de Cartera​

Calcula la participación de cada criptomoneda en el portafolio en una sola moneda de valoración. Este ejemplo usa precios en USD disponibles el 31 de marzo de 2024, y tenencias antes del 1 de abril. Cambia ambas fechas juntas para una fecha de informe diferente. Ejecuta la sentencia SELECT de abajo en tu herramienta de consultas BQL local.

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

Verifica que cada allocation_value distinto de cero esté en USD antes de calcular porcentajes. La conversión usa los precios registrados disponibles en o antes de la fecha de valoración. Una conversión faltante puede dejar un monto en su moneda original. Si queda algún monto que no sea USD en BTC, ETH u otro, la valoración está incompleta. Agrega los precios con fecha que falten y vuelve a ejecutar; no trates los activos sin precio como cero ni sumes unidades de monedas no relacionadas.

Suma los montos en USD para obtener el total del portafolio. Luego calcula la asignación de cada activo como valor USD del activo / valor USD total * 100. Conserva la precisión completa hasta mostrar el porcentaje. Por ejemplo, tenencias de 1 BTC y 3 ETH, con precios de 200 USD por BTC y 20 USD por ETH, dan:

ActivoValor en USDCálculo de asignaciónParticipación mostrada
BTC200200 / 260 * 10076.92%
ETH6060 / 260 * 10023.08%
Total260260 / 260 * 100100.00%

Redondear las participaciones individuales a dos decimales puede hacer que su suma mostrada difiera ligeramente de 100%. Un inventario con valor cero puede mostrarse en blanco. Para un portafolio vacío o un total en USD de cero, reporta las asignaciones como no disponibles y no dividas por cero. Este ejemplo describe tenencias positivas de activos; los saldos negativos requieren interpretar exposiciones con signo en lugar de participaciones ordinarias del portafolio.

Análisis de Rendimiento​

Reporta el valor de cierre del portafolio de cada mes usando todas las tenencias antes del mes siguiente. Establece la fecha de valoración al fin de mes para que los precios posteriores no puedan cambiar la instantánea. Estos ejemplos reportan en USD. Ejecuta cada SELECT por separado en tu herramienta de consultas BQL local.

Para el 31 de enero:

SELECT convert(sum(position), 'USD', 2024-01-31) AS portfolio_value
FROM close ON 2024-02-01
WHERE account ~ '^Assets:Crypto:';

Para el 29 de febrero:

SELECT convert(sum(position), 'USD', 2024-02-29) AS portfolio_value
FROM close ON 2024-03-01
WHERE account ~ '^Assets:Crypto:';

Para el 31 de marzo:

SELECT convert(sum(position), 'USD', 2024-03-31) AS portfolio_value
FROM close ON 2024-04-01
WHERE account ~ '^Assets:Crypto:';

FROM close ON excluye los postings fechados en o después de su límite. La fecha dentro de convert selecciona los precios disponibles en o antes de la fecha de informe. Para otro mes, cambia ambas fechas juntas. Solicita cada mes que quieras reportar, incluidos los meses sin transacciones. Verifica si hay monedas sin convertir como se describe arriba antes de tratar el resultado como un total en USD.

Por ejemplo, supón que enero termina con 2 BTC a 100 USD cada uno y 3 ETH a 10 USD cada uno. Vender 1 BTC en febrero deja 1 BTC y 3 ETH. Si marzo no tiene operaciones pero los precios registrados suben a 200 USD por BTC y 20 USD por ETH, las instantáneas son:

Fin de mesValor cripto de cierre
31 de enero2 * 100 + 3 * 10 = 230 USD
29 de febrero1 * 100 + 3 * 10 = 130 USD
31 de marzo1 * 200 + 3 * 20 = 260 USD

El valor de febrero asume que no hay nuevas directivas de precios ese mes. El precio @ de una venta registra sus ingresos; no crea una directiva de precio de mercado. Estas consultas cubren solo las cuentas Assets:Crypto:, así que los ingresos en efectivo mantenidos en otro lugar quedan excluidos.

Agrupar los postings por mes de transacción mide los movimientos de cada mes, no las tenencias de cierre acumuladas. También omite los meses sin transacciones. Los cambios entre valores de cierre incluyen compras, ventas, transferencias y cambios de precio. No son retornos de inversión ajustados por flujos de efectivo.

Análisis de Ingresos​

Analiza las fuentes de ingresos:

-- Income breakdown by source
SELECT
  account,
  sum(position) as total_income
WHERE account ~ "Income:Crypto"
GROUP BY account
ORDER BY total_income DESC;

Mejores Prácticas y Consejos​

1. Registro Consistente​

  • Registra las transacciones inmediatamente después de su ejecución
  • Usa descripciones de transacciones estandarizadas
  • Incluye los hashes de transacción en los metadatos

2. Conciliación Regular​

  • Verifica los saldos semanalmente en todas las plataformas
  • Usa afirmaciones de saldo para detectar discrepancias
  • Vigila las transacciones faltantes

3. Respaldo y Seguridad​

  • Haz copias de seguridad de tus archivos de Beancount con regularidad
  • Usa control de versiones (Git) para el seguimiento de cambios
  • Cifra los datos sensibles

4. Documentación​

  • Documenta tus decisiones sobre la estructura de cuentas
  • Mantén notas sobre transacciones complejas
  • Conserva registros de las configuraciones de API

5. Preparación de Impuestos​

  • Genera informes trimestrales para la planificación fiscal
  • Mantén registros detallados para fines de auditoría
  • Consulta con profesionales fiscales para situaciones complejas

Conclusión​

El seguimiento eficaz de una cartera de criptomonedas requiere precisión, consistencia y las herramientas adecuadas. Beancount.io ofrece la flexibilidad y la potencia necesarias para gestionar carteras de criptomonedas complejas en múltiples exchanges, carteras y protocolos DeFi.

Beneficios clave de usar Beancount.io para el seguimiento de carteras de criptomonedas:

  • Propiedad total de los datos: Tus datos en formato de texto plano
  • Base de costo precisa: Seguimiento por lotes con identificación específica
  • Flexibilidad ilimitada: Estructuras de cuentas e informes personalizados
  • Optimización fiscal: Estrategias avanzadas para minimizar la carga fiscal
  • A prueba de futuro: El formato abierto garantiza accesibilidad a largo plazo

Comienza con una configuración básica y amplía gradualmente tu seguimiento a medida que tu cartera crece en complejidad. La inversión en una configuración adecuada dará sus frutos en informes precisos, optimización fiscal y conocimiento de la cartera.

¿Listo para tomar el control de tu cartera de criptomonedas? Comienza con Beancount.io hoy.

Fuente: https://beancount.io/es/docs/Solutions/cryptocurrency-portfolio-tracking