Gestión de Inventario en Beancount
El sistema de inventario de Beancount es una función poderosa para rastrear activos que se compran y venden con el tiempo, como acciones, fondos mutuos o divisas extranjeras. Permite un seguimiento preciso de la base del costo, lo cual es esencial para calcular las ganancias de capital y comprender el rendimiento de la cartera. Este tutorial cubre la mecánica central de la gestión de inventarios en tu libro mayor.
Conceptos Clave
En esencia, la gestión de inventario gira en torno al seguimiento de las posiciones. Una "posición" es simplemente una cantidad de un producto mantenido en una cuenta. Beancount distingue entre dos tipos fundamentales de posiciones.
Tipos de Posiciones
-
Posición Simple (Sin Costo): Este es un registro de saldo estándar. Representa una cantidad de un producto sin ningún costo de adquisición asociado. Es adecuado para efectivo o afirmaciones de saldo simples.
Assets:Bank:Checking 100.00 USD -
Posición con Base del Costo: Este tipo de posición incluye no solo el número de unidades y el producto, sino también el costo al que se adquirió. Esta es la base del seguimiento del inventario. El costo se especifica entre llaves
{}.Assets:Invest:VTSAX 10 VTSAX {100.00 USD, "lote-1"}En este ejemplo, tenemos 10 unidades de
VTSAX. Cada unidad se adquirió a un costo de $100.00 USD. Este lote específico de acciones se identifica como un "lote".
Operaciones de Inventario
Hay dos operaciones principales que puedes realizar en un inventario:
-
Aumentos (Agregar al inventario): Cuando compras un producto, aumentas tu inventario. Creas un nuevo lote con un número específico de unidades y una base del costo.
2024-01-15 * "Comprar acciones"
Assets:Invest:STOCK 50 STOCK {25.00 USD, "lote-1"}
Assets:Bank:Checking -1250.00 USDAquí, compramos 50 unidades de
STOCKa un costo por unidad de $25.00 USD. Esto crea un lote en la cuentaAssets:Invest:STOCK. -
Reducciones (Eliminar del inventario): Cuando vendes un producto, reduces tu inventario. Debes especificar de qué lote estás vendiendo. Esto se hace proporcionando información coincidente entre llaves.
2024-01-20 * "Vender acciones"
Assets:Invest:STOCK -25 STOCK {25.00 USD}
Assets:Bank:Checking 625.00 USDEn esta transacción, estamos vendiendo 25 unidades de
STOCKdel lote que se compró a $25.00 USD por unidad.
Métodos de Contabilización
Cuando reduces un inventario, Beancount necesita una regla para decidir de qué lote específico extraer si varios lotes coinciden o si la coincidencia es ambigua. Esta regla se llama "método de contabilización". Puedes establecer un método predeterminado para todo tu archivo o especificar uno para cada cuenta.
1. STRICT (Predeterminado)
El método STRICT es el predeterminado y el más seguro. Aplica una coincidencia explícita e inequívoca.
2024-01-01 open Assets:Invest:STOCK "STRICT"
- Requiere Coincidencia Exacta del Lote: Debes proporcionar suficiente información en el registro de reducción (
{...}) para identificar de manera única el lote que se está vendiendo. - Errores en Coincidencias Ambiguas: Si la información proporcionada coincide con varios lotes, Beancount generará un error, obligándote a ser más específico.
- Excepción: Si un registro de reducción elimina exactamente el número total de unidades mantenidas en una cuenta, se permite un especificador de costo vacío (
{}).
2. FIFO (Primero en Entrar, Primero en Salir)
El método FIFO automáticamente registra las reducciones contra los lotes disponibles más antiguos primero.
2024-01-01 open Assets:Invest:STOCK "FIFO"
- Resolución Automática: Resuelve la ambigüedad seleccionando los lotes coincidentes más antiguos.
- Coincidencia Cronológica: Este es un método de contabilidad común donde se asume que estás vendiendo los activos que has tenido durante más tiempo. Este es el método requerido para fines fiscales en muchos países.
3. LIFO (Último en Entrar, Primero en Salir)
El método LIFO es lo opuesto a FIFO. Registra las reducciones contra los lotes disponibles más nuevos primero.
2024-01-01 open Assets:Invest:STOCK "LIFO"
- Orden Cronológico Inverso: Selecciona los lotes adquiridos más recientemente que coinciden con los criterios de reducción.
- Optimización Fiscal: En algunas jurisdicciones, este método se puede utilizar para la optimización fiscal, por ejemplo, vendiendo las acciones con la base del costo más alta primero para minimizar las ganancias de capital.
4. NONE
El método NONE deshabilita por completo la coincidencia de lotes.
2024-01-01 open Assets:Invest:STOCK "NONE"
- Sin Coincidencia de Lotes: Beancount no intenta hacer coincidir las reducciones con los aumentos.
- Permite Signos Mixtos: Esto permite que una cuenta tenga saldos positivos y negativos del mismo producto simultáneamente. Este comportamiento es similar a cómo la herramienta Ledger CLI maneja los productos.
Especificación de Lote
Un "lote" es un bloque específico de un producto adquirido en un momento y precio particulares. Cuando creas o reduces una posición, puedes especificar sus atributos de lote en detalle.
Especificación Completa
Al aumentar un inventario (comprar), puedes especificar hasta tres atributos para el lote:
Assets:Invest:STOCK 10 STOCK {
100.00 USD, # Base del costo (costo por unidad)
2024-01-15, # Fecha de adquisición
"identificador-de-lote" # Una etiqueta de cadena única
}
Si bien los tres son opcionales, proporcionar al menos la base del costo es una práctica estándar.
Métodos de Coincidencia
Al reducir un inventario (vender), utilizas la misma sintaxis para especificar de qué lotes vender.
-
Coincidencia por costo: Este es el método más común.
Assets:Invest:STOCK -5 STOCK {100.00 USD} -
Coincidencia por fecha: Si los costos son idénticos, puedes desambiguar utilizando la fecha de adquisición.
Assets:Invest:STOCK -5 STOCK {2024-01-15} -
Coincidencia por etiqueta: Las etiquetas proporcionan una forma infalible de identificar un lote.
Assets:Invest:STOCK -5 STOCK {"identificador-de-lote"} -
Coincidir con cualquier lote: Un conjunto vacío de llaves
{}coincidirá con cualquier lote disponible. Esto se usa a menudo con la contabilizaciónFIFOoLIFO, donde el lote específico se selecciona automáticamente.Assets:Invest:STOCK -5 STOCK {}
Manejo de Precios
Es crucial comprender la diferencia entre la base del costo ({}) y el precio (@). Sirven para diferentes propósitos y no son intercambiables.
Precio vs. Costo
{costo}: Define el costo de adquisición de un activo. Es parte del lote de inventario en sí y se utiliza para registrar reducciones y calcular las ganancias de capital.@ precio: Una anotación que registra un precio de mercado en el momento de una transacción. Se utiliza para conversiones de divisas o para anotar el valor de mercado en una fecha particular.
Aquí están los tres escenarios:
-
Anotación de Precio (Conversión): Utiliza
@para convertir de una moneda a otra.Assets:Forex 1000 USD @ 0.85 EUR -
Base del Costo (Adquisición): Utiliza
{}al comprar un activo para establecer su costo.Assets:Invest 10 STOCK {100.00 USD} -
Ambos (Venta con Registro de Precio): Al vender un activo, utiliza
{}para identificar el lote que se está vendiendo y@para registrar el precio de venta. Esto permite el cálculo automatizado de las ganancias de capital.Assets:Invest -10 STOCK {100.00 USD} @ 105.00 USDEsta entrada vende 10
STOCKdel lote que costó 105.00 cada uno.
Reglas de Uso del Precio
- Las anotaciones de precio (
@) no afectan qué lote se registra. La coincidencia de lotes se maneja exclusivamente por la base del costo ({}) y el método de contabilización de la cuenta. - El símbolo
@se utiliza solo para:
- Conversiones de divisas.
- Registrar el valor de mercado de un activo en el momento de una transacción.
- Proporcionar el precio de venta para los cálculos de ganancias de capital.
Configuración
Puedes configurar los métodos de contabilización globalmente o por cuenta.
Método de Contabilización Global
Puedes establecer un método de contabilización predeterminado para todo tu archivo Beancount utilizando la directiva option.
option "booking_method" "STRICT"
Las opciones disponibles son "STRICT", "FIFO", "LIFO" y "NONE".
Anulación por Cuenta
A menudo es útil tener diferentes métodos para diferentes cuentas. Por ejemplo, es posible que desees FIFO para una cuenta de jubilación, pero STRICT para una cuenta de corretaje sujeta a impuestos para asegurarte de que estás vendiendo lotes fiscales específicos. Puedes establecer el método de contabilización cuando abres la cuenta.
2024-01-01 open Assets:Retirement:401K "FIFO"
2024-01-01 open Assets:Taxable:Stock "STRICT"
Mejores Prácticas
-
Organización del Inventario: Para mantener tu libro mayor limpio y simple, se recomienda encarecidamente utilizar cuentas separadas para cada producto único que tengas.
# BUENO: Cuentas separadas por producto
Assets:Invest:VTSAX ; Solo posiciones de VTSAX aquí
Assets:Invest:VFIAX ; Solo posiciones de VFIAX aquíEvita mezclar diferentes acciones o fondos en la misma cuenta, ya que complica la gestión del inventario.
-
Gestión de Lotes:
-
Utiliza etiquetas significativas para los lotes, especialmente para transacciones específicas como la recolección de pérdidas fiscales o las concesiones de acciones de los empleados.
Assets:Invest:STOCK 10 STOCK {100.00 USD, "recolección-de-pérdidas-fiscales-2024"} -
Documenta tus operaciones con comentarios. Esto hace que tu libro mayor sea más fácil de leer y comprender más adelante.
Assets:Invest:STOCK -10 STOCK {100.00 USD} @ 110.00 USD ; Ganancia: 10%
- Depuración: Si encuentras errores o un comportamiento inesperado, Beancount proporciona herramientas para inspeccionar el estado de tu inventario.
-
Examinar el Estado del Inventario: La herramienta
bean-doctorpuede mostrarte el estado exacto de todos los inventarios en cualquier punto de tu archivo.Reemplaza
<LINENO>con el número de línea justo después de una transacción para ver su efecto. -
Verificar la Coincidencia de Lotes: La herramienta
bean-checkvalida todo tu archivo. Detectará cualquier error de contabilización, como coincidencias de lotes ambiguas en el modoSTRICT.