Всем привет! Я, как и многие на этом сайте, задумывался над ведением семейного бюджета.

Проблематика

Поскольку семья у меня состоит больше чем из одного человека, проблема управляемости этой истории меня очень интересует. Для хоть сколько‑нибудь прогнозирования дат крупных покупок, требуется понимание скорости движения к цели накопления необходимой суммы, а по простому — сколько денег есть возможность откладывать ежемесячно таким образом, чтобы закрывать все потребности. Поскольку ежемесячный доход в нашей семье — это величина очень легко прогнозируемая(оклады), то для решения задачи нужно знать, сколько в среднем приходится расходов. Расходы обычно производятся в безналичном виде — либо платежи по картам, либо какие‑то операции оплаты через мобильное приложение банка. Проблема в том, что банков несколько.

Решение

Идея решения такая: парсить выписки различных банков, которыми пользуется семья, а все операции заносить в какое‑то хранилище данных. В качестве хранилища данных был выбран elastic в том числе и потому, что у него есть удобный и довольно простой в использовании интерфейс — kibana. В итоге, схема выглядит так:

Схема решения
Схема решения

Все выписки разбираются на операции. Каждая операция имеет дату и время совершения операции, сумма операции, описание, а также тип операции — оплата это или пополнение. Оплата имеет дополнительные необязательные для заполнения поля — MCC‑код и название терминала. Конечно, я попытался эти поля сделать унифицированными, но, как не удивительно, каждый из банков имеет свои особенности в формировании выписок. Об этом ниже.

Особенности парсинга выписок

СовкомБанк

Банк, который дает наиболее полную информацию об операциях в своих выписках. Интересная деталь – выписки можно сформировать как в html-формате, так и pdf. В формате pdf информация несколько урезанная, поэтому пользуюсь html-форматом. Совкомбанк дает возможность указать все без исключения поля операций.

ВТБ

Выписки представляют собой pdf-файлы. Формирует наименее дружелюбный формат для парсинга выписок. В выписке не отдается MCC-код, но отдается название терминала. Интересно, но в мобильном приложении по каждой из операций оплаты можно получить MCC-код. Задание со звездочкой – сформировать файл-маппинг из названия терминала и MCC-кода, который можно скормить парсеру выписки ВТБ для получения наиболее полного результата парсинга. Количество посещаемых мест моей семьей в целом конечно, поэтому от месяца к месяцу добавлять новые названия терминалов в файл-маппинга приходится все меньше. Утомительно, но эффективно.

АльфаБанк

Выписки представляют собой pdf-файлы. У операции отображается только дата совершения, но нет времени. По оплатам отдают MCC-код, но название терминала в каком-то интересном формате, который сложно выдрать.

Ограничения

Если происходит много оплат по СБП, то это искажает результаты трат. Если происходят переводы с одной карты на другую, то невозможно сформировать отчет по доходам.

Что получаем?

На выходе в в elastic’e лежат все операции со всех банковских карт. Elasticsearch обладает довольно внушительными возможностями для поиска как отдельных операций, так и для анализа всего массива данных по заданным параметрам. Для себя я настроил дашборд с различными графиками для быстрого доступа. Некоторые из них:

График с отображением количества платежей.
График с отображением количества платежей.

Это самое просто, что можно было сделать).

График с расходами по месяцам, с разбиением расходов по категориям.
График с расходами по месяцам, с разбиением расходов по категориям.

Помогает для визуального контроля оценки израсходованных средств.

График со среднемесячными расходами.
График со среднемесячными расходами.

Как мне кажется, один из самых интересных и полезных графиков. Использует механизм расчета скользящей средней на окне 6 месяцев. Размер окна можно выбрать любой. Такой подход позволяет сглаживать ненормальные пики по тратам, а также показывать среднюю сумму средств, необходимую для проживания семьи.

Итог

В целом, самым полезным для меня является график среднемесячных расходов. Он позволяет вести планирование на год вперед. Возможно, из такого подхода можно еще какие-то метрики получить, прошу накидывать предложения в комментариях.

Парсер выписок на PHP

Комментарии (24)


  1. ky0
    25.09.2023 04:01
    -2

    На что только люди не идут, лишь бы не пользоваться Zenmoney :)


    1. Acidter
      25.09.2023 04:01

      Пользовался, пока они купленную платную версию в кирпич не превратили.


      1. ky0
        25.09.2023 04:01

        У меня вроде работает. Расскажете, что случилось?


        1. Acidter
          25.09.2023 04:01

          Ранее они продавали lifetime-версию, потом перешли на In-app purchases дропнув lifetime вместе с теми кто её купил


          1. ky0
            25.09.2023 04:01

            Да, у меня был куплен именно бессрочый премиум — поэтому я и удивился.


            А как понять, что оно у меня "дропнулось"? В разделе с оплатой показывает вот такое:
            image


            1. Acidter
              25.09.2023 04:01

              Видимо lifetime снова вернули, теперь он в In-app. Когда удалили тот lifetime о котором я писал выше, в приложении можно было оформить только подписку на период.


          1. Antra
            25.09.2023 04:01

            Купил lifetime более 5 лет назад.

            За это время сменил несколько смартфонов (с полной переустановкой софта).

            Продолжаю пользоваться. Есть смысл куда-то глянуть, что-то проверить? Или был какой-то временный перебой, сейчас все хорошо?


            1. Acidter
              25.09.2023 04:01

              Ответил здесь https://habr.com/ru/articles/761748/comments/#comment_26000562

              Я покупал lifetime 10+ лет назад


  1. Shenter
    25.09.2023 04:01

    Делал что-то подобное, но пришел к тому, что лучше вводить расходы вручную - а то пекарни записываются как "Рестораны" и можно точно раскидать по категориям все, что куплено в супермаркете.

    Плюс сделал фичу для себя - в рабочее время, например, каждую минуту (или час, кому как удобнее) к бюджету выбранной мной категории прибавляется сумма, которую заработал за эту минуту (или час). Нажал в боте, например, на "Здоровье" и знаешь, на что работаешь


  1. dshemin
    25.09.2023 04:01

    Интересно было бы узнать больше подробностей как раз о том как данные забираются из разных банков. Просто Playwright (или что подобное), и сценарии которые ходят, кликают и скачивают? Есть конечно инициатива открытого банкинга, но увы, пока не нашёл там решений которые позволили бы получать по API нужные данные.


    1. Serganbus Автор
      25.09.2023 04:01

      в ручном режиме забираются выписки, в ручном))

      Также как и вы, курил эту тему с опен банкингом, и также столкнулся с проблемой, что далеко не у всех банков есть api. К слову, у АльфаБанка, Тинька и сбера есть. Но у меня другие банки, к сожалению)


      1. Antra
        25.09.2023 04:01

        Красиво у вас получилось.

        не у всех банков есть api

        Наверное, правильнее сказать "не у всех банков есть хорошо описанное и публично доступное api."

        Насколько я понял по опыту Дзен Мани, там реверсится API, используемое мобильными клиентами банков.

        Или анализируются SMS/Push. И мне такое нравится тем, что не нужно приложению давать вход в банковский аккаунт.

        Я, правда, не очень понимаю, когда стало возможно параллельно читать пуши чужих приложений (в стародавние времена я специально отказывался от пушей в пользу СМС ради такого вот "параллельного чтения").

        Впрочем, для меня даже при моментальном автоматическом импорте транзакций изо всех моих банков главная фича - ручной комментарий "что это было". И если отвлекся и сразу не указал, потом бывает "что за фигня?". И приходится напрягаться, чтобы вспомнить, что это переводом СБП оплатил мастеру, устанавливающему рулонные шторы...

        А категории по выпискам из банка все равно для меня фикция, ибо в покупке в "Гипермаркет Глобус" не отделить продукты от бытовой химии или сада/огорода. Если только по QR коду с чека лезть в ИФНС и смотреть конкретные позиции... (Хотя чек я в Дзен-мани фоткаю, чтобы через год ужаснуться, насколько подорожала та же самая бутылка молока)


        1. Serganbus Автор
          25.09.2023 04:01
          -1

          Наверное, правильнее сказать "не у всех банков есть хорошо описанное и публично доступное api."

          Именно.

          Насколько я понял по опыту Дзен Мани, там реверсится API, используемое мобильными клиентами банков.

          Вот лично мне боязно давать доступ стороннему приложению в личный кабинет по реверс апи.

          А категории по выпискам из банка все равно для меня фикция, ибо в покупке в "Гипермаркет Глобус" не отделить продукты от бытовой химии или сада/огорода. Если только по QR коду с чека лезть в ИФНС и смотреть конкретные позиции... (Хотя чек я в Дзен-мани фоткаю, чтобы через год ужаснуться, насколько подорожала та же самая бутылка молока)

          Такто данные по покупкам складываются в ОФД, которые доступны по номеру телефона на сайте налоговой. Другой вопрос, что далеко не все данные туда падают. А так, в дальнейшем такое действительно будет возможно, но не сейчас, к сожалению.


          1. Antra
            25.09.2023 04:01

            Вот лично мне боязно давать доступ стороннему приложению в личный кабинет по реверс апи.

            Это на случай, если вы можете себе лично какие-то curl допилить даже в отсутствие документированного API (глянув исходники плагинов Дзен-мани для ваших банков, если таковые имеются).

            Я же именно поэтому долго оставался на SMS. И никуда пароль не вводить, и приходят не только траты, но и остаток (для сверки).


  1. Almiks
    25.09.2023 04:01
    +2

    Статья была бы интересной, если бы были расписаны технические моменты реализации. В том виде в котором оно есть сейчас получается - "Я складываю информацию о своих финансах в elasticsearch, вот такой я молодец!".


    1. Serganbus Автор
      25.09.2023 04:01

      Дак а какие технические моменты вы бы хотели получить? Парсинг выписок? Приложен пакет на php, который это делает. Загрузка данных в эластик?


  1. fekrado
    25.09.2023 04:01

    1. Анализ трат - это хорошо. Но я так и не понял , где эффект планирования больших покупок

    2. Я в конце месяца перекидываю какой-то бюджет (с разных карт ) на одну, с которого и веду месячные траты. Это + к удобству (собирать статистику с 1 карты\банка)

    3. И как раз зная средние траты, остается остаток , котрый можно и перекидывать в буферный счет с котрого и совершать большие покупки.


  1. ReadOnlySadUser
    25.09.2023 04:01
    +3

    Я вёл бюджет пару лет, но по итогу бросил это дело. Занятие увлекательное конечно, но я эти данные просто никак не использовал.

    Как оказалось, я довольно точно в голове могу прикидывать сколько и на что я трачу и сколько у меня будет денег через N времени. Чего достаточно для бытового планирования)


  1. Batalmv
    25.09.2023 04:01
    +2

    Мне кажется, это все ни о чем. Бюджет семьи не так уж и велик, да и чего там вести? Управляешь все равно не расходами, а живыми деньгами.

    Есть даты прихода и известен размер. Есть условно финансовая подушка первого уровня, это либо дебетная карта, либо счет с небольшими процентами на остаток. Там условно лежит ежемесячный приход, ну или кому сколько надо. С нее если что можно купить себе чего нибуть не сильно большое.

    Есть отдельно вторая подушка, на отпуск или крупную плановую трату. Мебель там, или еще чего. Разница в том, что ее можно положить на короткий депозит, так как быстрый доступ к ней не ожидается.

    Все что дальше, это либо глобальные траты типа машины, квартиры, либо инвестиции надолго

    Расходы легко мониторить по приросту первой подушки. Если она не выросла на ожидаемую сумму, то повод посмотреть, а чего мы собственно купилм.

    А так сидеть и анализировать расходы,это как плакать у вытекшему молоку.

    Это кстати как с мониторингом систем. Можно и нужно собирать триллион метрик, но не надо на них смотреть. Настрой разумное число порогов и реагируй только на срабатывания


    1. Antra
      25.09.2023 04:01

      Может и невелик, но разбросан по разным счетам-банкам. Хотя бы из-за разных условий - что-то выгоднее оплачивать одной картой,что-то другой... И одной из мотиваций лет 15 назад для меня стала невозможность с достаточной степенью оценить, сколько же у меня всего накоплений.

      Потом добавились счета в валюте...

      Еще мотивация - сколько денег в конкретном банке, не превышен ли в нем лимит АСВ, и по этой причине вклад лучше открыть в другом, пусть даже под такой же процент.

      Кстати, интересный момент - это сейчас основные траты по картам, даже когда в частном порядке с мастером рассчитываешься. А когда налик был, поначалу регулярно обнаруживалась недостача. Вроде все расходы вносил, а осталось кеша меньше, чем должно по учету. И сидишь, вспоминаешь, куда же еще потратился.

      Очень хорошо тогда прокачался навык осознанности трат.


      1. Batalmv
        25.09.2023 04:01
        +1

        Так с картами еще проще. Есть основная, где лучший кешбэк и прочие плюшки и потенциально одна-две, где теоретически можно получить больше в конкретнлой точке/виду услуги. Статистика то зачем?

        Опять же, это не про расходы, а про "держать" достаточный остаток на каждой расчетной карте

        Просто статья про учет расходов, а это по сути трата времени


        1. Antra
          25.09.2023 04:01

          Мне статистика ни зачем. Я ей не пользуюсь.

          А вот учет веду много лет, ибо очень надо. Просто для других целей, графики не строю.


  1. LeshaRB
    25.09.2023 04:01

    А как будет записываться трата
    Дал ребенку наличные, на мороженное?


  1. Ninil
    25.09.2023 04:01

    Я тоже когда то заморачивался подробной аналитикой и учётом, но потом понял, что дополнительные 5% точности не стоят дополнительных 95% усилий. Поэтому сейчас Эксель/гугл-таблицы - мое все, разделение на категории - в топку и т.п. :)
    Поэтому вопрос немного не технический. А какова цель всего этого корректно у вас? Я так понял, что "самым полезным для меня является график среднемесячных расходов", но для несколько оправдана такая сложная система для такой цели?