پرش به محتوای اصلی

راهنمای دقت و رواداری‌ها در Beancount

مدیریت دقت عددی، سنگ بنای حسابداری دوبل است. در دفترداری دیجیتال، به ویژه هنگام کار با ارزهای متعدد، قیمت سهام و سهام کسری، اختلافات کوچک ناشی از گرد کردن اعداد می‌تواند به سرعت منجر به خطاهای آزاردهنده تراز شود. Beancount یک سیستم پیچیده اما شهودی برای رسیدگی به دقت و تعیین رواداری‌های قابل قبول ارائه می‌دهد. این راهنما شما را با نحوه عملکرد آن آشنا می‌کند. ⚙️

مفاهیم اصلی دقت

precision

هدف اصلی Beancount اطمینان از این است که هر تراکنش به صفر برسد. با این حال، محاسباتی که شامل قیمت‌ها یا هزینه‌ها می‌شوند، اغلب نتایجی با رقم اعشار بیشتری از آنچه که عملاً قابل ثبت است، تولید می‌کنند. سیستم رواداری اجازه می‌دهد تا عدم ترازهای کوچک و قابل قبول وجود داشته باشد.

استنباط خودکار رواداری

به طور پیش فرض، Beancount رواداری مورد نیاز برای هر تراکنش را به طور خودکار استنباط می‌کند. این استنباط به صورت جداگانه برای هر تراکنش انجام می‌شود و به طور جداگانه برای هر ارز درگیر محاسبه می‌شود.

قانون ساده است: رواداری نصف آخرین رقم معنی‌دار اعداد موجود در سند حسابداری تراکنش است.

به عنوان مثال، این خرید را در نظر بگیرید:

2013-04-03 * "خرید صندوق"
Assets:Fund 10.22626 FUND {37.61 USD}
Assets:Cash -384.61 USD

Beancount رواداری‌ها را به شرح زیر استنباط می‌کند:

  • برای کالای FUND، عدد 10.22626 دارای 5 رقم اعشار است. رواداری نصف آخرین رقم است، بنابراین 0.00001div2=0.0000050.00001 \\div 2 = 0.000005 FUND.
  • برای کالای USD، عدد -384.61 دارای 2 رقم اعشار است. رواداری نصف آخرین رقم است، بنابراین 0.01div2=0.0050.01 \\div 2 = 0.005 USD.

قوانین وزن تراکنش

هنگام بررسی اینکه آیا یک تراکنش تراز است یا خیر، Beancount "وزن" هر سند حسابداری را محاسبه می‌کند. قوانین این محاسبه عبارتند از:

  1. مبلغ ساده: اگر یک سند حسابداری فقط یک مبلغ داشته باشد (مثلاً Assets:Cash -100.00 USD)، وزن آن دقیقاً همان مبلغ است.
  2. سند حسابداری قیمت: اگر یک سند حسابداری دارای قیمت واحد باشد (مثلاً 10 FUND @ 38.46 USD)، وزن آن مبلغ × قیمت است.
  3. سند حسابداری هزینه: اگر یک سند حسابداری دارای هزینه کل باشد (مثلاً 10 FUND {384.61 USD})، وزن آن مبلغ کل هزینه است.
  4. هزینه و قیمت: اگر یک سند حسابداری دارای هزینه کل و قیمت واحد باشد (مثلاً 10 FUND {384.61 USD} @ 38.46 USDفقط هزینه کل برای تراز کردن استفاده می‌شود. قیمت واحد به عنوان یک نظر یا یادداشت در نظر گرفته می‌شود.

قوانین استنباط دقت

سیستم استنباط خودکار از چند قانون خاص پیروی می‌کند:

  1. فرمت عدد
  • مبالغ صحیح (مثلاً 10 USD) در استنباط دقت مشارکت نمی‌کنند.
  • حداکثر رواداری که می‌تواند به طور خودکار استنباط شود، 0.05 واحد است (مثلاً از عددی مانند 10.1 USD). اگر به رواداری بزرگتری نیاز دارید، باید آن را به صورت دستی مشخص کنید.
  • هزینه‌ها و قیمت‌ها (مثلاً {37.61 USD}) از استنباط رواداری مستثنی هستند. فقط مبالغ اصلی اسناد حسابداری استفاده می‌شوند.
  • اگر اسناد حسابداری برای یک ارز یکسان دارای دقت‌های متفاوتی باشند (به عنوان مثال، -10.10 USD و 5.123 USD)، Beancount از درشت‌ترین (بزرگترین) رواداری استفاده می‌کند. در این حالت، بر اساس -10.10 USD خواهد بود و رواداری 0.0050.005 USD را به دست می‌دهد.
  1. رسیدگی پیش فرض اگر یک تراکنش هیچ عددی با رقم اعشار نداشته باشد که بتوان از آن استنباط کرد، می‌توانید یک رواداری پیش فرض جهانی یا مختص ارز تعیین کنید.

    ; یک رواداری پیش فرض برای همه ارزها بدون قوانین صریح تعیین می‌کند
    option "inferred_tolerance_default" "*:0.001"

    ; یک رواداری پیش فرض خاص برای USD تعیین می‌کند
    option "inferred_tolerance_default" "USD:0.003"
  2. ضریب رواداری می‌توانید به طور کلی همه رواداری‌های استنباطی را با یک ضریب ثابت افزایش دهید. این برای کاهش بررسی‌ها در کل فایل شما بدون تغییر هر تراکنش مفید است. ضریب 1.2 همه رواداری‌های استنباطی را 20٪ افزایش می‌دهد.

    option "inferred_tolerance_multiplier" "1.2"
  3. استنباط مبتنی بر هزینه در حالی که هزینه‌ها به طور معمول برای استنباط رواداری نادیده گرفته می‌شوند، می‌توانید به Beancount دستور دهید که از آنها استفاده کند. این زمانی مفید است که مبلغ نهایی (به عنوان مثال، برداشت نقدی) دقیق‌ترین عدد در یک تراکنش باشد.

    option "infer_tolerance_from_cost" "TRUE"

ادعاهای تراز

ادعاهای تراز (balance) برای تأیید اینکه تراز حساب شما با مقدار شناخته شده در یک تاریخ خاص مطابقت دارد، استفاده می‌شوند. آنها همچنین دارای یک رواداری مرتبط هستند.

فرمت پایه

مشابه تراکنش‌ها، رواداری برای یک ادعای balance از تعداد ارقام اعشار در مبلغ استنباط می‌شود.

; ادعا می‌کند که تراز 4.271 RGAGX با رواداری ±0.0005 است
2015-05-08 balance Assets:Fund 4.271 RGAGX

; ادعا می‌کند که تراز 4.27 RGAGX با رواداری ±0.005 است
2015-05-08 balance Assets:Fund 4.27 RGAGX

تراز محاسبه شده باید در این محدوده قرار گیرد. برای مثال دوم، هر تراز بین 4.2654.265 و 4.2754.275 از بررسی عبور می‌کند.

رواداری‌های صریح

اگر رواداری استنباطی مناسب نیست، می‌توانید با استفاده از کاراکتر مد (~) یک رواداری را به صراحت مشخص کنید.

; ادعا می‌کند که تراز 4.271 RGAGX با رواداری سفارشی ±0.01 RGAGX است
2015-05-08 balance Assets:Fund 4.271 ~ 0.01 RGAGX

در اینجا، ادعا در صورتی موفقیت آمیز خواهد بود که تراز محاسبه شده بین 4.2614.261 و 4.2814.281 RGAGX باشد.

مدیریت گرد کردن

برای مواردی که پسماندهای کوچک ناشی از محاسبات مورد انتظار و قابل قبول هستند، Beancount ابزارهایی را برای مدیریت سیستماتیک آنها فراهم می‌کند.

پیگیری خطای گرد کردن

می‌توانید یک حساب ویژه را برای جمع آوری خودکار خطاهای گرد کردن تعیین کنید. این کار تراکنش‌های شما را با انتقال مبالغ بسیار کم باقی مانده به یک مکان، کاملاً متوازن نگه می‌دارد.

ابتدا گزینه را فعال کرده و حساب را باز کنید:

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

اکنون، Beancount به طور خودکار یک مرحله سوم را به هر تراکنشی که در رواداری خود متوازن نباشد، اضافه می‌کند و تفاوت را به Equity:RoundingError منتقل می‌کند.

2013-02-23 * "خرید"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD

در این تراکنش، 1.245times43.23=53.821351.245 \\times 43.23 = 53.82135. این تراکنش به میزان 0.00135-0.00135 USD نامتوازن است. با فعال بودن گزینه گرد کردن، Beancount به طور داخلی آن را به صورت زیر در نظر می‌گیرد:

2013-02-23 * "خرید"
Assets:Invest 1.245 RGAGX {43.23 USD}
Assets:Cash -53.82 USD
Equity:RoundingError -0.00135 USD ; به طور خودکار اضافه شد

دقت عدد استنباطی

Beancount همچنین می‌تواند از تنظیمات رواداری برای گرد کردن خودکار اعداد قبل از اینکه حتی در ساختارهای داده دفتر ثبت شوند، استفاده کند.

  1. هیچ رواداری مشخص نشده است: اگر هیچ رواداری تعریف نشده باشد، اعداد با دقت کامل خود استفاده می‌شوند. هیچ گرد کردنی رخ نمی‌دهد.

  2. با رواداری پیش فرض: اگر یک رواداری پیش فرض را تنظیم کنید، اعداد به آن سطح کوانتیزه می‌شوند.

    option "default_tolerance" "USD:0.001"

    با این تنظیم، عددی مانند 53.82135 USD گرد شده و به عنوان 53.821 USD ذخیره می‌شود.

  3. با حساب گرد کردن: اگر هم رواداری پیش فرض و هم حساب گرد کردن فعال باشند، Beancount عدد را کوانتیزه می‌کند و پسماند را ضبط می‌کند.

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

    عددی مانند 53.82135 USD به عنوان 53.82 USD ذخیره می‌شود و پسماند -0.00135 USD به Equity:RoundingError منتقل می‌شود.

جزئیات پیاده سازی

چند نکته فنی روشن می‌کند که Beancount چگونه به این قابلیت اطمینان دست می‌یابد.

  1. نمایش عدد: Beancount از ماژول decimal پایتون استفاده می‌کند، نه اعداد ممیز شناور. این امکان تا 28 رقم اعشار دقت را فراهم می‌کند و از خطاهای نمایش باینری رایج در ممیز شناور جلوگیری می‌کند.

  2. کلاس DisplayContext: این کلاس داخلی تمام قالب بندی اعداد را برای اهداف نمایش انجام می‌دهد. این تنظیمات دقت خاص ارز را رعایت می‌کند و می‌تواند خروجی را با ستون‌ها و کاماهای تراز شده قالب بندی کند.

  3. دقت در مقابل رواداری: تشخیص این دو مفهوم بسیار مهم است:

  • دقت مربوط به فرمت نمایش یک عدد است (چند رقم اعشار نشان داده می‌شود).
  • رواداری اجازه برای عدم تعادل است که در طول بررسی‌های تأیید استفاده می‌شود.

بهترین شیوه‌ها ✨

در اینجا چند توصیه عملی برای مدیریت دقت در دفتر کل شما وجود دارد.

تنظیم اولیه

برای اکثر دفاتر کل جدید، این یک پیکربندی شروع قوی است:

; یک پیش فرض معقول برای اکثر ارزها (به عنوان مثال، USD، EUR)
option "inferred_tolerance_default" "*:0.005"

; یک بافر 10٪ در تمام رواداری‌های استنباطی
option "inferred_tolerance_multiplier" "1.1"

; یک حساب برای گرفتن تمام ذرات گرد کردن
option "account_rounding" "Equity:RoundingError"
2000-01-01 open Equity:RoundingError

نکات عیب یابی

اگر با خطاهای تراز مواجه شدید:

  • ارقام اعشار را اضافه کنید به مبلغ یک سند حسابداری برای ایجاد یک استنباط رواداری محلی دقیق‌تر و دقیق‌تر.
  • از رواداری‌های صریح (~) در ادعاهای balance که به دلیل اختلافات قابل پیش بینی با شکست مواجه می‌شوند، استفاده کنید.
  • خطاهای گرد کردن را در یک حساب اختصاصی پیگیری کنید تا ببینید کجا و چند وقت یکبار رخ می‌دهند.
  • در صورت برخورد مکرر با ارزهایی که دارای کنوانسیون‌های مختلف هستند (به عنوان مثال، JPY اعشاری ندارد)، تنظیم پیش فرض‌های خاص ارز را در نظر بگیرید.

استراتژی مهاجرت

هنگام اعمال این مفاهیم بر روی یک دفتر کل موجود و درهم و برهم:

  1. با یک رواداری جهانی سخاوتمندانه (به عنوان مثال، *:0.05) و یک ضریب بالا شروع کنید تا فایل اعتبارسنجی شود.
  2. به تدریج رواداری‌ها را سخت‌تر کنید و خطاهایی را که ظاهر می‌شوند برطرف کنید.
  3. ارقام صریح را اضافه کنید به مقادیر در تراکنش‌های مشکل‌دار تا استنباط کار خود را انجام دهد.
  4. تراز حساب گرد کردن را کنترل کنید. یک تراز بزرگ یا به سرعت در حال رشد ممکن است نشان دهنده یک مشکل سیستمی باشد که نیاز به بررسی دارد.