Preskočiť na hlavný obsah
Presnosť a tolerancie

Presnosť a tolerancie

Naučte sa, ako systémy presnosti a tolerancií v Beancount pomáhajú udržiavať rovnováhu v podvojnom účtovníctve, najmä pri práci so zložitými transakciami zahŕňajúcimi viacero mien a zlomkové hodnoty.

Riadenie numerickej presnosti je základom podvojného účtovníctva. V digitálnom účtovníctve, najmä pri práci s viacerými menami, cenami akcií a zlomkovými podielmi, môžu malé rozdiely v zaokrúhľovaní rýchlo viesť k frustrujúcim chybám pri párovaní. Beancount poskytuje sofistikovaný, ale intuitívny systém pre riadenie presnosti a nastavovanie prijateľných tolerancií. Táto príručka vás prevedie tým, ako funguje. ⚙️

Základné koncepty presnosti

Hlavným cieľom Beancount je zabezpečiť, aby každá transakcia bola vyrovnaná na nulu. Avšak výpočty zahŕňajúce ceny alebo náklady často produkujú výsledky s viac desatinnými miestami, než je praktické zaznamenať. Systém tolerancií umožňuje malé, prijateľné nevyváženosti.

Automatické odvodzovanie tolerancií

V predvolenom nastavení Beancount automaticky odvodzuje požadovanú toleranciu pre každú transakciu. Toto odvodzovanie sa spracúva individuálne pre každú transakciu a počíta sa samostatne pre každú zúčastnenú menu.

Pravidlo je jednoduché: tolerancia je polovica poslednej platnej číslice čísel prítomných v položkách transakcie.

Zvážte napríklad tento nákup:

2013-04-03 * "Nákup fondu"
  Assets:Fund     10.22626 FUND {37.61 USD}
  Assets:Cash     -384.61 USD

Beancount odvodí tolerancie nasledovne:

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

Pravidlá pre váhu transakcie

Pri kontrole, či je transakcia vyrovnaná, Beancount vypočíta "váhu" každej položky. Pravidlá pre tento výpočet sú:

  1. Jednoduchá suma: Ak má položka iba sumu (napr. Assets:Cash -100.00 USD), jej váhou je presne táto suma.
  2. Položka s cenou: Ak má položka cenu za jednotku (napr. 10 FUND @ 38.46 USD), jej váhou je suma × cena.
  3. Položka s nákladom: Ak má položka celkový náklad (napr. 10 FUND {384.61 USD}), jej váhou je celková suma nákladu.
  4. Náklad a cena: Ak má položka celkový náklad aj cenu za jednotku (napr. 10 FUND {384.61 USD} @ 38.46 USD), na vyrovnanie sa používa iba celkový náklad. Cena za jednotku sa považuje za komentár alebo poznámku.

Pravidlá odvodzovania presnosti

Automatický systém odvodzovania sa riadi niekoľkými špecifickými pravidlami:

  1. Formát čísla
  • Celočíselné sumy (napr. 10 USD) neprispievajú k odvodzovaniu 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 odvodzovania tolerancie. Používajú sa iba primárne sumy položiek.
  • Ak majú položky pre rovnakú menu rôznu presnosť (napr. -10.10 USD a 5.123 USD), Beancount použije najhrubšiu (najväčšiu) toleranciu. V tomto prípade by bola založená na -10.10 USD, čo by poskytlo toleranciu $0.005$ USD.
  1. Predvolené spracovanie Môžete nastaviť globálnu predvolenú toleranciu alebo predvolenú toleranciu pre konkrétnu menu, ak transakcia neobsahuje čí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. Je to užitočné na uvoľnenie kontrol v celom súbore bez zmeny každej transakcie. Multiplikátor 1.2 zvyšuje všetky odvodené tolerancie o 20%.

    option "inferred_tolerance_multiplier" "1.2"
  3. Odvodzovanie založené na nákladoch Zatiaľ čo náklady sú pri odvodzovaní tolerancie normálne ignorované, môžete Beancount inštruovať, aby ich používal. Je to užitočné, keď je konečná suma (napr. výber hotovosti) najpresnejším číslom v transakcii.

    option "infer_tolerance_from_cost" "TRUE"

Zostatkové tvrdenia

Zostatkové tvrdenia (balance) sa používajú na overenie, že zostatok vášho účtu zodpovedá známej hodnote k určitému dátumu. Majú tiež priradenú toleranciu.

Základný formát

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

; Tvrdí, že zostatok je 4.271 RGAGX s toleranciou ±0.0005
2015-05-08 balance Assets:Fund  4.271 RGAGX
 
; Tvrdí, ž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. V druhom príklade by akýkoľvek zostatok medzi 4.2654.265 a 4.2754.275 prešiel kontrolou.

Explicitné tolerancie

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

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

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

Riadenie zaokrúhľovania

Pre prípady, kde sú malé zvyšky z výpočtov očakávané a prijateľné, Beancount poskytuje nástroje na ich systematické riadenie.

Sledovanie chýb zaokrúhľovania

Môžete určiť špeciálny účet, ktorý bude automaticky zbierať chyby zaokrúhľovania. To udržuje vaše transakcie dokonale vyrovnané presunutím malý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 stranu ku každej transakcii, ktorá nie je vyrovnaná v rámci svojej tolerancie, a zaúčtuje rozdiel na Equity:RoundingError.

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

V tejto transakcii je 1.245times43.23=53.821351.245 \\times 43.23 = 53.82135. Transakcia je nevyrovnaná o 0.00135-0.00135 USD. S povolenou možnosťou zaokrúhľovania ju Beancount interne spracuje ako:

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á presnosť čísel

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

  1. Neuvedená tolerancia: Ak nie je definovaná žiadna tolerancia, čísla sa používajú v ich plnej presnosti. Nevykonáva sa žiadne zaokrúhľovanie.

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

    option "default_tolerance" "USD:0.001"

    S týmto nastavením by sa číslo ako 53.82135 USD zaokrúhlilo a uložilo ako 53.821 USD.

  3. S účtom na zaokrúhľovanie: Ak je aktívna predvolená tolerancia aj účet na zaokrúhľovanie, Beancount kvantuje čí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 na 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 Python modul decimal, nie čísla s pohyblivou desatinnou čiarkou. To umožňuje presnosť až na 28 desatinných miest a vyhýba sa chybám binárnej reprezentácie bežným pri floatoch.

  2. Trieda DisplayContext: Táto interná trieda spracúva všetko formátovanie čísel na účely zobrazenia. Rešpektuje nastavenia presnosti pre konkrétne meny 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 ukáže).
  • Tolerancia je povolená odchýlka od rovnováhy používaná počas overovacích kontrol.

Osvedčené postupy ✨

Tu je niekoľko praktických odporúčaní pre riadenie presnosti vo vašej knihe.

Počiatočné nastavenie

Pre väčšinu nových kníh je toto robustná počiatočná konfigurácia:

; Primeraná 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 zaokrúhľovacieho prachu
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

Tipy na riešenie problémov

Ak narazíte na chyby párovania:

  • Pridajte desatinné číslice k sume položky, aby ste vytvorili presnejšie miestne odvodenie tolerancie.
  • Použite explicitné tolerancie (~) na zostatkových tvrdeniach, ktoré zlyhávajú kvôli predvídateľným nezrovnalostiam.
  • Sledujte chyby zaokrúhľovania na vyhradenom účte, aby ste videli, kde a ako často vznikajú.
  • Zvážte nastavenie predvolených hodnôt pre konkrétne meny, ak často pracujete s menami, ktoré majú rôzne konvencie (napr. JPY nemá desatinné miesta).

Migračná stratégia

Pri aplikovaní týchto konceptov na existujúcu, neusporiadanú knihu:

  1. Začnite s veľkorysou globálnou toleranciou (napr. *:0.05) a vysokým multiplikátorom, aby sa súbor validoval.
  2. Postupne utiahnite tolerancie a opravujte chyby, ktoré sa objavia.
  3. Pridajte explicitné číslice do súm v problematických transakciách, aby odvodzovanie fungovalo správne.
  4. Sledujte zostatok účtu na zaokrúhľovanie. Veľký alebo rýchlo rastúci zostatok môže signalizovať systémový problém, ktorý si vyžaduje preskúmanie.