Всем привет! Я, как и многие на этом сайте, задумывался над ведением семейного бюджета.
Проблематика
Поскольку семья у меня состоит больше чем из одного человека, проблема управляемости этой истории меня очень интересует. Для хоть сколько‑нибудь прогнозирования дат крупных покупок, требуется понимание скорости движения к цели накопления необходимой суммы, а по простому — сколько денег есть возможность откладывать ежемесячно таким образом, чтобы закрывать все потребности. Поскольку ежемесячный доход в нашей семье — это величина очень легко прогнозируемая(оклады), то для решения задачи нужно знать, сколько в среднем приходится расходов. Расходы обычно производятся в безналичном виде — либо платежи по картам, либо какие‑то операции оплаты через мобильное приложение банка. Проблема в том, что банков несколько.
Решение
Идея решения такая: парсить выписки различных банков, которыми пользуется семья, а все операции заносить в какое‑то хранилище данных. В качестве хранилища данных был выбран elastic в том числе и потому, что у него есть удобный и довольно простой в использовании интерфейс — kibana. В итоге, схема выглядит так:
Все выписки разбираются на операции. Каждая операция имеет дату и время совершения операции, сумма операции, описание, а также тип операции — оплата это или пополнение. Оплата имеет дополнительные необязательные для заполнения поля — MCC‑код и название терминала. Конечно, я попытался эти поля сделать унифицированными, но, как не удивительно, каждый из банков имеет свои особенности в формировании выписок. Об этом ниже.
Особенности парсинга выписок
СовкомБанк
Банк, который дает наиболее полную информацию об операциях в своих выписках. Интересная деталь – выписки можно сформировать как в html-формате, так и pdf. В формате pdf информация несколько урезанная, поэтому пользуюсь html-форматом. Совкомбанк дает возможность указать все без исключения поля операций.
ВТБ
Выписки представляют собой pdf-файлы. Формирует наименее дружелюбный формат для парсинга выписок. В выписке не отдается MCC-код, но отдается название терминала. Интересно, но в мобильном приложении по каждой из операций оплаты можно получить MCC-код. Задание со звездочкой – сформировать файл-маппинг из названия терминала и MCC-кода, который можно скормить парсеру выписки ВТБ для получения наиболее полного результата парсинга. Количество посещаемых мест моей семьей в целом конечно, поэтому от месяца к месяцу добавлять новые названия терминалов в файл-маппинга приходится все меньше. Утомительно, но эффективно.
АльфаБанк
Выписки представляют собой pdf-файлы. У операции отображается только дата совершения, но нет времени. По оплатам отдают MCC-код, но название терминала в каком-то интересном формате, который сложно выдрать.
Ограничения
Если происходит много оплат по СБП, то это искажает результаты трат. Если происходят переводы с одной карты на другую, то невозможно сформировать отчет по доходам.
Что получаем?
На выходе в в elastic’e лежат все операции со всех банковских карт. Elasticsearch обладает довольно внушительными возможностями для поиска как отдельных операций, так и для анализа всего массива данных по заданным параметрам. Для себя я настроил дашборд с различными графиками для быстрого доступа. Некоторые из них:
Это самое просто, что можно было сделать).
Помогает для визуального контроля оценки израсходованных средств.
Как мне кажется, один из самых интересных и полезных графиков. Использует механизм расчета скользящей средней на окне 6 месяцев. Размер окна можно выбрать любой. Такой подход позволяет сглаживать ненормальные пики по тратам, а также показывать среднюю сумму средств, необходимую для проживания семьи.
Итог
В целом, самым полезным для меня является график среднемесячных расходов. Он позволяет вести планирование на год вперед. Возможно, из такого подхода можно еще какие-то метрики получить, прошу накидывать предложения в комментариях.