Фінансова аналітика в реальному часі за допомогою Fava та Beancount
Вступ
Beancount — це система бухгалтерського обліку з подвійним записом і відкритим вихідним кодом, яка використовує прості текстові файли як книгу обліку. Вона наголошує на простоті, прозорості та гнучкості у відстеженні фінансів. Fava — це потужний веб-інтерфейс для Beancount, який надає інтерактивне середовище для перегляду звітів, візуалізацій та керування вашою книгою обліку. У цьому звіті ми розглянемо основні можливості Beancount та Fava, а також способи досягнення фінансової аналітики в реальному або близькому до реального часі за допомогою цих інструментів. Ми охопимо поради щодо налаштування автоматизації та оновлення даних, функції візуалізації Fava (для миттєвого перегляду грошових потоків і виявлення трендів), інтеграцію із зовнішніми дашбордами (Grafana, Metabase тощо), приклади кастомних панелей керування та плагінів, сценарії використання в особистих фінансах та малому бізнесі, порівняння з іншими платформами (Power BI, QuickBooks), а також переваги та недоліки використання Fava + Beancount для отримання інсайтів на основі даних.
Основні можливості Beancount та Fava
Beancount (Движок текстового обліку)
- Книга обліку з подвійним записом у простому тексті: Beancount зберігає транзакції в одному текстовому файлі
.beancount(або кількох об'єднаних файлах). Кожна транзакція повинна бути збалансованою (загальний дебет = загальному кредиту) між рахунками, що гарантує цілісність обліку. Формат простого тексту означає, що ваші дані зрозумілі людині, підтримують контроль версі й і не мають прив’язки до конкретного постачальника. - Гнучкі ієрархічні рахунки: Ви можете визначати будь-які рахунки (наприклад,
Assets:Bank:Checking,Expenses:Food:Coffee) в ієрархії. Beancount не диктує структуру вашого плану рахунків, тому він підходить для особистих фінансів, обліку малого бізнесу, інвестицій тощо — він «гнучкий: працює для особистих фінансів, бухгалтерії малого бізнесу, криптоактивів, інвестицій в акції та багато чого іншого». - Мультивалютність та активи: Beancount має першокласну підтримку декількох валют та активів (наприклад, акції, криптовалюти). Ви можете записувати транзакції в різних валютах, визначати обмінні курси (директиви цін) і відстежувати базу витрат. Система може створювати звіти «за собівартістю» або «за ринковою вартістю», якщо надано дані про ціни. Це робить її придатною для портфельного управління та міжнародних фінансів.
- Автоматизовані перевірки та баланси: Система підтримує підтвердження балансу (ви можете заявити, яким має бути баланс рахунку на певну дату, і Beancount видасть помилку, якщо він не збігається) та балансуючі транзакції для закриття книг. Вона також підтримує вступні / підсумкові записи капіталу та розрахунок нерозподіленого прибутку для закриття періодів. Це допомагає забезпечити узгодженість ваших книг і вчасно виявляти помилки.
- Потужний движок запитів та звітності: Beancount постачається з мовою запитів BQL (Beancount Query Language) та інструментами командного рядка, такими як
bean-balance,bean-registerтаbean-queryдля створення звітів. Ви можете робити запити до книги обліку для створення кастомних звітів (наприклад, список витрат за одержувачем, рух грошових коштів за період) — фактично працюючи з книгою як із базою даних. Система працює швидко навіть із тисячами транзакцій і може експортувати дані в CSV або безпосередньо в Excel / LibreOffice (за допомогою додаткових модулів). - Розширюваність через плагіни: Beancount написаний на Python і дозволяє використовувати власні плагіни для розширення функціональності. Плагіни можуть впроваджувати додаткові правила або розрахунки під час обробки файлу. (Наприклад, існують плагіни для обробки податкових лотів або для контролю наявності вартості у кожній покупці). Система плагінів і Python API дозволяють досвідченим користувачам створювати власні сценарії поведінки або інтегрувати Beancount з іншими системами.
- Імпортери для зовнішніх даних: Ключовою практичною особливістю є фреймворк ingest від Beancount для імпорту даних (наприклад, із банківських виписок). Ви можете писати або використовувати плагіни-імпортери, які аналізують CSV, OFX, PDF-виписки тощо та конвертують їх у записи Beancount. Це критично важливо для автоматизації.
- Зручність для аудиту та контролю версій: Оскільки це звичайний текст, ви можете зберігати свою книгу обліку в Git або інших системах контролю версій. Кожна зміна є прозорою, і ви маєте повну історію редагувань. Це робить аудит або перегляд змін простим (багато користувачів фіксують зміни щодня в Git-репозиторій, створюючи захищений від несанкціонованих змін лог усіх фінансових записів). Такий рівень прозорості є головною відмінністю від закритих бухгалтерських програм — «ніякої прив'язки до SaaS — лише чистий, прозорий облік із потужною звітністю».
Fava (Веб-інтерфейс для Beancount)
- Інтерактивний веб-інтерфейс: Fava надає локальний веб-сервер, який візуалізує вашу книгу Beancount у вигляді насиченого інтерфейсу. Він відображає основні звіти (Звіт про прибутки та збитки, Балансовий звіт тощо), реєстри рахунків та журнали в браузері з інтерактивними елементами керування. Інтерфейс є динамічним і зручним у порівнянні з командним рядком. Ви запускаєте його простою командою
fava yourfile.beancountі отримуєте веб-додаток для вашої бухгалтерії. - Вбудовані графіки та діаграми: Fava створює графіки для візуалізації ваших даних. Наприклад, вона включає лінійну діаграму чистої вартості (Net Worth) у часі, стовпчикові діаграми доходів проти витрат за місяцями, а також кругові діаграми та карти дерева (treemaps) для деталізації витрат. Ці візуальні елементи оновлюються разом із вашими даними та підтримують різні режими перегляд у (наприклад, «за собівартістю» проти «ринкової вартості» для інвестицій).
- Фільтрація та пошук: У верхній частині сторінок Fava є панель фільтрів, яка дозволяє сегментувати дані в реальному часі. Ви можете фільтрувати за часом (наприклад, рік, квартал, місяць), за регулярними виразами рахунків, за одержувачем, за описом або за тегами / посиланнями. Це полегшує інспекцію даних у реальному часі — наприклад, швидка фільтрація за «Tag=Travel» та «Year=2025» покаже всі витрати на подорожі у 2025 році з підсумковими сумами. Інтерфейс підтримує складні запити через цю панель або через сторінку запитів (Query), де ви можете безпосередньо виконувати BQL-запити.
- Підтримка декількох файлів та консолідація: Fava може завантажувати кілька файлів Beancount одночасно (корисно, якщо ви ведете окремі книги) і перемикатися між ними. Вона також може консолідувати їх за потреби (наприклад, спільний перегляд особистих і бізнес-рахунків).
- Введення та редагування даних: Унікальною особливістю Fava є те, що вона не призначена лише для читання — у неї є редактор та форма введення транз акцій. Ви можете додавати нові транзакції через веб-форму (вона вставить запис у ваш файл .beancount). Ви також можете відкрити вихідний файл у зовнішньому редакторі безпосередньо з Fava. Fava навіть підтримує клавіатурні скорочення у стилі Gmail (натисніть
?в інтерфейсі, щоб побачити їх) для досвідчених користувачів. Це перетворює Fava на легку бухгалтерську систему, де ви можете вводити та переглядати дані в одному інтерфейсі. - Звіти та деталізація рахунків: Fava надає стандартні бухгалтерські звіти: Звіт про прибутки та збитки (P&L), Балансовий звіт, Пробний баланс та список активів для інвестицій. Балансовий звіт та Звіт про прибутки та збитки є інтерактивними — ви можете натиснути на рахунок, щоб детально вивчити його транзакції, або перемикатися між переглядом за собівартістю чи ринковою вартістю. Fava також показує «нереалізований прибуток» для інвестицій за наявності цін. Вона генерує вигляд журналу всіх записів і дозволяє фільтрувати цей журнал за різними критеріями.
- Управління документами: Якщо ви додаєте квитанції або виписки, Fava допо магає їх організувати. Beancount має поняття папки документів, а Fava дозволяє перетягувати файли на рахунки або транзакції — вона збереже їх і додасть запис про документ у вашу книгу. Це корисно для зберігання підтверджуючих документів, пов'язаних із даними книги обліку.
- Кастомізація через розширення: Fava можна розширювати за допомогою плагінів (написаних на Python) для додавання нових звітів або функцій. Деякі розширення вже вбудовані (наприклад, звіт зі списком портфеля для інвестицій). Дизайн Fava дозволяє впроваджувати нові сторінки та навіть кастомний JavaScript через API розширень. Це означає, що якщо певний аналіз або дашборд не передбачений за замовчуванням, досвідчений користувач може його додати.
- Продуктивність: Fava працює ефективно — вона перезавантажує дані в пам'ять і швидко видає сторінки. Базовий парсинг Beancount досить швидкий (оптимізований на C++ в останніх версіях), тому навіть великі книги завантажуються за секунду або дві. На практиці Fava може обробляти особисті книги за багато років, хоча для надзвичайно великих файлів (десятки тисяч транзакцій) може знадобитися певна оптимізація (наприклад, архівування старих записів).
- Веб-доступ та мобільність: Запускаючи Fava на сервері або навіть на своєму ноутбуці, ви можете отримати доступ до своїх фінансів із будь-якого браузера. Деякі користувачі хостять Fava на приватному сервері або Raspberry Pi, щоб мати змогу перевіряти фінанси в дорозі (можливо, захистивши доступ паролем або VPN, оскільки Fava не має вбудованої автентифікації). Це фактично дає вам самохостинговий «веб-додаток» для ваших фінансів без передачі даних третім особам.
Підсумовуючи, Beancount забезпечує надійну основу для прозорого текстового обліку з суворими правилами подвійного запису та підтримкою мультивалютності. Fava доповнює це, пропонуючи доступний інтерфейс із миттєвими інсайтами (звіти, графіки) та можливістю взаємодії з вашими даними. Разом вони утворюють надзвичайно гнучку систему обліку та аналітики, яку ви контролюєте від початку до кінця.
Аналітика в реальному часі (або майже в реальному часі) з Beancount та Fava
Реалізація аналітики в реальному часі або майже в реальному часі з Beancount та Fava передбачає автоматизацію потоку даних у вашу головну книгу (ledger) та забезпечення відображення актуальної інформації інструментами. За замовчуванням Beancount працює як пакетний процес (ви додаєте записи у файл, а потім переглядаєте звіти), а Fava виявляє зміни та потребує оновлення. Однак за правильного налаштування ви можете оптимізувати оновлення так, щоб нові транзакції та зміни з'являлися майже миттєво.
Виявлення змін у файлах: Fava відстежує зміни у файлі головної книги. Якщо ви редагуєте файл .beancount (або включені файли) у редакторі, Fava покаже банер «Виявлено зміни — натисніть, щоб перезавантажити». Після натискання (або перезавантаження сторінки) вона завантажує дані та оновлює вигляд. На практиці це перезавантаження відбувається дуже швидко (зазвичай менше секунди для типових книг). Це означає, що Fava може слугувати живою панеллю приладів (dashboard), якщо ваш файл книги часто оновлюється. (У режимі налагодження Fava може навіть автоматично перезавантажуватися при зміні файлу, хоча за замовчуванням вона чекає підтвердження користувача, щоб не переривати перегляд).
Конвеєр безперервного імпорту/оновлення: Щоб отримувати дані в реальному часі, необхідно автоматизувати додавання транзакцій до файлу Beancount. Існує кілька поширених стратегій:
-
Заплановані завдання імпорту (Cron): Багато користувачів налаштовують завдання cron (або заплановане завдання) для періодичного отримання нових транзакцій з фінансових установ (наприклад, щоночі або щогодини) та додавання їх до книги. Наприклад, ви можете використовувати плагіни імпорту Beancount для отримання останніх банківських транзакцій через API або завантаження OFX. Один користувач Beancount створив такий конвеєр автоматизації, що його книги оновлюються самі: «бачити, як моя бухгалтерська книга оновлюється сама без мого втручання у відкритому форматі, приносить мені щиру радість». Це було досягнуто шляхом підключення до банківських API та планування регулярних оновлень. Такі інструменти, як
bean-fetch(для OFX) або власні скрипти на Python з використанням банківських API (наприклад, Plaid), можуть працювати за розкладом і записувати нові записи в книгу. Після кожного запланованого імпорту, якщо у вас запущена Fava, ви можете просто оновити її, щоб побачити нові дані. -
Відстежувачі файлів та тригери: Замість розкладів за часом ви можете використовувати відстежувачі файлів (file watchers) для реагування на події. Наприклад, якщо ваш банк може надсилати вам щоденну виписку електронною поштою або ви завантажуєте CSV у папку, скрипт може виявити цей файл (використовуючи
inotifyна Linux або аналогічні інструменти) і негайно запустити процедуру імпорту, а потім подати сигнал Fava для перезавантаження. Хоча Fava ще не підтримує примусове оновлення в браузері (push reload), дані принаймні будуть оновлені, тому при наступному перегляді сторінки або натисканні кнопки перезавантаження вони будуть актуальними. Деякі проекти спільноти йдуть далі: для ledger (спорідненого з Beancount проекту) один користувач створив невеликий сервер, який надає дані ledger у Grafana в реальному часі, демонструючи, що подібний підхід можна застосувати і до Beancount — фактично створити демон (daemon), який безперервно передає дані на ваші панелі приладів. -
Пряма інтеграція з API: Просунуті користувачі можуть підключатися безпосередньо до банківських API (таких як Plaid або регіональні API Open Banking) для частого отримання транзакцій. Зацікавлена особа може написати скрипт для «живого» імпорту в циклі (з відповідним обмеженням частоти запитів) — фактично опитуючи банк на наявність нових даних кожні кілька хвилин. Ніщо не заважає вам «зареєструватися в Plaid API і робити ту саму [автоматизацію] локально». Кожна нова транзакція може додаватися до файлу Beancount по мірі надходження. За такого підходу Fava справді стає панеллю приладів у реальному часі для ваших рахунків, не поступаючись актуальним стрічкам у комерційних додатках.
Оновлення даних у Fava: Після того, як ваші дані почали оновлюватися, змусити Fava показати їх просто: оновлення браузера (F5) або натискання на бан ер перезавантаження завантажить останній стан книги. Якщо ви волієте навіть не клікати, запуск Fava з прапорцем --debug вмикає автоматичне перезавантаження для розробки розширень, яке деякі використовують для примусового негайного оновлення сторінки при змінах. Крім того, якщо ви створюєте власний фронтенд, ви можете налаштувати його на опитування невеликого API, який за розкладом повертає останній баланс або інші дані з книги.
Миттєві обчислення: Швидкий парсинг Beancount означає, що навіть якщо ви оновлюєте файл книги кожні кілька хвилин, час від отримання даних → оновлення файлу → перезавантаження Fava є дуже малим. Наприклад, один користувач зазначає, що перезавантаження Fava після редагування файлу «майже непомітне… безумовно менше секунди» для книг розумного розміру. Таким чином, ви можете тримати вікно Fava відкритим і періодично натискати «оновити», щоб імітувати живу панель приладів. (Для справжнього режиму реального часу можна створити невеликий скрипт для автоматичного оновлення браузера або використовувати функцію оновлення сторінки кожні N секунд у браузері).
Звірка та сповіщення: Щоб довіряти даним у реальному часі, необхідно часто звіряти залишки. Beancount спрощує це за допомогою тверджень про баланс (balance assertions) та індикатора актуальності. Фактично Fava пропонує кольорові індикатори поруч із рахунками, якщо ви позначите їх певними метаданими (наприклад, ви можете позначити рахунок метаданими fava-uptodate, і Fava зафарбує його в червоний/жовтий/зелений колір залежно від того, чи є останній запис нещодавньою перевіркою балансу). Це можна використовувати для швидкої перевірки того, чи відповідає баланс рахунку в книзі останній виписці з банку. У налаштуванні, наближеному до реального часу, ви можете автоматизувати щоденні перевірки балансу (так, щоб щоранку в книзі був зафіксований кінцевий баланс банку за вчорашній день для кожного рахунку). Індикатор Fava тоді підкаже вам, якщо ваш автоматичний імпорт щось пропустив або якщо є розбіжність, забезпечуючи впевненість у точності «живих» даних, які ви бачите.
Приклад автоматизації: Припустимо, ви хочете отримувати щоденні оновлення грошових потоків. Ви можете налаштувати завдання cron на 3 годину ранку щоночі: воно виконує скрипт Python, який використовує API вашого банку для отримання транзакцій за минулий день, записує їх у import_today.beancount, а потім додає цей файл до вашої основної книги. Воно також записує твердження про баланс на кінець дня. Коли ви прокидаєтеся, ви відкриваєте Fava — вона показує всі транзакції до вчорашнього дня, і ви бачите оновлені доходи/витрати за поточний місяць. Якщо ви робите витрату протягом дня, ви можете додати її вручну (наприклад, через форму нової транзакції Fava на телефоні) або зачекати нічного імпорту. Цей гібридний підхід (переважно автоматизований, з можливістю додавання вручну за потреби) дає картину, близьку до реального часу. Інший підхід — тримати сторінку Журналу (Journal) у Fava відкритою і використовувати її як касову книгу: коли ви витрачаєте гроші, ви швидко записуєте транзакцію (як запис у чековій книжці) — тоді ви самі є джерелом даних у реальному часі. Це вимагає більше ручної роботи, але деяким користувачам подобається усвідомленість, яку це приносить. Для справді потокових оновлень без ручних кроків вам потрібно буде інвестувати час у написання скриптів і, можливо, використовувати сторонні API, як обговорювалося раніше.
Підсумовуючи, поєднуючи автоматизацію імпорту Beancount зі швидким оновленням Fava, ви можете отримувати фінансові дані майже в реальному часі. Можливо, це не так «просто, як натиснути кнопку», як у сервісах на кшталт QuickBooks (які автоматично підтягують банківські дані), але це можливо — і, що важливо, ви зберігаєте повний контроль та прозорість процесу. Як зазначив один прихильник текстового обліку, невеликі зусилля на початку можуть дати автоматизовану систему, яка «набагато краща за комерційні рішення, і значно гнучкіша та розширюваніша». У наступному розділі ми побачимо, як можливості візуалізації Fava дозволяють негайно осмислити ці актуальні дані, перетворюючи сирі транзакції на інсайти.