Preskočiť na hlavný obsah

Príručka k presnosti a toleranciám v Beancounte

Správa číselnej presnosti je základným kameňom podvojného účtovníctva. V digitálnom účtovníctve, najmä pri práci s viacerými menami, cenami akcií a zlomkovými akciami, môžu malé rozdiely pri zaokrúhľovaní rýchlo viesť k frustrujúcim chybám pri vyrovnávaní. Beancount poskytuje sofistikovaný, ale intuitívny systém na spracovanie presnosti a nastavenie prijateľných tolerancií. Táto príručka vás prevedie tým, ako to funguje. ⚙️

Základné koncepty presnosti

presnosť

Hlavným cieľom Beancountu je zabezpečiť, aby sa každá transakcia vyrovnala na nulu. Výpočty zahŕňajúce ceny alebo náklady však často produkujú výsledky s väčším počtom desatinných miest, ako je praktické zaznamenávať. Tolerančný systém umožňuje malé, prijateľné nerovnováhy.

Automatické odvodenie tolerancie

Beancount štandardne automaticky odvodzuje požadovanú toleranciu pre každú transakciu. Toto odvodenie sa spracováva individuálne pre každú transakciu a vypočítava sa samostatne pre každú zahrnutú menu.

Pravidlo je jednoduché: tolerancia je polovica poslednej významnej číslice čísel prítomných v účtovných zápisoch transakcie.

Napríklad zvážte tento nákup:

2013-04-03 * "Kúpiť fond"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USD

Beancount odvodzuje tolerancie nasledovne:

  • Pre komoditu FUND má číslo 10.22626 5 desatinných miest. Tolerancia je polovica poslednej číslice, takže 0.00001div2=0.0000050.00001 \\div 2 = 0.000005 FUND.
  • Pre komoditu USD má číslo -384.61 2 desatinné miesta. Tolerancia je polovica poslednej číslice, takže 0.01div2=0.0050.01 \\div 2 = 0.005 USD.

Pravidlá váhy transakcie

Pri kontrole, či je transakcia vyrovnaná, Beancount vypočíta „váhu“ každého účtovného zápisu. Pravidlá pre tento výpočet sú:

  1. Jednoduchá suma: Ak má účtovný zápis iba sumu (napr. Assets:Cash -100.00 USD), jeho váha je táto presná suma.
  2. Cenový zápis: Ak má účtovný zápis cenu za jednotku (napr. 10 FUND @ 38.46 USD), jeho váha je suma × cena.
  3. Nákladový zápis: Ak má účtovný zápis celkové náklady (napr. 10 FUND {384.61 USD}), jeho váha je suma celkových nákladov.
  4. Náklady a cena: Ak má účtovný zápis celkové náklady aj cenu za jednotku (napr. 10 FUND {384.61 USD} @ 38.46 USD), na vyrovnávanie sa použijú iba celkové náklady. Cena za jednotku sa považuje za komentár alebo poznámku.

Pravidlá odvodenia presnosti

Systém automatického odvodenia sa riadi niekoľkými špecifickými pravidlami:

  1. Formát čísla
  • Celé sumy (napr. 10 USD) neprispievajú k odvodeniu presnosti.
  • Maximálna tolerancia, ktorú je možné automaticky odvodiť, je 0.05 jednotiek (napr. z čísla ako 10.1 USD). Ak potrebujete väčšiu toleranciu, musíte ju zadať manuálne.
  • Náklady a ceny (napr. {37.61 USD}) sú vylúčené z odvodenia tolerancie. Používajú sa iba primárne sumy účtovných zápisov.
  • Ak majú účtovné zápisy pre tú istú menu rôzne presnosti (napr. -10.10 USD a 5.123 USD), Beancount použije najhrubšiu (najväčšiu) toleranciu. V tomto prípade by to bolo založené na -10.10 USD, čo by dalo toleranciu 0.0050.005 USD.
  1. Predvolené spracovanie Môžete nastaviť globálnu alebo menovo špecifickú predvolenú toleranciu, ak transakcia nemá žiadne čísla s desatinnými miestami, z ktorých by sa dala odvodiť.

    ; Nastaví predvolenú toleranciu pre všetky meny bez explicitných pravidiel
    option "inferred_tolerance_default" "*:0.001"

    ; Nastaví špecifickú predvolenú toleranciu pre USD
    option "inferred_tolerance_default" "USD:0.003"
  2. Multiplikátor tolerancie Môžete globálne zvýšiť všetky odvodené tolerancie o pevný multiplikátor. To je užitočné na uvoľnenie kontrol v celom súbore bez zmeny každej transakcie. Multiplikátor 1.2 zvýši všetky odvodené tolerancie o 20 %.

    option "inferred_tolerance_multiplier" "1.2"
  3. Odvodenie na základe nákladov Aj keď sa náklady zvyčajne ignorujú pri odvodení tolerancie, môžete Beancountu prikázať, aby ich použil. To je užitočné, keď je konečná suma (napr. výber hotovosti) najpresnejším číslom v transakcii.

    option "infer_tolerance_from_cost" "TRUE"

Potvrdenia zostatku

Potvrdenia zostatku (balance) sa používajú na overenie, či sa zostatok vášho účtu zhoduje so známou hodnotou k určitému dátumu. Majú tiež priradenú toleranciu.

Základný formát

Podobne ako pri transakciách, tolerancia pre potvrdenie balance sa odvodzuje z počtu desatinných miest v sume.

; Potvrdzuje, že zostatok je 4.271 RGAGX s toleranciou ±0.0005
2015-05-08 balance Assets:Fund 4.271 RGAGX

; Potvrdzuje, že zostatok je 4.27 RGAGX s toleranciou ±0.005
2015-05-08 balance Assets:Fund 4.27 RGAGX

Vypočítaný zostatok musí spadať do tohto rozsahu. Pre druhý príklad by kontrolou prešiel akýkoľvek zostatok medzi 4.2654.265 a 4.2754.275.

Explicitné tolerancie

Ak odvodená tolerancia nie je vhodná, môžete ju explicitne zadať pomocou znaku tilda (~).

; Potvrdzuje, že zostatok je 4.271 RGAGX s vlastnou toleranciou ±0.01 RGAGX
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGX

Tu potvrdenie prejde, ak je vypočítaný zostatok medzi 4.2614.261 a 4.2814.281 RGAGX.

Správa zaokrúhľovania

Pre prípady, keď sa očakávajú a sú prijateľné malé zvyšky z výpočtov, Beancount poskytuje nástroje na ich systematickú správu.

Sledovanie chýb zaokrúhľovania

Môžete určiť špeciálny účet na automatické zhromažďovanie chýb zaokrúhľovania. Tým sa zabezpečí dokonalé vyrovnanie vašich transakcií presunutím drobných zvyšných súm na jedno miesto.

Najprv povoľte možnosť a otvorte účet:

option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

Teraz Beancount automaticky pridá tretiu časť k akejkoľvek transakcii, ktorá sa nevyrovná v rámci svojej tolerancie, a zaúčtuje rozdiel do Equity:RoundingError.

2013-02-23 * "Nákup"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD

V tejto transakcii 1.245times43.23=53.821351.245 \\times 43.23 = 53.82135. Transakcia je nevyvážená o 0.00135-0.00135 USD. Keď je povolená možnosť zaokrúhľovania, Beancount ju interne považuje za:

2013-02-23 * "Nákup"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD
Equity:RoundingError -0.00135 USD ; Automaticky pridané

Odvodená číselná presnosť

Beancount môže tiež použiť nastavenia tolerancie na automatické zaokrúhlenie čísel ešte pred ich vložením do dátových štruktúr knihy.

  1. Nie je zadaná tolerancia: Ak nie je definovaná žiadna tolerancia, čísla sa používajú s ich úplnou presnosťou. Nedochádza k žiadnemu zaokrúhľovaniu.

  2. S predvolenou toleranciou: Ak nastavíte predvolenú toleranciu, čísla sa kvantifikujú na túto úroveň.

    option "default_tolerance" "USD:0.001"

    Pri tomto nastavení by sa číslo ako 53.82135 USD zaokrúhlilo a uložilo ako 53.821 USD.

  3. S účtom zaokrúhľovania: Ak sú aktívne predvolená tolerancia aj účet zaokrúhľovania, Beancount kvantifikuje číslo a zachytí zvyšok.

    option "default_tolerance" "USD:0.01"
    option "account_rounding" "Equity:RoundingError"

    Číslo ako 53.82135 USD by sa uložilo ako 53.82 USD a zvyšok -0.00135 USD by sa zaúčtoval do Equity:RoundingError.

Podrobnosti implementácie

Niekoľko technických bodov objasňuje, ako Beancount dosahuje túto spoľahlivosť.

  1. Reprezentácia čísel: Beancount používa modul decimal jazyka Python, nie čísla s pohyblivou desatinnou čiarkou. To umožňuje až 28 desatinných miest presnosti a vyhýba sa chybám binárnej reprezentácie bežným pre čísla s pohyblivou desatinnou čiarkou.

  2. Trieda DisplayContext: Táto interná trieda spracováva všetky formátovania čísel na účely zobrazenia. Rešpektuje nastavenia presnosti špecifické pre menu a dokáže formátovať výstup so zarovnanými stĺpcami a čiarkami.

  3. Presnosť vs. tolerancia: Je dôležité rozlišovať tieto dva koncepty:

  • Presnosť sa týka formátu zobrazenia čísla (koľko desatinných miest sa zobrazuje).
  • Tolerancia je prípustná nerovnováha použitá počas overovacích kontrol.

Osvedčené postupy ✨

Tu je niekoľko praktických odporúčaní na správu presnosti vo vašej účtovnej knihe.

Počiatočné nastavenie

Pre väčšinu nových účtovných kníh je toto robustná úvodná konfigurácia:

; Rozumná predvolená hodnota pre väčšinu mien (napr. USD, EUR)
option "inferred_tolerance_default" "*:0.005"

; 10 % rezerva na všetky odvodené tolerancie
option "inferred_tolerance_multiplier" "1.1"

; Účet na zachytenie všetkého prachu zo zaokrúhľovania
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

Tipy na riešenie problémov

Ak sa vyskytnú chyby pri vyrovnávaní:

  • Pridajte desatinné číslice do sumy účtovného zápisu, aby ste vytvorili prísnejšie a presnejšie lokálne odvodenie tolerancie.
  • Použite explicitné tolerancie (~) na potvrdeniach balance, ktoré zlyhávajú v dôsledku predvídateľných nezrovnalostí.
  • Sledujte chyby zaokrúhľovania v vyhradenom účte, aby ste videli, kde a ako často sa vyskytujú.
  • Zvážte nastavenie predvolených hodnôt špecifických pre menu, ak často pracujete s menami, ktoré majú rôzne konvencie (napr. JPY nemá desatinné miesta).

Stratégia migrácie

Pri aplikácii týchto konceptov na existujúcu, neusporiadanú účtovnú knihu:

  1. Začnite s veľkorysou globálnou toleranciou (napr. *:0.05) a vysokým multiplikátorom, aby sa súbor overil.
  2. Postupne sprísňujte tolerancie a opravujte chyby, ktoré sa objavia.
  3. Pridajte explicitné číslice k sumám v problematických transakciách, aby odvodenie mohlo fungovať.
  4. Monitorujte zostatok účtu zaokrúhľovania. Veľký alebo rýchlo rastúci zostatok môže signalizovať systémový problém, ktorý si vyžaduje vyšetrenie.