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

پیش‌بینی تراکنش‌های آینده

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

تراکنش‌های دارای تاریخ آینده را در یک دفترکل سناریوی مستقل قرار دهید تا وجه نقد، هزینه‌ها و بدهی را در گزارش‌های مالی خود پیش‌بینی کنید. این راهنما از ثبت‌های معمولی Beancount و یک دورهٔ برنامه‌ریزی ثابت استفاده می‌کند. دفاتر مربوط به عملکرد واقعی شما از فرض‌های برنامه‌ریزی جدا می‌مانند.

سازگاری، بررسی‌شده در 7 سپتامبر 2026: مثال‌ها با نسخه‌های استاندارد Beancount 3.2.3، beanquery 0.2.0 و Fava 1.30.16 آزمایش شده‌اند. این نسخهٔ Fava افزونهٔ پیش‌بینی ندارد. کد سفارشی Beancount.io پیاده‌سازی fava.plugins.forecast را در بر دارد؛ اما محیط اجرای آن متفاوت است و وجود کد منبع، نسخهٔ مستقر برای حساب شما را مشخص نمی‌کند. روش قابل‌انتقال زیر به هیچ افزونه‌ای نیاز ندارد.

مرحلهٔ 1: فعال‌سازی افزونهٔ پیش‌بینی

برای این روش، مرحلهٔ فعال‌سازی افزونه را انجام ندهید. افزودن plugin "fava.plugins.forecast" به نصب استاندارد آزمایش‌شده، خطای واردکردن ماژول ایجاد می‌کند. برای اطلاعات عمومی نصب و تنظیم افزونه‌ها، راهنمای افزونه‌ها را ببینید؛ پیش از آنکه دفترکل بتواند یک ماژول را بارگذاری کند، آن ماژول باید واقعاً نصب شده باشد.

پیش‌نیازها: یک محیط محلی Python که beancount==3.2.3، beanquery==0.2.0 و fava==1.30.16 در آن نصب شده باشند. برای ایجاد این محیط، راهنمای راه‌اندازی Fava با نسخه‌های مشخص را دنبال کنید. هر سه فایل زیر را در یک پوشه ذخیره کنید و فرمان‌ها را در همان پوشه اجرا کنید.

فایل books.beancount را با نمونهٔ کامل زیر از وضعیت حساب‌ها ایجاد کنید. تاریخ مبنای آن 31 دسامبر 2023، پس از تراکنش افتتاحیه است. حساب جاری 10,000.00 USD موجودی دارد و ماندهٔ اصل وام خودرو 14,400.00 USD است. حساب حقوق مالکانه، این وضعیت افتتاحیهٔ ساده‌شده را تراز می‌کند.

; books.beancount — realized balances as of 2023-12-31
option "operating_currency" "USD"
2023-12-31 open Assets:Checking USD
2023-12-31 open Liabilities:Auto-Loan USD
2023-12-31 open Equity:Opening-Balances USD
2023-12-31 open Income:Salary USD
2023-12-31 open Expenses:Housing:Rent USD
2023-12-31 open Expenses:Food:Groceries USD
2023-12-31 open Expenses:Health:Gym USD
2023-12-31 open Expenses:Insurance:Auto USD
2023-12-31 open Expenses:Transportation:Interest USD
 
2023-12-31 * "Opening snapshot"
  Assets:Checking                  10000.00 USD
  Liabilities:Auto-Loan            -14400.00 USD
  Equity:Opening-Balances           4400.00 USD

فایل scenario.beancount را به‌عنوان فایل ورودی برنامه‌ریزی ایجاد کنید. دو دستور شامل‌کردن فایل در آن، وضعیت واقعی حساب‌ها و فرض‌هایی را که در ادامه می‌نویسید بارگذاری می‌کنند. Beancount مسیر فایل‌های شامل‌شده را نسبت به این فایل تفسیر می‌کند.

; scenario.beancount — planning entry point
option "title" "January 2024 planning scenario"
option "operating_currency" "USD"
include "books.beancount"
include "scenario-2024-01.beancount"

هرگز scenario.beancount یا scenario-2024-01.beancount را از داخل books.beancount شامل نکنید. فایل ورودی دفاتر واقعی نباید تراکنش‌های برنامه‌ریزی‌شده را بارگذاری کند، حتی پس از آنکه تاریخ آن‌ها گذشته باشد.

مرحلهٔ 2: ایجاد یک تراکنش پیش‌بینی

فایل scenario-2024-01.beancount را با نخستین ثبت زیر ایجاد کنید. چهار بلوک سناریوی بعدی را نیز هرکدام فقط یک‌بار به همان فایل اضافه کنید. این بلوک‌های تراکنش به زمینهٔ دفترکل وابسته‌اند: تعریف حساب‌های آن‌ها از books.beancount می‌آید و آن‌ها را از طریق scenario.beancount اعتبارسنجی می‌کنید.

2024-01-01 ! "Scenario: January rent" #forecast
  Expenses:Housing:Rent              2500.00 USD
  Assets:Checking                  -2500.00 USD

پرچم ! تراکنش را برای بازبینی علامت‌گذاری می‌کند؛ #forecast یک برچسب معمولی تراکنش است. هیچ‌کدام باعث تکرار تراکنش یا حذف آن از گزارش‌ها نمی‌شوند. فایل ورودی مستقل تعیین می‌کند چه ثبت‌هایی در گزارش‌ها گنجانده شوند. این برچسب را فقط برای ثبت‌های برنامه‌ریزی‌شده به کار ببرید تا هنگام بازبینی بتوانید آن‌ها را شناسایی کنید.

آشنایی با نحو پیش‌بینی

هر ثبت تاریخ‌دار نشان‌دهندهٔ یک نوبت وقوع است. متن شرحی مانند [MONTHLY] در نسخهٔ استاندارد Beancount باعث تکرار نمی‌شود. دستورهای قدیمی UNTIL، REPEAT و SKIP به قرارداد یک افزونهٔ سفارشی تعلق دارند، نه به زبان اصلی. این روش، تاریخ‌های موردنظر را به‌صراحت ثبت می‌کند.

سناریو روزهای 1–31 ژانویهٔ 2024 را با احتساب هر دو روز ابتدا و انتها پوشش می‌دهد. تمام تاریخ‌های برنامه‌ریزی‌شده پس از تاریخ مبنای ثابت و پیش از 1 فوریه هستند. استفاده از این تاریخ‌های گذشته، مثال را بازتولیدپذیر می‌کند؛ هیچ چیز به تاریخ امروز وابسته نیست. هنگام تطبیق مثال با شرایط خود، پیش از افزودن ثبت‌ها یک تاریخ مبنای جدید و افق زمانی محدود انتخاب کنید.

تناوب

برای هر سررسید در دورهٔ برنامه‌ریزی، یک تراکنش بنویسید. مثال کامل ژانویه از قواعد زیر پیروی می‌کند:

موردبرنامهٔ زمانیتاریخ‌های گنجانده‌شده در ژانویهٔ 2024
اجارهماهانه، در روز 11 ژانویه
خواربارهر 7 روز، از 1 ژانویهروزهای 1، 8، 15، 22، 29 ژانویه
حقوقهر 14 روز، از 5 ژانویهروزهای 5، 19 ژانویه
باشگاهماهانه، در روز 1515 ژانویه
قسط وامماهانه، در روز 2525 ژانویه
بیمهٔ خودروهر 3 ماه تقویمی، از 15 ژانویه15 ژانویه؛ پرداخت بعدی در 15 آوریل خارج از این افق زمانی است

برای سایر برنامه‌های روزانه یا سالانه نیز سررسیدهای واقعی را به همین شکل فهرست کنید. پیش از گسترش برنامه، نحوهٔ برخورد با تاریخ‌هایی مانند روز 31 ماه یا 29 فوریه را مشخص کنید. آن‌ها را بدون تصمیم صریح جابه‌جا نکنید و فرض نکنید تعداد روزهای همهٔ ماه‌ها یکسان است.

شرایط اختیاری

1. تاریخ پایان را به‌صراحت تعیین کنید

فرض کنید عضویت باشگاه در 31 دسامبر 2024 پایان می‌یابد. نوبت پرداخت ژانویهٔ آن در زیر آمده است. سناریوی ژانویه در 31 ژانویه متوقف می‌شود؛ بنابراین هیچ ثبتی برای فوریه تا دسامبر ندارد. اگر افق زمانی را گسترش دادید، هر پرداخت بعدی را تا 15 دسامبر بنویسید و در همان‌جا متوقف شوید.

2024-01-15 ! "Scenario: gym membership" #forecast
  Expenses:Health:Gym                  80.00 USD
  Assets:Checking                    -80.00 USD

2. تعداد نوبت‌ها را محدود کنید و اصل وام را از بهره جدا نگه دارید

فرض کنید 36 قسط از وام خودرو باقی مانده است. فقط نخستین پرداخت را در این افق زمانی ژانویه بگنجانید. برای این قسط فرضی، فرض کنید پرداخت نقدی 450.00 USD شامل 400.00 USD اصل وام و 50.00 USD بهره است. این ارقام فرض‌های سناریو هستند؛ هیچ قسط بعدی تولید نمی‌شود.

2024-01-25 ! "Scenario: car loan payment 1 of 36" #forecast
  Liabilities:Auto-Loan               400.00 USD
  Expenses:Transportation:Interest     50.00 USD
  Assets:Checking                   -450.00 USD

ثبت مثبت در حساب بدهی، ماندهٔ بدهی را از −14,400.00 USD به −14,000.00 USD کاهش می‌دهد. وجه نقد 450.00 USD کم می‌شود و فقط 50.00 USD هزینه محسوب می‌شود. ثبت‌ها تراز هستند، زیرا 400.00 + 50.00 - 450.00 = 0. ثبت منفی در حساب بدهی، بدهی را افزایش می‌دهد.

بدون یک جدول بازپرداخت معتبر، همین تفکیک اصل و بهره را برای هر 36 قسط تکرار نکنید. بهرهٔ اقساط آینده و مبلغ پرداخت نهایی ممکن است متفاوت باشند. هنگام گسترش این مثال از جدول بازپرداخت وام‌دهنده استفاده کنید؛ برای تفاوت میان شناسایی هزینه و بازپرداخت بدهی، استهلاک را ببینید.

3. فاصله‌های نامنظم را با تاریخ‌های واقعی ثبت کنید

برای حقوقی که هر دو هفته یک‌بار از 5 ژانویه پرداخت می‌شود، تاریخ‌های ژانویه برابر با 5 ژانویه و 19 ژانویه هستند. نوبت بعدی 2 فوریه است که خارج از این سناریو قرار دارد. هر دو هفته یک‌بار یعنی هر 14 روز، نه دو بار در هر ماه تقویمی.

2024-01-05 ! "Scenario: salary" #forecast
  Assets:Checking                   3000.00 USD
  Income:Salary                    -3000.00 USD
 
2024-01-19 ! "Scenario: salary" #forecast
  Assets:Checking                   3000.00 USD
  Income:Salary                    -3000.00 USD

مثال عملی: بودجهٔ ماهانه

با افزودن ثبت‌های خواربار و بیمهٔ خودرو در زیر به scenario-2024-01.beancount، بودجهٔ ماهانهٔ خود را کامل کنید. این ثبت‌ها همراه با اجاره، باشگاه، قسط وام و هر دو ثبت حقوق در بالا، 11 تراکنش برنامه‌ریزی‌شده ایجاد می‌کنند.

2024-01-01 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-08 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-15 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-22 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-29 ! "Scenario: groceries" #forecast
  Expenses:Food:Groceries             150.00 USD
  Assets:Checking                   -150.00 USD
 
2024-01-15 ! "Scenario: quarterly car insurance" #forecast
  Expenses:Insurance:Auto             450.00 USD
  Assets:Checking                   -450.00 USD

هر دو فایل ورودی را اعتبارسنجی کنید و سپس مانده‌های پایانی آن‌ها را با پرس‌وجو بررسی کنید. شرط date < 2024-02-01 تمام ثبت‌های ژانویه را در بر می‌گیرد. پرس‌وجوی دفاتر واقعی از مرز تاریخ مبنای ثابت date < 2024-01-01 استفاده می‌کند.

bea --file books.beancount check
bea --file scenario.beancount check
bea --file books.beancount query "SELECT account, sum(position) WHERE date < 2024-01-01 GROUP BY account ORDER BY account"
bea --file scenario.beancount query "SELECT account, sum(position) WHERE date < 2024-02-01 GROUP BY account ORDER BY account"

هر دو فرمان bea check باید با موفقیت پایان یابند. نتایج پرس‌وجو را با محاسبات مستقل زیر تطبیق دهید:

نتیجهدفاتر واقعی، 31 دسامبرسناریوی ژانویه، 31 ژانویه
حساب جاری10,000.00 USD10,000 + 6,000 − 2,500 − 750 − 80 − 450 − 450 = 11,770.00 USD
ماندهٔ وام−14,400.00 USD−14,400 + 400 = −14,000.00 USD
ثبت درآمد حقوق0.00 USD−6,000.00 USD
مجموع ثبت‌های هزینه0.00 USD2,500 + 750 + 80 + 450 + 50 = 3,830.00 USD

سود پیش‌بینی‌شدهٔ ژانویه 2,170.00 USD است: 6,000 درآمد منهای 3,830 هزینه. موجودی حساب جاری 1,770.00 USD افزایش می‌یابد، زیرا بازپرداخت 400 بابت اصل وام، بدهی را کاهش می‌دهد و از سود کم نمی‌کند.

سناریو را در نسخهٔ استاندارد Fava باز کنید:

fava scenario.beancount

فیلتر زمان Fava را روی 2024-01 تنظیم کنید. فیلتر زمانی آن مانده‌های قبلی دارایی و بدهی را به دوره منتقل می‌کند و ثبت‌های بعدی را کنار می‌گذارد. در ترازنامه، 11,770.00 USD وجه نقد و 14,000.00 USD بدهی باقیمانده را بررسی کنید. صورت سود و زیان باید 2,170.00 USD سود پیش‌بینی‌شده نشان دهد. اگر به‌جای آن books.beancount را باز کنید، وضعیت واقعی حساب‌ها را می‌بینید.

عیب‌یابی و روش‌های پیشنهادی

  • خطای واردکردن افزونهٔ قدیمی: هنگام استفاده از این روش قابل‌انتقال، خط فعال‌سازی را حذف کنید. نصب استاندارد Fava ماژول‌های سفارشی Beancount.io را در اختیار نمی‌گذارد.
  • حساب ناشناخته یا نبودن فایل شامل‌شده: هر سه فایل را در یک پوشه ذخیره کنید، تعریف‌های افتتاح حساب را کپی کنید و به‌جای قطعهٔ سناریو به‌تنهایی، scenario.beancount را اعتبارسنجی کنید.
  • دیده‌نشدن پیش‌بینی‌ها در Fava: فایل scenario.beancount را بارگذاری کنید و فیلتر زمان را روی 2024-01 بگذارید. برچسب یا شرح تراکنش، ثبت جدیدی تولید نمی‌کند.
  • مانده‌های غیرمنتظره: 11 تاریخ و مبلغ برنامه‌ریزی‌شده را با جدول مقایسه کنید. بارگذاری دوبارهٔ یک نوبت، اثر مالی آن را دو برابر می‌کند، حتی اگر تک‌تک تراکنش‌ها تراز باشند.
  • پیش‌بینی‌ها را جدا نگه دارید: پرچم‌ها، برچسب‌ها و تاریخ‌های آیندهٔ معمولی مانع اثرگذاری ثبت‌ها بر گزارش بدون فیلتر نمی‌شوند. برای نتایج واقعی از books.beancount استفاده کنید. وقتی پرداخت انجام شد، مبلغ واقعی آن را در این فایل ثبت کنید و فرض متناظر را از سناریوی بعدی خود حذف کنید تا دوباره شمرده نشود.
  • افق زمانی را بازبینی کنید: هنگام ذخیرهٔ سناریو، یک نسخهٔ تاریخ‌دار از وضعیت حساب‌ها را نگه دارید. گسترش تاریخ پایان یعنی افزودن نوبت‌های مشخص و بررسی دوبارهٔ تفکیک اصل و بهره، تاریخ‌های لغو و گردکردن مبالغ.

منبع: https://beancount.io/fa/docs/Tips/forecast-plugin