Preskočiť na hlavný obsah

Beancount lots, nákladová základňa a metódy párovania

Ako Beancount páruje lots pri predaji akcií alebo mien: nákladová základňa, lot specs, STRICT, FIFO, LIFO a HIFO párovanie, cena vs náklad, prepisy pre jednotlivé účty.

Inventárny systém Beancount je výkonná funkcia na sledovanie aktív, ktoré sa v priebehu času kupujú a predávajú, ako sú akcie, podielové fondy alebo cudzie meny. Umožňuje presné sledovanie nákladovej základne, čo je nevyhnutné pre výpočet kapitálových ziskov a pochopenie výkonu portfólia. Tento tutoriál pokrýva základné mechanizmy správy zásob vo vašom ledgeri.

Základné koncepty​

V jadre sa správa zásob točí okolo sledovania pozícií. „Pozícia" je jednoducho množstvo komodity držanej na účte. Beancount rozlišuje dva základné typy pozícií.

Typy pozícií​

  1. Jednoduchá pozícia (bez nákladov): Toto je štandardné zaúčtovanie zostatku. Predstavuje množstvo komodity bez akýchkoľvek súvisiacich nákladov na obstaranie. Je vhodná pre hotovosť alebo jednoduché overenia zostatku.

    Assets:Bank:Checking      100.00 USD
  2. Pozícia s nákladovou základňou: Tento typ pozície zahŕňa nielen počet jednotiek a komoditu, ale aj náklady, za ktoré bola obstaraná. Toto je základ sledovania zásob. Náklady sa špecifikujú v zložených zátvorkách {}.

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

    V tomto príklade držíme 10 jednotiek VTSAX. Každá jednotka bola obstaraná za cenu 100,00 USD. Táto konkrétna dávka akcií sa označuje ako „lot."

Operácie so zásobami​

Existujú dve primárne operácie, ktoré môžete vykonávať so zásobami:

  1. Navýšenie (pridanie do zásob): Keď kupujete komoditu, navýšite svoje zásoby. Vytvoríte nový lot s konkrétnym počtom jednotiek a nákladovou základňou.

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

    Tu kupujeme 50 jednotiek STOCK za jednotkovú cenu 25,00 USD. Tým sa vytvorí lot na účte Assets:Invest:STOCK.

  2. Zníženie (odobratie zo zásob): Keď predávate komoditu, znižujete svoje zásoby. Musíte určiť, z ktorého lotu predávate. To sa vykoná poskytnutím zodpovedajúcich informácií v zložených zátvorkách.

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

    V tejto transakcii predávame 25 jednotiek STOCK z lotu, ktorý bol zakúpený za 25,00 USD za jednotku.

Metódy zaúčtovania​

Keď znižujete zásoby, Beancount potrebuje pravidlo na rozhodnutie, z ktorého konkrétneho lotu vybrať, ak zníženiu zodpovedá niekoľko lotov. Toto pravidlo sa nazýva „metóda priradenia." Môžete nastaviť predvolenú hodnotu pre celý súbor pomocou voliteľného parametra alebo priradiť konkrétnemu účtu vlastnú metódu v direktíve open.

Beancount 3.2.3 prijíma sedem názvov metód: STRICT (predvolená), STRICT_WITH_SIZE, NONE, FIFO, LIFO, HIFO a AVERAGE. Šesť z nich je implementovaných; AVERAGE sa spracuje, ale vyvolá chybu v momente, keď musí priradiť zníženie, ako ukazuje sekcia AVERAGE nižšie.

1. STRICT (Predvolený)​

Metóda STRICT je predvolená a najbezpečnejšia metóda priradenia. Vynucuje explicitné a jednoznačné párovanie.

2024-01-01 open Assets:Invest:STOCK "STRICT"
  • Vyžaduje presnú zhodu lotu: Špecifikátor nákladov zníženia ({...}) musí identifikovať jediný lot — podľa nákladov, dátumu obstarania, označenia alebo ľubovoľnej ich kombinácie.
  • Chyby pri nejednoznačných zhodách: Ak špecifikátor zodpovedá viac ako jednému lotu, Beancount vyvolá AmbiguousMatchError namiesto hádania.
  • Výnimka: Ak zníženie odoberie presne celkový počet jednotiek, ktorým špecifikátor zodpovedá, prázdny špecifikátor ({}) je povolený a zníženie sa rozdelí medzi tieto loty.

Tento ledger drží dva loty a predáva jeden z nich uvedením jeho nákladov, čo je jednoznačné:

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

Načíta sa bez chýb, zaúčtuje zisk 300,00 USD na Income:Gains a na účte zostane 10 STK {100.00 USD}.

Nahraďte posledné zaúčtovanie prázdnym špecifikátorom a ten istý súbor zlyhá:

; 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 hlási Ambiguous matches for "-10 STK {}" a uvádza kandidátov. Predaj celej pozície je však v poriadku, pretože nezostáva nič na výber:

; 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

To zaúčtuje zisk 800,00 USD — výnos 3 000,00 USD proti základni 1 000,00 USD + 1 200,00 USD — a účet zostane prázdny. Toto je vlastnosť samotnej metódy STRICT, nie niečo, na čo by ste museli prepnúť na STRICT_WITH_SIZE.

2. FIFO (First-In, First-Out)​

Metóda FIFO automaticky priraďuje zníženia najprv proti najstarším dostupným lotom.

2024-01-01 open Assets:Invest:STOCK "FIFO"
  • Automatické rozlíšenie: Rieši nejednoznačnosť výberom najstarších zodpovedajúcich lotov.
  • Chronologické párovanie: Predpokladáte, že predávate aktíva, ktoré ste držali najdlhšie. Viaceré daňové úrady to považujú za predvolené, keď ste neidentifikovali lot.

3. LIFO (Last-In, First-Out)​

Metóda LIFO je opakom FIFO. Priraďuje zníženia najprv proti najnovším dostupným lotom.

2024-01-01 open Assets:Invest:STOCK "LIFO"
  • Opačné chronologické poradie: Vyberá najnovšie obstarané zodpovedajúce loty.
  • Najnovšie, nie najdrahšie: LIFO vyberá iba podľa dátumu obstarania. Náhodou predáva akcie s najvyššími nákladmi, keď ceny rástli, ale ak je váš najnovší lot zároveň najlacnejší — čo je to, čo má príklad nižšie ukázať — LIFO realizuje najväčší zisk, nie najmenší. Metóda, ktorá vždy predáva najdrahšie akcie, je HIFO, popísaná nižšie.

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

Metóda HIFO priraďuje zníženia najprv proti najdrahším dostupným lotom, bez ohľadu na ich dátum.

2024-01-01 open Assets:Invest:STOCK "HIFO"
  • Párovanie podľa poradia nákladov: Vyberá zodpovedajúce loty s najvyššou nákladovou základňou.
  • Najmenší realizovaný zisk: Pri danej predajnej cene predaj akcií s najvyššími nákladmi realizuje najmenší zisk (alebo najväčšiu stratu). Či ju môžete použiť, je otázka jurisdikcie — napríklad v Spojených štátoch si výber lotu vôbec vyžaduje špecifickú identifikáciu v čase predaja — preto berte túto metódu ako účtovný mechanizmus a daňovú voľbu si overte samostatne.

5. Porovnanie FIFO, LIFO a HIFO na rovnakých sériách​

Tieto tri metódy sa líšia len vtedy, keď najstarší, najnovší a najdrahší lot sú tri rôzne loty. Tento ledger zariaďuje presne to — lot A je najstarší, lot C je najnovší a stredný lot B je najdrahší — a potom predáva 10 akcií z troch účtov, ktoré sa líšia iba svojou metódou priradenia:

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

Načíta sa s nulovými chybami a zaúčtuje celkový zisk 1 400,00 USD, rozdelený takto:

ÚčetMetódaPriradený lotNákladová základňaRealizovaný ziskZostávajúce loty
Assets:Broker:FifoFIFOlot A, 2024-01-10$100.00$500.0010 @ $120.00, 10 @ $90.00
Assets:Broker:LifoLIFOlot C, 2024-03-10$90.00$600.0010 @ $100.00, 10 @ $120.00
Assets:Broker:HifoHIFOlot B, 2024-02-10$120.00$300.0010 @ $100.00, 10 @ $90.00

Na riadok LIFO sa oplatí pozerať: realizoval najväčší zisk z troch, pretože najnovší lot bol zároveň najlacnejší.

6. STRICT_WITH_SIZE​

STRICT_WITH_SIZE je STRICT plus jeden dodatočný rozlišovač: keď zodpovedá niekoľko lotov, ale presne jeden z nich drží presne toľko jednotiek, koľko odoberáte, vyberie sa tento lot.

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

To zaúčtuje zisk 210,00 USD proti lotu za 120,00 USD. Identický súbor s "STRICT" na riadku open zlyhá s Ambiguous matches for "-7 STK {}".

7. PRIEMERNÁ (akceptovaná, ale neimplementovaná)​

AVERAGE je platný názov — option "booking_method" "AVERAGE" aj open … "AVERAGE" sa spracujú — ale Beancount 3.2.3 za ňou nemá žiadnu implementáciu. Všetko sa tu načíta až po predaj:

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

V momente, keď sa toto zníženie musí priradiť, zavádzač sa zastaví s:

AVERAGE method is not supported

Neplánujte okolo toho ledger. Ak dnes chcete správanie priemerných nákladov, držte pozíciu na účte NONE a priemernú hodnotu vypočítajte sami, alebo sledujte každý lot a akceptujte zisky na úrovni lotov.

8. ŽIADNE​

Metóda NONE úplne vypína párovanie lotov.

2024-01-01 open Assets:Invest:STOCK "NONE"
  • Žiadne párovanie lotov: Beancount sa nepokúša párovať zníženia s navýšeniami.
  • Povoľuje zmiešané znamienka: To umožňuje účtu držať súčasne kladné aj záporné zostatky tej istej komodity. Toto správanie je podobné tomu, ako s komoditami zaobchádza nástroj Ledger CLI.

Špecifikácia dávky​

„Lot" je konkrétny blok komodity obstaraný v určitom čase a za určitú cenu. Keď vytvárate alebo znižujete pozíciu, môžete podrobne určiť jej atribúty lotu.

Plná špecifikácia​

Pri navýšení zásob (kúpe) môžete pre lot určiť až tri atribúty, oddelené čiarkami v jednej dvojici zložených zátvoriek:

Assets:Invest:STOCK  10 STOCK {100.00 USD, 2024-01-15, "lot-identifier"}
  • 100.00 USD — nákladová základňa vyjadrená na jednotku.
  • 2024-01-15 — dátum obstarania. Beancount ho doplní z dátumu transakcie, keď ho vynecháte, a preto chybové hlásenia vyššie zobrazujú dátum pri každom lote.
  • "lot-identifier" — voliteľné textové označenie.

Hoci všetky tri sú voliteľné, poskytnutie aspoň nákladovej základne je štandardná prax. Zložené zátvorky musia zostať na jednom riadku a komentáre v ledgeri začínajú znakom ;, nikdy nie znakom #.

Metódy párovania​

Pri znížení zásob (predaji) používate rovnakú syntax na určenie, z ktorého lotu (lotov) predávate.

  • Párovanie podľa nákladov: Toto je najbežnejšia metóda.

    Assets:Invest:STOCK  -5 STOCK {100.00 USD}
  • Párovanie podľa dátumu: Ak sú náklady identické, môžete rozlíšiť pomocou dátumu obstarania.

    Assets:Invest:STOCK  -5 STOCK {2024-01-15}
  • Párovanie podľa označenia: Označenia poskytujú spoľahlivý spôsob identifikácie lotu.

    Assets:Invest:STOCK  -5 STOCK {"lot-identifier"}
  • Nechať lot na metódu priradenia: Prázdna množina zložených zátvoriek {} neoznačuje žiadny lot, takže vyberie metóda priradenia účtu. Pri FIFO, LIFO alebo HIFO je to najstarší, najnovší alebo najdrahší zodpovedajúci lot; pri predvolenej metóde STRICT je to AmbiguousMatchError, pokiaľ zníženie presne nevyprázdni zodpovedajúce loty.

    Assets:Invest:STOCK  -5 STOCK {}

Spracovanie cien​

Je dôležité pochopiť rozdiel medzi nákladovou základňou ({}) a cenou (@). Slúžia na rôzne účely a nie sú zameniteľné.

Cena vs Nákupná cena​

  • {cost}: Definuje náklady na obstaranie aktíva. Je súčasťou samotného lotu zásob a používa sa na priradenie znížení a výpočet kapitálových ziskov.
  • @ price: Anotácia, ktorá zaznamenáva trhovú cenu v čase transakcie. Používa sa na konverzie mien alebo na zaznamenanie trhovej hodnoty k určitému dátumu.

Tu sú tri scenáre:

  1. Cenová anotácia (konverzia): Použite @ na konverziu z jednej meny na druhú.

    Assets:Forex     1000 USD @ 0.85 EUR
  2. Nákladová základňa (obstaranie): Použite {} pri kúpe aktíva na stanovenie jeho nákladov.

    Assets:Invest    10 STOCK {100.00 USD}
  3. Obidve (predaj so záznamom ceny): Pri predaji aktíva použite {} na identifikáciu predávaného lotu a @ na zaznamenanie predajnej ceny. To umožňuje automatizovaný výpočet kapitálových ziskov.

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

    Tento záznam predáva 10 STOCK z lotu, ktorý stál 100,00 USD za kus, za predajnú cenu 105,00 USD za kus.

Samostatná direktíva price poskytuje referenčné údaje pre trhové ocenenie. Live Prices môže udržiavať tieto direktívy pre podporované aktíva v hostovaných ledgeroch. Obnovenie ponecháva vaše loty, metódu priradenia, náklady na obstaranie a zaznamenané výnosy z predaja nezmenené.

Pravidlá používania ceny​

  1. Cenové anotácie (@) neovplyvňujú, ktorý lot sa priradí. Párovanie lotov sa vykonáva výlučne prostredníctvom nákladovej základne ({}) a metódy priradenia účtu.
  2. Symbol @ sa používa iba na:
  • Konverzie mien.
  • Zaznamenanie trhovej hodnoty aktíva v čase transakcie.
  • Poskytnutie predajnej ceny pre výpočty kapitálových ziskov.

Konfigurácia​

Metódy priradenia môžete nakonfigurovať globálne alebo na úrovni jednotlivých účtov.

Globálna metóda účtovania​

Predvolenú metódu priradenia pre celý súbor Beancount môžete nastaviť pomocou direktívy option.

option "booking_method" "STRICT"

Prijímané hodnoty sú "STRICT" (predvolená, keď nenastavíte nič), "STRICT_WITH_SIZE", "NONE", "FIFO", "LIFO", "HIFO" a "AVERAGE". Akýkoľvek iný reťazec je odmietnutý v čase načítania s Error for option 'booking_method'. "AVERAGE" je tu aj v open prijímaná, ale priradenie zníženia pod ňou zlyhá, ako ukazuje sekcia AVERAGE vyššie.

Prepis nastavenia na úrovni účtu​

Často je užitočné mať rôzne metódy pre rôzne účty. Napríklad môžete chcieť FIFO pre dôchodkový účet, ale STRICT pre zdaniteľný brokerský účet, aby ste zaistili predaj konkrétnych daňových lotov. Metódu priradenia môžete nastaviť pri otvorení účtu.

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

Najlepšie postupy​

  1. Organizácia zásob: Aby váš ledger zostal čistý a jednoduchý, dôrazne sa odporúča používať samostatné účty pre každú jedinečnú komoditu, ktorú držíte, a obmedziť každý z nich na túto komoditu v jeho direktíve 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

    Vyhnite sa miešaniu rôznych akcií alebo fondov na tom istom účte, pretože to komplikuje správu zásob. Zoznam komodít v open spôsobí, že Beancount odmietne zblúdilé zaúčtovanie namiesto tichého zmiešania dvoch zásob.

  2. Správa lotov:

  • Používajte zmysluplné označenia pre loty, najmä pre konkrétne transakcie, ako je zber daňových strát alebo pridelenie zamestnaneckých akcií.

    Assets:Invest:STOCK  10 STOCK {100.00 USD, "tax-loss-harvest-2024"}
  • Dokumentujte svoje obchody pomocou komentárov. To uľahčuje čítanie a neskoršie pochopenie vášho ledgra.

    Assets:Invest:STOCK  -10 STOCK {100.00 USD} @ 110.00 USD ; Gain: 10%
  1. Ladenie: Ak narazíte na chyby alebo neočakávané správanie, Beancount poskytuje nástroje na kontrolu stavu vašich zásob.
  • Preskúmanie stavu zásob: Použite bea doctor context main.beancount 42 na preskúmanie transakcie na riadku 42 vrátane jej zaúčtovaní a ovplyvnených zostatkov účtov. Nahraďte názov súboru a číslo riadku transakciou, ktorú chcete preskúmať.

    Nahraďte <LINENO> číslom riadku hneď po transakcii, aby ste videli jej účinok.

  • Overenie párovania lotov: Nástroj bea check overuje celý váš súbor. Zachytí akékoľvek chyby priradenia, ako sú nejednoznačné zhody lotov v režime STRICT.

Zdroj: https://beancount.io/sk/docs/Basics/inventories