Перейти к основному содержимому

Прогнозирование будущих транзакций

Создайте отдельный, проверенный сценарный реестр 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 как точку входа для планирования. Его два include загружают фактический снимок и допущения, которые вы напишете далее. Beancount читает пути include относительно этого файла.

; 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 г.
АрендаЕжемесячно, 1-го числа1 января
ПродуктыКаждые 7 дней, начиная с 1 января1, 8, 15, 22, 29 января
ЗарплатаКаждые 14 дней, начиная с 5 января5, 19 января
СпортзалЕжемесячно, 15-го числа15 января
Платеж по кредитуЕжемесячно, 25-го числа25 января
АвтостраховкаКаждые 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.
  • Неизвестный счет или отсутствующий файл include: сохраните все три файла в одной директории, скопируйте объявления счетов и проверяйте scenario.beancount, а не только фрагмент сценария.
  • Прогнозы отсутствуют в Fava: загрузите scenario.beancount и установите фильтр времени на 2024-01. Тег или описание не создают записи.
  • Неожиданные остатки: сравните 11 запланированных дат и сумм с таблицей. Загрузка вхождения дважды удваивает его финансовый эффект, даже если каждая транзакция сбалансирована.
  • Держите прогнозы отдельно: обычные флаги, теги и будущие даты не предотвращают влияние записей на нефильтрованный отчет. Используйте books.beancount для фактических результатов. Когда платеж происходит, записывайте его фактическую сумму там и удаляйте соответствующее допущение из вашего следующего сценария, чтобы не учитывать его дважды.
  • Пересматривайте горизонт: сохраняйте датированный снимок при сохранении сценария. Расширение его конечной даты означает добавление конкретных вхождений и повторную проверку разделения кредита, дат отмены и округления.

Источник: https://beancount.io/ru/docs/Tips/forecast-plugin