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ó
-
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 -
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:
-
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 USDAquí, comprem 50 unitats de
STOCKa un cost per unitat de 25,00 $ USD. Això crea un lot al compteAssets:Invest:STOCK. -
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 USDEn aquesta transacció, venem 25 unitats de
STOCKdel 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
AmbiguousMatchErroren 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:GainsEs 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:GainsBeancount 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:GainsAixò 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:GainsEs carrega sense errors i registra un guany total de 1.400,00 $, distribuït així:
| Compte | Mètode | Lot registrada | Base de cost | Guany realitzat | Lots restants |
|---|---|---|---|---|---|
Assets:Broker:Fifo | FIFO | lot A, 2024-01-10 | 100,00 $ | 500,00 $ | 10 @ 120,00 $, 10 @ 90,00 $ |
Assets:Broker:Lifo | LIFO | lot C, 2024-03-10 | 90,00 $ | 600,00 $ | 10 @ 100,00 $, 10 @ 120,00 $ |
Assets:Broker:Hifo | HIFO | lot B, 2024-02-10 | 120,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:GainsAixò 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:GainsEn el moment que s'ha de comptabilitzar aquesta reducció, el carregador s'atura amb:
AVERAGE method is not supportedNo 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. SotaFIFO,LIFOoHIFOés el lot de coincidència més antic, nou o més car; sota elSTRICTper defecte, és unAmbiguousMatchErrortret 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:
-
Anotació de Preu (Conversió): Utilitza
@per convertir d'una moneda a una altra.Assets:Forex 1000 USD @ 0.85 EUR -
Cost Base (Adquisició): Utilitza
{}quan compris un actiu per establir-ne el cost.Assets:Invest 10 STOCK {100.00 USD} -
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 USDAquesta entrada ven 10
STOCKdel lot que va costar $100.00 cadascun, a un preu de venda de $105.00 cadascun.
Regles d'Ús del Preu
- 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. - 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
-
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 VFIAXEviteu barrejar diferents accions o fons al mateix compte, ja que complica la gestió d'inventari. La llista de mercaderies a
openfa que Beancount rebutgi una anotació errònia en lloc de barrejar silenciosament dos inventaris. -
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%
- 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 42per 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 checkvalida tot el vostre fitxer. Detectarà qualsevol error de registre, com ara correspondències amb lots ambigües en el modeSTRICT.