Створювані за допомогою скриптів робочі процеси з Beancount і Fava
Beancount (інструмент обліку у форматі звичайного тексту з подвійним записом) і Fava (його веб-інтерфейс) є дуже розширюваними та створюваними за допомогою скриптів. Їхній дизайн дозволяє автоматизувати фінансові завдання, генерувати власні звіти та налаштовувати сповіщення за допомогою скриптів Python. За словами одного користувача: "Мені дуже подобається, що мої дані в такому зручному форматі, і мені подобається, що я можу автоматизувати все, що завгодно. Немає API, як файл на вашому диску; його легко інтегрувати." Цей посібник проведе вас через створення робочих процесів, які можна створювати за допомогою скриптів — від простої автоматизації для початківців до розширених плагінів Fava.
Початок роботи: Запуск Beancount як скрипту Python
Перш ніж занурюватися в конкретні завдання, переконайтеся, що Beancount встановлено (наприклад, через pip install beancount). Оскільки Beancount написаний на Python, ви можете використовувати його як бібліотеку у власних скриптах. Загальний підхід такий:
-
Завантажте свою бухгалтерську книгу Beancount: використовуйте завантажувач Beancount, щоб проаналізувати файл
.beancountв об’єкти Python. Наприклад:from beancount import loader
entries, errors, options_map = loader.load_file("myledger.beancount")
if errors:
print("Errors:", errors)Це дає вам список
entries(транзакції, залишки тощо) іoptions_mapз метаданими. Усі ваші рахунки, транзакції та залишки тепер доступні в коді. -
Використовуйте мову запитів Beancount (BQL): замість ручної ітерації ви можете запускати SQL-подібні запити до даних. Наприклад, щоб отримати загальні витрати за місяць, ви можете скористатися API запитів:
from beancount.query import query
q = query.Query(entries, options_map)
result = q.query("SELECT month, sum(position) WHERE account ~ 'Expenses' GROUP BY month")
print(result)Це використовує систему запитів Beancount для агрегування даних. (По суті, це схоже на те, що робить команда
bean-query, але тут ви використовуєте її у скрипті.) Фактично, автор Beancount зазначає, що ви можете завантажити файл і викликатиrun_query()безпосередньо через API Python, уникаючи необхідності викликати зовнішні команди в циклі. -
Налаштуйте структуру проєкту: упорядкуйте свої скрипти разом із бухгалтерською книгою. Зазвичай розташовують каталоги для імпортерів (для отримання/аналізу зовнішніх даних), звітів або запитів (для скриптів аналізу) і документів (для зберігання завантажених виписок). Наприклад, один користувач зберігає:
importers/– власні скрипти імпорту Python (з тестами),queries/– скрипти для створення звітів (запускаються за допомогоюpython3 queries/...),documents/– завантажені банківські CSV/PDF-файли, упорядковані за рахунком.
За допомогою цієї установки ви можете запускати скрипти вручну (наприклад, python3 queries/cash_flow.py) або запланувати їх (за допомогою cron або засобу запуску завдань) для автоматизації робочого процесу.
Автоматизація завдань звірки
Звірка означає перевірку відповідності вашої бухгалтерської книги зовнішнім записам (банківським випискам, звітам за кредитними картками тощо). Бухгалтерська книга у форматі звичайного тексту Beancount і API Python дозволяють автоматизувати значну частину цього процесу.
Імпорт і зіставлення транзакцій (для початківців)
Для початківців рекомендованим підходом є використання плагінів імпорту Beancount. Ви пишете невеликий клас Python, дотримуючись протоколу імпорту Beancount, щоб проаналізувати заданий формат (CSV, OFX, PDF тощо) і створити транзакції. Потім використовуйте команду bean-extract або ск рипт, щоб застосувати ці імпортери:
- Напишіть імпортер (клас Python з такими методами, як
identify(),extract()) для формату CSV вашого банку. Документація Beancount містить посібник і приклади. - Використовуйте
bean-extractу скрипті або Makefile (як у прикладіjustfile) для аналізу нових виписок. Наприклад, один робочий процес запускаєbean-extractдля всіх файлів у~/Downloadsі виводить транзакції у тимчасовий файл. - Вручну перегляньте та скопіюйте транзакції з тимчасового файлу у свою основну бухгалтерську книгу, потім запустіть
bean-check, щоб переконатися, що залишки збігаються.
Хоча цей процес все ще включає етап перевірки, значна частина трудомісткої роботи з аналізу та форматування записів автоматизована. Скрипти імпорту можуть також автоматично призначати категорії та навіть встановлювати твердження щодо залишку (твердження очікуваних залишків) для виявлення розбіжностей. Наприклад, після імпорту ви можете мати рядок на кшталт 2025-04-30 balance Assets:Bank:Checking 1234.56 USD, який підтверджує кінцевий залишок. Коли ви запускаєте bean-check, Beancount перевірить, чи всі ці твердження щодо залишку правильні, і позначить будь-які помилки, якщо транзакції відсутні або дублюються. Це найкраща практика: автоматично генеруйте твердження щодо залишку для кожного звітного періоду, щоб комп’ютер міг виявляти не узгоджені відмінності за вас.
Спеціальні скрипти звірки (середній рівень)
Для більшого контролю ви можете написати власний скрипт Python для порівняння списку транзакцій банку (CSV або через API) із записами вашої бухгалтерської книги:
- Прочитайте зовнішні дані: проаналізуйте CSV-файл банку за допомогою модуля
csvPython (або Pandas). Нормалізуйте дані в список транзакцій, наприклад, кожна з датою, сумою та описом. - Завантажте транзакції бухгалтерської книги: використовуйте
loader.load_file, як показано раніше, щоб отримати всі записи бухгалтерської книги. Відфіль труйте цей список до потрібного рахунку (наприклад, ваш поточний рахунок) і, можливо, діапазону дат виписки. - Порівняйте та знайдіть невідповідності:
- Для кожної зовнішньої транзакції перевірте, чи існує ідентичний запис у бухгалтерській книзі (зіставте за датою та сумою, можливо, описом). Якщо не знайдено, позначте його як "новий" і, можливо, виведіть як транзакцію у форматі Beancount для перегляду.
- І навпаки, визначте будь-які записи бухгалтерської книги на цьому рахунку, які не відображаються у зовнішньому джерелі – це можуть бути помилки введення даних або транзакції, які не були проведені банком.
- Виведіть результати: надрукуйте звіт або створіть новий фрагмент
.beancountз відсутніми транзакціями.
Як приклад, скрипт спільноти під назвою reconcile.py робить саме це: враховуючи файл Beancount і вхідний CSV-файл, він друкує список нових транзакцій, які слід імпортувати, а також будь-які наявні записи бухгалтерської книги, яких немає у вхідних даних (потенційно ознака неправильної класифікації). За допомогою такого скрипту щомісячна звірка може бути такою ж простою, як його запуск, а потім додавання запропонованих транзакцій до вашої бухгалтерської книги. Один користувач Beancount зазначає, що вони "проводять процес звірки для всіх рахунків щомісяця" і використовують зростаючу колекцію коду Python для усунення значної частини ручної роботи з імпорту та звірки даних.
Порада: Під час звірки використовуйте інструменти Beancount для точності:
- Використовуйте твердження щодо залишку, як згадано вище, щоб автоматично перевіряти залишки на рахунках.
- Використовуйте директиву
pad, якщо потрібно, яка може автоматично вставляти збалансувальні записи для незначних розбіжностей заокруглення (використовуйте з обережністю). - Напишіть модульні тести для своєї логіки імпорту або звірки (Beancount надає допоміжні функції тестування). Наприклад, один робочий процес включав взяття зразка CSV-файлу, написання невдалих тестів з очікуваними транзакціями, а потім реалізацію імпортера, доки всі тести не будуть успішно пройдені. Це гарантує, що ваш скрипт імпорту працює правильно для різних випадкі в.
Створення спеціальних звітів і підсумків
Хоча Fava надає багато стандартних звітів (Звіт про прибутки та збитки, Баланс тощо), ви можете створювати спеціальні звіти за допомогою скриптів. Вони можуть варіюватися від простих вихідних даних консолі до файлів із форматуванням або діаграм.
Запит даних для звітів (для початківців)
На базовому рівні ви можете використовувати мову запитів Beancount (BQL), щоб отримувати зведені дані та друкувати або зберігати їх. Наприклад:
-
Підсумок руху грошових коштів: Використовуйте запит для обчислення чистого руху грошових коштів. "Рух грошових коштів" можна визначити як зміну залишку певних рахунків за певний період. Використовуючи BQL, ви можете зробити так:
SELECT year, month, sum(amount)
WHERE account LIKE 'Income:%' OR account LIKE 'Expenses:%'
GROUP BY year, monthЦе об’єднає всі записи доходів і витрат за місяць. Ви можете запустити це через CLI
bean-queryабо через API Python (query.Query, як показано раніше), а потім відформатувати результат. -
Звіт про витрати за категоріями: Запитайте загальні витрати за категоріями:
SELECT account, round(sum(position), 2)
WHERE account ~ 'Expenses'
GROUP BY account
ORDER BY sum(position) ASCЦе дає таблицю витрат за категоріями. Ви можете запустити кілька запитів у скрипті та вивести результати у вигляді тексту, CSV або навіть JSON для подальшої обробки.
Один користувач вважав "тривіальним" аналізувати фінансові дані за допомогою Fava або скриптів, посилаючись на те, що вони використовують один скрипт Python для отримання даних із Beancount за допомогою мови запитів, а потім поміщають їх у DataFrame Pandas для підготовки спеціального звіту. Наприклад, ви можете отримати щомісячні підсумки за допомогою запиту, а потім використати Pandas/Matplotlib для побудови графіка руху грошових коштів з часом. Комбінація BQL і бібліотек науки про дані дозволяє створювати звіти, які виходять за рамки того, що Fava пропонує за замовчуванням.
Розширене звітування (діаграми, ефективність тощо)
Для більш розширених потреб ваші скрипти можуть обчислювати показники, як-от ефективність інвестицій, або створювати візуальні вихідні дані:
-
Ефективність інвестицій (IRR/XIRR): оскільки ваша бухгалтерська книга містить усі грошові потоки (купівлі, продажі, дивіденди), ви можете обчислити ставки прибутковості портфеля. Наприклад, ви можете написати скрипт, який фільтрує транзакції ваших інвестиційних рахунків, а потім обчислює внутрішню норму прибутковості. Існують бібліотеки (або формули) для обчислення IRR на основі даних про грошові потоки. Деякі розроблені спільнотою розширення Fava (як-от PortfolioSummary або fava_investor) роблять саме це, обчислюючи IRR та інші показники для інвестиційних портфелів. Як скрипт, ви можете використовувати функцію IRR (з NumPy або власної), у серії внесків/зняття коштів плюс кінцеве значення.
-
Багатоперіодні або власні показники: потрібен звіт про вашу норму заощаджень (відношення заощаджень до доходу) щомісяця? Скрипт Python може завантажити бухгалтерську книгу, підсумувати всі рахунки доходів і всі рахунки витрат, потім обчислити заощадження = дохід - витрати та відсоток. Це може вивести гарну таблицю або навіть створити звіт HTML/Markdown для ваших записів.
-
Візуалізація: ви можете створювати діаграми за межами Fava. Наприклад, використовуйте
matplotlibабоaltairу скрипті, щоб створити діаграму чистої вартості з часом, використовуючи дані бухгалтерської книги. Оскільки бухгалтерська книга містить усі історичні залишки (або ви можете накопичувати їх, повторюючи записи), ви можете створювати графіки часових рядів. Збережіть ці діаграми як зображення або інтерактивний HTML. (Якщо ви віддаєте перевагу візуальним елементам у програмі, див. розділ розширення Fava нижче, щоб додати діаграми всередині Fava.)
Параметри виведення: Вирішіть, як надати звіт:
- Для одноразового аналізу може бути достатньо друку на екрані або збереження у файл CSV/Excel.
- Для інформаційних панелей розгляньте можливість створення HTML-файлу з даними (можливо, за допомогою бібліотеки шаблонів, як-от Jinja2, або навіть просто написання Markdown), який можна відкрити у браузері.
- Ви також можете інтегруватися з Jupyter Notebooks для інтерактивного середовища звітування, хоча це більше для дослідження, ніж для автоматизації.