Почему?


Несколько лет назад я заинтересовался получением пассивного дохода и решил попробовать инвестировать с помощью p2b-площадок. Через некоторое время стало заметно, что денежные средства оказались очень сильно фрагментированы по площадкам, банкам, долгам, и это затрудняло понимание ситуации. Я не мог ответить на два самых главных вопроса:
Сколько у меня денег?


Какой тренд? Я богатею, или беднею?


КДПВ

image


Нужно было как-то собрать информацию воедино и поддерживать ее в актуальном виде.


Варианты решения проблемы были следующие:


Таблица в Google Sheets


Преимущества: делается быстро, гибко, бесплатно
Недостатки: необходимость обновлять данные вручную


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


Специализированные решения


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


Стало очевидно, что подходящий сервис придется писать самому — только так можно полностью автоматизировать получение финансовых данных, и в то же время не беспокоиться о передаче реквизитов третьей стороне. Кроме того, это позволило бы реализовать любой желаемый интерфейс. Так начался проект BudgetTracker, которым я успешно пользуюсь уже два года. Его можно скачать в виде исходников и/или установить на собственный сервер как готовый docker-контейнер.


Основная идея


Есть две разные стороны, как можно смотреть на финансы. С одной стороны есть текущее состояние (условно — сейчас на счету “Х” находится “У” денег), с другой стороны есть транзакции (условно — покупка “ХХ” за “УУУ” денег в момент времени Т).


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


Источники данных


Существуют разные провайдеры — источники данных, например собирающие данные из банк-клиента.


Поддерживаемый список провайдеров
  • FX — курсы валют: EUR, USD
  • LiveCoin — криптобиржа
  • Penenza
  • АльфаБанк
  • АльфаКапитал
  • АльфаДирект
  • АльфаПоток
  • МодульБанк
  • МодульДеньги
  • Райффайзен
  • Долги и ссуды (для вручную заведенных долгов)
  • POST-api для получения произвольных данных из внешних систем

Так как часть провайдеров требуют SMS-аутентификацию, то есть также интеграция с SMS через IFTTT (только для Android-телефонов).


Провайдер каждые сутки собирает состояние каждого из счетов и список всех транзакций и сохраняет их в базу. Для этого запускается Chrome, и с помощью Selenium извлекаются нужные данные из онлайн-банков.


Счета


Состояния каждого из счетов формируют таблицу вида:


image


Это дает возможность видеть детали и состояние каждого из счетов, но это не помогает видеть общую картину, и не дает ответа на простой вопрос "сколько у меня денег?".
Для того, чтобы ответить на этот вопрос была добавлена поддержка “вычисляемых столбцов”, в которых можно задать формулу, например:


image


Но помимо конкретного значения хочется видеть также тренд, выбросы, прогнозы — иными словами видеть динамику этого значения (а иногда и не только его одного).


Для этого существует концепт “главной страницы” где можно настраивать отдельные виджеты для того, чтобы акцентировать внимание на конкретных столбцах / трендах.


Виджеты


image


Существуют несколько видов виджетов:


  • “Пончик” с тратами (из транзакций)
  • “Последнее значение” — график-линия для произвольных столбцов, показывает прогнозируемое изменение в годовых (%), и фактическое за последний день (%). Бывает так же в "компактном" режиме, когда показывает только текущее(последнее) значение.
  • “Дельта” — показывает изменения столбца в цифрах за последние 24ч, 48ч, 1 неделю и 1 месяц
  • “Пончик” — для вычисляемых столбцов
  • “График” — для вычисляемых столбцов

Каждый тип виджета имеет свой размер, и их можно двигать относительно друг друга, используя "стрелочки". По-умолчанию они скрыты, и появляются по нажатию кнопки "глаз" в верхней части страницы:
image


Также при создании или редактирования виджета есть возможность изменить какие-либо его настройки:
image


Транзакции


Для работы с транзакциями, или ДДС, есть отдельная страница, где видно все транзакции, сгруппированные по категориям.
image


У каждой транзакции есть “тип” транзакции — это “доход”, “расход”, или “перевод”. Перевод выставляется вручную, чтобы исключить переводы из графиков с главной страницы.


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


Если в провайдере данных нет поддержки транзакций

В таком случае удобно добавить автогенерацию транзакций в свойствах столбца, и в момент покупки отредактировать транзакцию в которой покупали акции и поставить ей тип “перевод”.


Категории и типы можно выставлять как вручную (придётся их сначала завести), так и на основе правил. При установке категории на транзакцию — она автоматом установится также на все другие транзакции с таким же описанием (и в будущем будет также применяться на подобные транзакции). Помимо ручной установки категории на транзакцию можно добавить правило в виде регулярного выражения или вхождению подстроки для автоматической установки категории на все подходящие транзакции.


Также существует отдельный раздел “Долги”, куда можно вносить вручную долги. Для каждого долга можно аналогично установить шаблон для транзакции, чтобы при появлении новых ДДС, относящихся к этому долгу — оставшаяся сумма обновлялась.
image


Технологический стек


В настоящий момент бекенд работает на .NET Core 3, фронтенд на Svelte 3.
Для хранения данных используется ObjectRepository + LiteDB.
Для интеграции с источниками данных используется связка Selenium + Chrome.


Изначально всё писалось полностью на .NET Core, но некоторое время назад фронтенд был переписан на Svelte.
Из-за этого наследия — общение с сервером было сделано не оптимально и есть планы переписать эту часть проекта на реактивную модель.


Как попробовать


docker-compose.yml файл в репозитории поможет:


version: "3.3"
services:
  budgettracker:
    image: diverofdark/budgettracker:master
    restart: unless-stopped
    environment:
      Properties__IsProduction: 'true' # true если необходимо сохранять изменения в базу. 
      ConnectionStrings__LiteDb: '/data/budgettracker.db' 
    volumes:
      - /dev/shm:/dev/shm # Для использования Google Chrome
      - /root/bt:/data
    ports:
      - "80:80"
    networks:
      public: {}

networks:
  public:
    driver: bridge

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


  1. fapsi
    20.09.2019 20:01

    И ни в одном приложении не видел планирования расходов. Разве что в FinPix, но это только учёт расходов.
    Что мешает запилить?


    1. codecity
      20.09.2019 21:30

      Есть в 1С: Деньги. Там не только планирование расходов, но и составление бюджета. Многие просто не понимают что это такое, не работают на таком уровне. А ведь это самое главное — ответ на вопрос могу ли я себе это позволить или когда я смогу себе это позволить.

      Хотя сама прога и не удобная, но фин. идеи там достойные.


    1. incorwild
      21.09.2019 12:30

      можете еще Дзен-мани посмотреть, там есть и интеграции с банками и бюджет


      1. DiverOfDark Автор
        21.09.2019 12:36

        Я пытался, у меня их интеграция с банками работала через раз :(


        1. incorwild
          21.09.2019 13:10

          я пользуюсь сейчас. Тиньков, Сбер и Рокет работают без нареканий.


    1. Aleksanderis
      21.09.2019 12:30

      YNAB (You Need A Budget) как раз полностью ориентировался именно на планировании бюджета (расходов). Хотя можно использовать и просто для учёта.
      Правда после того как я купил их программу, а через некоторое время они переметнулись в «облако» с платной месячной «подписькой» — начало приходить разочарование. Особенно когда в один прекрасный момент старая необлачная версия (благо она ещё работала), из-за своей прекрасной синхронизации-на-костылях запороло несколько лет ведущуюся базу моих расходов — забил окончательно.:)
      Временами тоже периодически настигали идеи чисто для своих нужд чего-нить похожее наваять… Так интересно посмотреть на реализацию из этой статьи.


    1. DiverOfDark Автор
      21.09.2019 12:40

      я хочу прикрутить к BT ещё раздел с личным инвестиционным планом, это что-то похожее, но не могу сказать когда это произойдёт.


  1. ximik666
    20.09.2019 21:21

    Сбербанк, Тинькоф можно прикрутить?


    1. DiverOfDark Автор
      22.09.2019 20:50

      Это довольно просто, но я этого не смогу сделать, т.к. не пользуюсь ими.


  1. Boleg2
    21.09.2019 09:21

    Посмотрите firefly-iii — веб-серверное опенсорс-решение, есть по-моему всё вышеперечисленное, в том числе и планирование расходов.
    Про интеграцию с банками там, конечно, опосредованно, но варианты есть.


    1. DiverOfDark Автор
      21.09.2019 12:35

      Спасибо, посмотрю, выглядит как нечто очень близкое, только, возможно, чуть более mature.
      Интеграция с банками (и не только) — это то, что больше всего болело у меня, когда я делал свое решение.


  1. BM_MacGregor
    21.09.2019 12:29

    Штука интересная, спасибо.
    Вопрос возник, почему фронтенд на Svelte? Был какой-то осознанный выбор или просто ради интереса?


    1. DiverOfDark Автор
      21.09.2019 12:35

      Скорее вкусовщина и интерес.