Личные финансы как код: 2 месяца plain-text бюджетирования с AI
Я хотел понимать, куда уходят деньги. Не на уровне “зайти в приложение банка” — на уровне “полная картина, тренды, прогноз на 12 месяцев вперёд”.
Все приложения для бюджета, которые я пробовал, делали либо слишком мало (просто категории), либо слишком много (подключи все счета, доверь нам данные, плати подписку). Я хотел что-то посередине: достаточно мощное для прогнозов, достаточно простое для понимания и полностью моё.
Поэтому я собрал всё на текстовых файлах. Система живёт внутри YOS — моей персональной ОС жизни — рядом со всем остальным: дневником, задачами, привычками, проектами. Оказалось, что пара скриптов и текстовый леджер дают удивительно много.
Стек
Три компонента, ничего сложного:
- hledger — plain-text бухгалтерия с двойной записью. Текстовый файл с транзакциями и 30 лет инструментов поверх. Одна команда — и у тебя баланс, отчёт о доходах-расходах, помесячная разбивка.
- Python-скрипт импорта — берёт выгрузку из банка (XLSX или CSV), парсит транзакции, категоризирует по правилам, дописывает в журнал hledger.
- Markdown-прогнозы — помесячные файлы с таблицами: доход, фиксированные расходы, переменные расходы, прогнозный баланс. Обновляются каждый месяц по мере поступления данных.
Никаких баз данных. Никакой облачной синхронизации. Всё в git, версионируется вместе с остальными данными о жизни.
Пайплайн импорта
Вот тут становится интересно. Мой банк (BBVA, но подойдёт любой банк с выгрузкой в CSV или XLSX) позволяет скачать историю транзакций. Скрипт импорта делает три вещи:
1. Парсинг. Прочитать файл, достать дату, описание, сумму. Разобраться с форматами дат, валютными символами, кодировкой. Скучно, но необходимо.
2. Категоризация. Вот это уже интереснее. JSON-файл с правилами маппит паттерны описаний на счета:
[
{"patterns": ["mercadona", "lidl", "carrefour"], "account": "expenses:groceries"},
{"patterns": ["netflix", "spotify", "youtube"], "account": "expenses:subscriptions"},
{"patterns": ["farmacia", "clinic", "dentist"], "account": "expenses:health"}
]
Если ничего не совпало — транзакция попадает в expenses:uncategorized. После каждого импорта я просматриваю такие, разбираюсь что это, и добавляю новые правила. Покрытие растёт органически. Первый импорт — может 60% распознано. Через два месяца — больше 90%.
3. Запись. Добавить записи в журнал hledger:
2026-02-21 Mercadona
expenses:groceries EUR 42.86
assets:bank:checking
Всё. Запускаешь команду, просматриваешь нераспознанные с помощью AI (“что за магазин?”), добавляешь правила, готово. Весь процесс сейчас занимает минут десять на один импорт.
Построение прогнозов
Учёт показывает, куда деньги ушли. Прогноз показывает, куда уйдут. После первого полного месяца данных я построил простую модель:
Разделить расходы на фиксированные и переменные.
- Фиксированные: аренда, коммуналка, подписки, налоги — предсказуемые, повторяющиеся.
- Переменные: продукты, рестораны, развлечения, покупки — скачут от месяца к месяцу.
Спроецировать вперёд. Взять месячные средние, добавить известные периодические расходы (ежеквартальные налоги бьют больно — об этом ниже), и растянуть таблицу на 12 месяцев.
Отслеживать баланс. Каждая строка: доходы минус расходы = нетто, накопительный баланс. Сразу видно, какие месяцы тесные, а какие копят подушку.
Первый прогноз был грубым — на основе одного месяца. Некоторые категории выглядели пугающе (снятие наличных казалось огромным), а другие обманчиво низко (покупки за первый месяц — ноль, что точно не норма).
Тест на точность
Вот это самая ценная часть. После второго месяца я мог сравнить прогноз с реальностью.
Переменные расходы в прогнозе попали почти идеально — отклонение меньше 1% от факта. Честно говоря, для базы из одного месяца — удивительно.
Фиксированные расходы оказались чуть выше прогноза — годовая подписка, про которую я забыл, и коммуналка, которая зависит от сезона. Отклонение около 7%.
В целом, прогноз по нетто не промахнулся и на 10%. Для модели, построенной на одном месяце данных, — рабочий результат.
Но главный инсайт вот какой: прогноз улучшается автоматически. Каждый месяц новых данных уточняет средние. Разбивка по категориям показывает, какие оценки стабильны (продукты почти не сдвинулись между месяцами), а какие волатильны (расходы на здоровье прыгнули на 50%). Ты точно знаешь, где модель слабая.
Что на самом деле делает AI
AI не ведёт мои финансы — это делаю я. Но он ускоряет каждый шаг:
- Написание скрипта импорта. Я описал, что мне нужно, дал пример файла выгрузки. Рабочий парсер — за одну сессию.
- Категоризация неизвестных. “Что за магазин?” — AI часто узнаёт бизнес по описанию и предлагает правильную категорию.
- Построение прогнозов. Мы проходим по цифрам вместе. AI вытаскивает данные из hledger, считает средние, отмечает выбросы, форматирует таблицу. Я принимаю решения — что включать и какие допущения использовать.
- Поиск рисков. “После квартальных налогов в апреле баланс упадёт до минимума — это самый напряжённый месяц.” Полезный контекст, который легко упустить, глядя в таблицу.
Паттерн один и тот же: AI делает механическую работу (парсинг, расчёты, форматирование), я делаю содержательные решения (эта трата повторяющаяся? стоит ли закладывать её в бюджет?). По отдельности ни один из нас не справился бы так же хорошо.
Что работает, а что нет
Работает хорошо:
- Пайплайн импорта реально полезен. Десять минут на импорт — и у меня чистые, категоризированные данные.
- Plain text означает, что я могу запрашивать свои финансы через мощную отчётность hledger: помесячная разбивка, тренды по категориям, сравнение периодов — всё однострочниками в терминале.
- Прогноз, даже после двух месяцев, уже даёт уверенность на год вперёд. Я вижу узкие места заранее.
- Всё в git. Я могу посмотреть, как эволюционировали мои прогнозы, когда я добавлял какие правила, как факт сравнивался с предсказаниями.
Ещё сыро:
- Два месяца данных — некоторые средние ненадёжны. Категории с высокой волатильностью (здоровье, покупки) требуют больше истории.
- Снятие наличных — чёрный ящик. Деньги уходят, а куда — непонятно. Это самое большое слепое пятно.
- Ежеквартальные налоги создают предсказуемый стресс — модель это чётко показывает, но знать о нём заранее и спокойно смотреть на низкий баланс — разные вещи.
- Импорт полуручной. Скачиваю файл, запускаю скрипт, просматриваю. Автоматическая синхронизация с банком была бы удобнее, но мне на самом деле нравится этап просмотра — он заставляет взглянуть на каждую транзакцию.
Философия plain text
Есть причина, почему это лежит в текстовом файле рядом с дневником и трекером привычек. Личные финансы не отдельны от остальной жизни — они связаны с целями, проектами, решениями.
Когда я прикидываю, стоит ли вложиться в какой-то курс — я смотрю в прогноз. Когда делаю недельный обзор — финансовая сводка прямо тут. Когда что-то меняется — новая регулярная трата, повышение, крупная покупка — я обновляю прогноз в том же коммите, что и запись в дневнике о решении.
Никакого переключения между приложениями. Никакого экспорта данных. Один репозиторий, одна история, один контекст.
Два месяца. Система простая, данных становится больше, и каждый прогноз чуть честнее предыдущего. Это всё, что я хотел.