Salta al contingut principal

Gestió d'Inventari

Aprèn a gestionar l'inventari de manera efectiva amb Beancount, centrant-te en el seguiment d'actius com accions i divises, la comprensió de la base de cost i el càlcul de guanys de capital per a un millor rendiment de la cartera.

El sistema d'inventari de Beancount és una característica potent per fer el seguiment d'actius que es compren i venen al llarg del temps, com ara accions, fons d'inversió o divises estrangeres. Permet un seguiment precís del cost de base, essencial per a calcular guanys de capital i entendre el rendiment de la cartera. Aquest tutorial cobreix els mecanismes fonamentals de la gestió d'inventaris al vostre llibre major.

Conceptes bàsics

Al seu nucli, la gestió d'inventari gira al voltant del seguiment de posicions. Una "posició" és simplement una quantitat d'una mercaderia mantinguda en un compte. Beancount fa una distinció entre dos tipus fonamentals de posicions.

Tipus de posició

  1. Posició simple (Sense cost): Aquesta és una publicació estàndard de saldo. Representa una quantitat d'una mercaderia sense cap cost d'adquisició associat. És adequada per a efectiu o afirmacions de saldo senzilles.

    Assets:Bank:Checking      100.00 USD
  2. Posició amb cost de base: Aquest tipus de posició inclou no només el nombre d'unitats i la mercaderia sinó també el cost al qual es va adquirir. Aquesta és la base del seguiment d'inventari. El cost s'especifica dins d'esquerres {}.

    Assets:Invest:VTSAX      10 VTSAX {100.00 USD, "lot-1"}

    En aquest exemple, tenim 10 unitats de VTSAX. Cada unitat es va adquirir a un cost de 100,00 $ USD. Aquesta partida específica d'accions s'identifica com un "lot."

Operacions d'inventari

Hi ha dues operacions principals que podeu realitzar sobre un inventari:

  1. Augmentacions (Afegir a l'inventari): Quan compreu una mercaderia, augmenteu el vostre inventari. Creeu un nou lot amb un nombre específic d'unitats i un cost de base.

    2024-01-15 * "Buy shares"
      Assets:Invest:STOCK     50 STOCK {25.00 USD, "lot-1"}
      Assets:Bank:Checking   -1250.00 USD

    Aquí, comprem 50 unitats de STOCK a un cost per unitat de 25,00 $ USD. Això crea un lot al compte Assets:Invest:STOCK.

  2. Reduccions (Treure de l'inventari): Quan veneu una mercaderia, reduïu el vostre inventari. Heu d'especificar de quin lot veniu. Això es fa proporcionant informació coincident dins les esquerres.

    2024-01-20 * "Sell shares"
      Assets:Invest:STOCK    -25 STOCK {25.00 USD}
      Assets:Bank:Checking    625.00 USD

    En aquesta transacció, venem 25 unitats de STOCK del lot que es va comprar a 25,00 $ USD per unitat.

Mètodes de registre

Quan reduïu un inventari, Beancount necessita una regla per decidir de quin lot específic treure si diversos lots coincideixen amb la reducció. Aquesta regla s'anomena "mètode de registre." Podeu establir un valor predeterminat per a tot el fitxer amb una opció, o assignar un mètode a un compte específic mitjançant la directiva open.

Beancount 3.2.3 accepta set noms de mètodes: STRICT (el predeterminat), STRICT_WITH_SIZE, NONE, FIFO, LIFO, HIFO i AVERAGE. Sis d'ells estan implementats; AVERAGE analitza però genera un error en el moment que ha de registrar una reducció, com mostra la secció AVERAGE a continuació.

1. STRICT (Predeterminat)

El mètode STRICT és el predeterminat i el mètode de registre més segur. Fa complir una coincidència explícita i inequívoca.

2024-01-01 open Assets:Invest:STOCK "STRICT"
  • Requereix Coincidència Exacta de Lot: L’especificador de cost de la publicació de reducció ({...}) ha d’identificar un únic lot — per cost, per data d’adquisició, per etiqueta o per qualsevol combinació d’ells.
  • Errors en Coincidències Ambigües: Si l’especificador coincideix amb més d’un lot, Beancount genera un AmbiguousMatchError en lloc d’endevinar.
  • Excepció: Si una reducció elimina exactament el nombre total d’unitats que l’especificador coincideix, s’accepta un especificador buit ({}) i la reducció es reparteix entre aquests lots.

Aquest llibre major té dos lots i ven un d’ells anomenant el seu cost, que és inequívoc:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Strict  STK  "STRICT"
1970-01-01 open Assets:Broker:Cash    USD
1970-01-01 open Income:Gains          USD
 
2024-01-10 * "Buy the first lot"
  Assets:Broker:Strict    10 STK {100.00 USD}
  Assets:Broker:Cash   -1000.00 USD
 
2024-02-10 * "Buy the second lot"
  Assets:Broker:Strict    10 STK {120.00 USD}
  Assets:Broker:Cash   -1200.00 USD
 
; The cost identifies exactly one lot, so STRICT is satisfied.
2024-06-01 * "Sell the $120.00 lot"
  Assets:Broker:Strict   -10 STK {120.00 USD} @ 150.00 USD
  Assets:Broker:Cash    1500.00 USD
  Income:Gains

Es carrega sense errors, registra 300,00 $ de guany a Income:Gains i deixa 10 STK {100.00 USD} en el compte.

Substitueix aquesta última publicació per un especificador buit i el mateix fitxer fallarà:

; Rejected under STRICT: "-10 STK {}" matches both lots.
2024-06-01 * "Sell 10 shares"
  Assets:Broker:Strict  -10 STK {} @ 150.00 USD
  Assets:Broker:Cash   1500.00 USD
  Income:Gains

Beancount reporta Ambiguous matches for "-10 STK {}" i llista els candidats. Vendre la posició sencera està bé, ja que no queda res per escollir entre:

; Allowed under STRICT: -20 STK is the entire holding, so the empty
; specifier is split across both lots.
2024-06-01 * "Close the position"
  Assets:Broker:Strict  -20 STK {} @ 150.00 USD
  Assets:Broker:Cash   3000.00 USD
  Income:Gains

Això registra un guany de 800,00 $ — 3,000,00 $ d’ingressos contra 1,000,00 $ + 1,200,00 $ de base — i deixa el compte buit. Aquesta és una propietat del mateix STRICT, no una cosa per la qual hagis de canviar a STRICT_WITH_SIZE.

2. FIFO (Primer a Entrar, Primer a Sortir)

El mètode FIFO registra automàticament les reduccions contra els lots més antics disponibles primer.

2024-01-01 open Assets:Invest:STOCK "FIFO"
  • Resolució Automàtica: Resol l’ambigüitat seleccionant els lots més antics que coincideixen.
  • Coincidència Cronològica: Suposeu que veneu els actius que heu tingut durant més temps. Diverses autoritats fiscals consideren això com a predeterminat quan no heu identificat un lot.

3. LIFO (Darrer a Entrar, Primer a Sortir)

El mètode LIFO és l’oposat al FIFO. Registra les reduccions contra els lots més nous disponibles primer.

2024-01-01 open Assets:Invest:STOCK "LIFO"
  • Ordre cronològic invers: selecciona les lots coincidents més recentment adquirides.
  • Les més noves, no les més cares: LIFO escull només per la data d’adquisició. Succeeix que ven les accions de cost més alt quan els preus han estat pujant, però si la teva lot més nova és la més barata — que és el que l’exemple següent intenta mostrar — LIFO realitzarà la major plusvàlua, no la més petita. El mètode que sempre ven les accions més cares és HIFO, descrit a continuació.

4. HIFO (Highest-In, First-Out)

El mètode HIFO registra les reduccions primer contra les lots disponibles més cares, sigui quina sigui la seva data.

2024-01-01 open Assets:Invest:STOCK "HIFO"
  • Coincidència per cost més alt: selecciona les lots coincidents amb la base de cost més alta.
  • Plusvàlua realitzada més petita: per a un preu de venda donat, vendre les accions de cost més alt realitza la plusvàlua més petita (o la pèrdua més gran). Si es pot utilitzar depèn de la jurisdicció — als Estats Units, per exemple, triar una lot requereix identificació específica en el moment de la venda — així que tracta el mètode com un mecanisme de registre comptable i confirma l’elecció fiscal per separat.

5. Comparació de FIFO, LIFO i HIFO en les mateixes lots

Els tres mètodes només difereixen quan la lot més antiga, la més nova i la més cara són tres lots diferents. Aquest llibre major disposa exactament això — la lot A és la més antiga, la lot C és la més nova, i la lot B intermèdia és la més cara — i després ven 10 accions a partir de tres comptes que només difereixen pel seu mètode de registre:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Fifo  STK  "FIFO"
1970-01-01 open Assets:Broker:Lifo  STK  "LIFO"
1970-01-01 open Assets:Broker:Hifo  STK  "HIFO"
1970-01-01 open Assets:Broker:Cash  USD
1970-01-01 open Income:Gains        USD
 
; Lot A - the oldest, at $100.00 per share
2024-01-10 * "Buy lot A"
  Assets:Broker:Fifo     10 STK {100.00 USD}
  Assets:Broker:Lifo     10 STK {100.00 USD}
  Assets:Broker:Hifo     10 STK {100.00 USD}
  Assets:Broker:Cash  -3000.00 USD
 
; Lot B - the most expensive, at $120.00 per share
2024-02-10 * "Buy lot B"
  Assets:Broker:Fifo     10 STK {120.00 USD}
  Assets:Broker:Lifo     10 STK {120.00 USD}
  Assets:Broker:Hifo     10 STK {120.00 USD}
  Assets:Broker:Cash  -3600.00 USD
 
; Lot C - the newest, at $90.00 per share
2024-03-10 * "Buy lot C"
  Assets:Broker:Fifo     10 STK {90.00 USD}
  Assets:Broker:Lifo     10 STK {90.00 USD}
  Assets:Broker:Hifo     10 STK {90.00 USD}
  Assets:Broker:Cash  -2700.00 USD
 
; Sell 10 shares out of each account at $150.00 and let each
; account's booking method choose which lot leaves.
2024-06-01 * "Sell 10 shares from each account"
  Assets:Broker:Fifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Lifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Hifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Cash   4500.00 USD
  Income:Gains

Es carrega sense errors i registra un guany total de 1.400,00 $, distribuït així:

CompteMètodeLot registradaBase de costGuany realitzatLots restants
Assets:Broker:FifoFIFOlot A, 2024-01-10100,00 $500,00 $10 @ 120,00 $, 10 @ 90,00 $
Assets:Broker:LifoLIFOlot C, 2024-03-1090,00 $600,00 $10 @ 100,00 $, 10 @ 120,00 $
Assets:Broker:HifoHIFOlot B, 2024-02-10120,00 $300,00 $10 @ 100,00 $, 10 @ 90,00 $

La fila LIFO és la que val la pena fixar-se: va realitzar el guany més gran dels tres perquè la lot més nova també era la més barata.

6. STRICT_WITH_SIZE

STRICT_WITH_SIZE és STRICT amb un desempat addicional: quan diverses lots coincideixen però exactament una d’elles conté precisament el nombre d’unitats que estàs retirant, aquesta lot és la tria.

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Sized  STK  "STRICT_WITH_SIZE"
1970-01-01 open Assets:Broker:Cash   USD
1970-01-01 open Income:Gains         USD
 
2024-01-10 * "Buy 10 shares"
  Assets:Broker:Sized    10 STK {100.00 USD}
  Assets:Broker:Cash  -1000.00 USD
 
2024-02-10 * "Buy 7 shares"
  Assets:Broker:Sized     7 STK {120.00 USD}
  Assets:Broker:Cash   -840.00 USD
 
; Only one lot holds exactly 7 units, so the empty specifier resolves.
2024-06-01 * "Sell 7 shares"
  Assets:Broker:Sized    -7 STK {} @ 150.00 USD
  Assets:Broker:Cash   1050.00 USD
  Income:Gains

Això comptabilitza un benefici de 210,00 $ contra el lot de 120,00 $. El fitxer idèntic amb "STRICT" a la línia open falla amb Ambiguous matches for "-7 STK {}".

7. MITJANA (acceptat, però no implementat)

AVERAGE és un nom vàlid — tant option "booking_method" "AVERAGE" com open … "AVERAGE" es poden analitzar — però Beancount 3.2.3 no té cap implementació darrere. Tot aquí es carrega fins a la venda:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Avg   STK  "AVERAGE"
1970-01-01 open Assets:Broker:Cash  USD
1970-01-01 open Income:Gains        USD
 
2024-01-10 * "Buy 10 shares at $10.00"
  Assets:Broker:Avg      10 STK {10.00 USD}
  Assets:Broker:Cash  -100.00 USD
 
2024-02-10 * "Buy 10 more at $8.00"
  Assets:Broker:Avg      10 STK {8.00 USD}
  Assets:Broker:Cash   -80.00 USD
 
; An average-cost engine would book this at $9.00 per share. This one refuses.
2024-06-01 * "Sell 5 shares"
  Assets:Broker:Avg      -5 STK {}
  Assets:Broker:Cash    45.00 USD
  Income:Gains

En el moment que s'ha de comptabilitzar aquesta reducció, el carregador s'atura amb:

AVERAGE method is not supported

No planifiqueu un llibre major al seu voltant. Si avui voleu un comportament de cost mitjà, manteniu la posició en un compte NONE i calculeu la mitjana vosaltres mateixos, o feu un seguiment de cada lot i accepteu benefici a nivell de lot.

8. CAP

El mètode NONE desactiva completament la coincidència de lots.

2024-01-01 open Assets:Invest:STOCK "NONE"
  • Sense coincidència de lots: Beancount no intenta coincidir reduccions amb augmentacions.
  • Permet signes mixtos: Això permet que un compte tingui saldos positius i negatius simultàniament de la mateixa mercaderia. Aquest comportament és similar a com l'eina Ledger CLI maneja les mercaderies.

Especificació de lot

Un "lot" és un bloc específic d'una mercaderia adquirida en un moment i preu particulars. Quan creeu o reduïu una posició, podeu especificar en detall els atributs del lot.

Especificació completa

Quan augmenteu un inventari (compra), podeu especificar fins a tres atributs per al lot, separats per comes dins d'un sol parell de claus:

Assets:Invest:STOCK  10 STOCK {100.00 USD, 2024-01-15, "lot-identifier"}
  • 100.00 USD — el cost base, expressat per unitat.
  • 2024-01-15 — la data d’adquisició. Beancount la completa a partir de la data de la transacció si l’ometreu, és per això que els missatges d’error anteriors mostren una data a cada lot.
  • "lot-identifier" — una etiqueta de cadena opcional.

Tot i que els tres són opcionals, proporcionar almenys el cost base és la pràctica estàndard. Les claus han de romandre en una sola línia, i els comentaris dins d’un llibre major comencen amb ;, mai #.

Mètodes de coincidència

Quan reduïu un inventari (venda), utilitzeu la mateixa sintaxi per especificar de quin(s) lot(s) vendre.

  • Coincidència per cost: Aquest és el mètode més habitual.

    Assets:Invest:STOCK  -5 STOCK {100.00 USD}
  • Coincidència per data: Si els costos són idèntics, es pot desambiguar amb la data d’adquisició.

    Assets:Invest:STOCK  -5 STOCK {2024-01-15}
  • Coincidència per etiqueta: Les etiquetes ofereixen una manera infal·lible d’identificar un lot.

    Assets:Invest:STOCK  -5 STOCK {"lot-identifier"}
  • Deixeu el lot per al mètode de comptabilització: Un conjunt buit de claus {} no assigna cap lot, per tant, escull el mètode de comptabilització del compte. Sota FIFO, LIFO o HIFO és el lot de coincidència més antic, nou o més car; sota el STRICT per defecte, és un AmbiguousMatchError tret que la reducció buidi exactament els lots coincidents.

    Assets:Invest:STOCK  -5 STOCK {}

Gestió de preus

És crucial entendre la diferència entre cost base ({}) i preu (@). Tenen propòsits diferents i no són intercanviables.

Preu vs Cost

  • {cost}: Defineix el cost d'adquisició d'un actiu. Forma part del lot d'inventari i s'utilitza per registrar reduccions i calcular guanys de capital.
  • @ price: Una anotació que registra un preu de mercat en el moment d'una transacció. S'utilitza per conversions de divisa o per anotar el valor de mercat en una data determinada.

Aquí tens els tres escenaris:

  1. Anotació de Preu (Conversió): Utilitza @ per convertir d'una moneda a una altra.

    Assets:Forex     1000 USD @ 0.85 EUR
  2. Cost Base (Adquisició): Utilitza {} quan compris un actiu per establir-ne el cost.

    Assets:Invest    10 STOCK {100.00 USD}
  3. Ambdós (Venda amb registre de preu): Quan venguis un actiu, utilitza {} per identificar el lot venut i @ per registrar el preu de venda. Això permet el càlcul automatitzat de guanys de capital.

    Assets:Invest    -10 STOCK {100.00 USD} @ 105.00 USD

    Aquesta entrada ven 10 STOCK del lot que va costar $100.00 cadascun, a un preu de venda de $105.00 cadascun.

Regles d'Ús del Preu

  1. Les anotacions de preu (@) no afecten quin lot es reserva. L'aparellament de lots el maneja exclusivament el cost base ({}) i el mètode de registre del compte.
  2. El símbol @ s'utilitza només per:
  • Conversions de divisa.
  • Registrar el valor de mercat d'un actiu en el moment d'una transacció.
  • Proporcionar el preu de venda per al càlcul de guanys de capital.

Configuració

Pots configurar els mètodes de registre de forma global o per compte.

Mètode de Registre Global

Pots establir un mètode de registre per defecte per a tot el fitxer Beancount utilitzant la directiva option.

option "booking_method" "STRICT"

Els valors acceptats són "STRICT" (el per defecte si no estableixes res), "STRICT_WITH_SIZE", "NONE", "FIFO", "LIFO", "HIFO" i "AVERAGE". Qualsevol altra cadena és rebutjada en carregar amb Error for option 'booking_method'. "AVERAGE" és acceptat aquí i a open, però registrar una reducció sota aquest falla, com mostra la secció AVERAGE més amunt.

Supressió per Compte

Sovint és útil tenir mètodes diferents per a diferents comptes. Per exemple, podries voler FIFO per a un compte de jubilació però STRICT per a un compte de corredoria imposable per assegurar vendre lots fiscals específics. Pots establir el mètode de registre quan obris el compte.

2024-01-01 open Assets:Retirement:401K "FIFO"
2024-01-01 open Assets:Taxable:Stock  "STRICT"

Millors Pràctiques

  1. Organització d'Inventari: Per mantenir els teus llibres nets i senzills, es recomana molt utilitzar comptes separats per a cada producte únic que tinguis, i restringir cadascun a aquest producte amb la seva directiva open.

    ; GOOD: separate accounts by commodity, each constrained to one
    2024-01-01 open Assets:Invest:VTSAX  VTSAX
    2024-01-01 open Assets:Invest:VFIAX  VFIAX

    Eviteu barrejar diferents accions o fons al mateix compte, ja que complica la gestió d'inventari. La llista de mercaderies a open fa que Beancount rebutgi una anotació errònia en lloc de barrejar silenciosament dos inventaris.

  2. Gestió de lots:

  • Utilitzeu etiquetes significatives per als lots, especialment per a transaccions específiques com ara la campaanya de pèrdues fiscals o les assignacions d'accions a empleats.

    Assets:Invest:STOCK  10 STOCK {100.00 USD, "tax-loss-harvest-2024"}
  • Documenteu les vostres operacions amb comentaris. Això fa que el vostre llibre major sigui més fàcil de llegir i entendre posteriorment.

    Assets:Invest:STOCK  -10 STOCK {100.00 USD} @ 110.00 USD ; Gain: 10%
  1. Depuració: Si us trobeu amb errors o comportaments inesperats, Beancount ofereix eines per inspeccionar l'estat del vostre inventari.
  • Examineu l'estat de l'inventari: Utilitzeu bea doctor context main.beancount 42 per inspeccionar la transacció a la línia 42, incloent-hi les seves anotacions i els saldos dels comptes afectats. Substituïu el nom del fitxer i el número de línia per la transacció que voleu inspeccionar.

    Substituïu <LINENO> pel número de línia just després d'una transacció per veure el seu efecte.

  • Verifiqueu la coincidència dels lots: L'eina bea check valida tot el vostre fitxer. Detectarà qualsevol error de registre, com ara correspondències amb lots ambigües en el mode STRICT.

Font: https://beancount.io/ca/docs/Basics/inventories