Инвесторум — еженедельный ИИ-журнал об инвестициях с модельным портфелем
Журнал об инвестициях, который целиком ведёт ИИ-система, и модельный исследовательский портфель, которым та же система управляет на реальном депозите. Автор всех материалов — открыто заявленный ИИ: это не маскировка, а принцип честности, встроенный в продукт.
Открыть проект
investorum.ru · апрель — сентябрь 2026 · единственный разработчик и владелец продукта
Коротко
Я давно интересуюсь инвестициями и с каждым годом всё строже отношусь к качеству: к контенту, к решениям, к тому, кому доверять свои деньги. Русскоязычный сегмент на эту тему предлагает выбор между дорогими «закрытыми клубами» и шумными телеграм-каналами — а ровного, честного, регулярного аналитического продукта почти нет. Так родился Инвесторум: еженедельный журнал, который я сам хотел бы читать, и модельный портфель как честная проверка — не «мнения ИИ», а публично отслеживаемые результаты на реальных деньгах.
Проект сделан в одиночку от идеи до продакшена: продуктовая концепция, архитектура, бэкенд, ИИ-конвейер, интеграции с биржей, комплаенс, инфраструктура и эксплуатация.
| Параметр | Значение |
|---|---|
| Срок разработки | ~5 месяцев (первый коммит — апрель 2026, живой продакшен — сейчас) |
| Команда | 1 человек (продукт + разработка + эксплуатация) |
| ИИ-конвейер | 6 специализированных агентов, контрактная оркестрация, полный аудит вызовов |
| Данные | живой MOEX ISS (цены, лоты, ОФЗ, индекс), Perplexity Sonar, Twelve Data |
| Юнит-тесты | 180 тестов в 13 наборах (ядро портфеля, комплаенс, фин.математика, SEO) |
| Автономность | еженедельный выпуск + почасовой монитор, автопостинг, алерты |
Что продукт делает
Каждый понедельник в 08:00 МСК система выполняет недельный цикл:
- Сбор фактуры. ИИ-агент с веб-доступом читает рыночные новости за 7 дней и выделяет одну доминирующую тему недели — с источниками, а не «из памяти модели».
- Статья. Второй агент пишет аналитический выпуск 1200–1600 слов по жёсткой структуре: буллетный лид со ссылками, разбор темы, типичные ошибки, практический смысл для читателя.
- Редактура и публикация. Третий агент вычитывает текст, чистит ИИ-штампы, генерирует специфичный FAQ и SEO-описание. Детерминированный комплаенс-гард проверяет выпуск — и статья публикуется на сайт, в RSS и в Telegram-канал.
- Модельный портфель. Два агента (аналитик и критик) формируют и проверяют распределение адаптивного «вечного портфеля» из биржевых фондов: 4 рукава — акции, облигации, золото, денежный рынок. Критик может отклонить решение → неделя «без изменений».
- Инструкции владельцу. Одобренное распределение проходит детерминированное ядро (бэнды, защитные полы, сайзинг целыми лотами) и превращается в готовые торговые инструкции с точным количеством лотов под депозит владельца — в закрытый Telegram-канал.
- Монитор. Каждый час система проверяет позиции, зачитывает купоны ОФЗ, следит за стоп-условиями и снимает дневной снапшот NAV для публичной страницы /research.
Публичный сайт показывает только агрегаты: NAV-индекс против индекса Мосбиржи, накопленной ключевой ставки и фикс-корзины 25/25/25/25 с месячной ребалансировкой. Без состава, тикеров и «сигналов» — это железное продуктовое правило.
Архитектура
Цикл генерации (каждый понедельник 08:00 МСК): BullMQ generate-daily → [1] news-fetch (фактура недели с источниками) → [2] writer (статья 1200–1600 слов) → [3] editor (корректура, FAQ, SEO) → комплаенс-гард (детерминированный) → публикация: сайт, RSS, sitemap, Telegram.
Параллельно: evidence packet (цены MOEX, тренды, просадки, ставка) → [4] portfolio-analyst (веса рукавов) → [5] portfolio-critic (APPROVE / REVISE / REJECT) → детерминированное ядро (констрейнты, лоты, NAV) → Telegram владельцу (пронумерованные SELL/BUY + обоснование) и дневной NAV-снапшот на /research.
Почасовой монитор: BullMQ monitor-portfolio → стоп-условия, купоны ОФЗ, снапшот NAV.
Сайт и Telegram — два разных продукта с разным уровнем детализации. Публичная часть — агрегаты, методология и ограничения (без состава, тикеров и «сигналов»); состав и инструкции — только в закрытом канале владельца. Это разделение зашито в код, а не в обещания: страница /research физически не имеет доступа к составу позиций.
ИИ-оркестрация: контрактное ядро вокруг агентов
Ключевая идея оркестрации — LLM предлагают, контракт и детерминированный код распоряжаются.
- Роль → модель. Каждый шаг конвейера получает свою модель под задачу: сбор фактуры — модель с живым веб-доступом; написание и редактура — быстрые и сильные текстовые модели; портфельные решения — сильные рассуждающие модели; обложка — отдельный бриф + image-модель. Конфигурация моделей редактируется из админки без деплоя.
- Контракты. Каждый выход агента валидируется zod-схемой с бизнес-правилами: сумма весов рукавов строго 100%, защитные полы, полоса длины статьи (8000–20000 знаков). Невалидный ответ — ретрай (до 3), у схем есть superRefine-дублирование критических инвариантов.
- Полный аудит. Каждый LLM-вызов пишется в БД: промпт, ответ, длительность, стоимость. Дашборд админки показывает расходы по дням с дневным лимитом.
- Промпты как данные. Промпты хранятся в БД с фолбэком на файлы — правятся из админки, версионно, без пересборки приложения.
- Критик. Решение аналитика проходит независимый аудит вторым агентом, который видит тот же evidence packet, текущие веса и оборот. REJECT = портфель не меняется, подписчики получают честное «неделя без изменений» с обоснованием.
Главное инженерное решение: детерминированное ядро
Когда речь идёт о деньгах, недетерминированность модели недопустима. Поэтому между ИИ и деньгами стоит чистое, полностью протестированное ядро:
- Констрейнты поверх ИИ-предложения: жёсткие бэнды по рукавам, ограничение отклонения (±5 п.п. за ревизию), защитные полы (полный выход в кэш запрещён), в защитном режиме подъём рисковых рукавов запрещён. Предложение аналитика сохраняется рядом с итоговым — видно, что и почему скорректировало ядро.
- Порог оборота: если корректировка меньше 3 п.п., ребаланс форсируется в «без изменений» — шум не превращается в сделки.
- Сайзинг целыми лотами с реальными лотами Московской биржи; символ без живой котировки не покупается, «пыль» уходит в кэш, но бюджет никогда не превышает доступный кэш.
- Лотовый ребаланс: сравниваются не абстрактные веса, а лоты позиций → владелец получает явные пронумерованные инструкции ПРОДАТЬ/КУПИТЬ с суммами и стоп-заявками, а не «распределение».
- Бухгалтерия NAV выводится, а не хранится: кэш вычисляется из событий (пополнения, покупки/продажи, купоны ОФЗ), индекс нейтрализует взносы/изъятия — внесённые деньги не рисуют доходность.
- Идемпотентность везде: купоны зачитываются один раз по идентификатору выплаты, алерты и Telegram-посты не дублируются, неотправленные алерты ретраются из хранилища.
Ядро чистое — без IO — и покрыто 180 юнит-тестами: констрейнты рукавов, сайзинг, NAV, купоны, стоп-условия, тренд-фильтр, бенчмарки (фикс-корзина с месячной ребалансировкой, max drawdown), распределение пополнений, комплаенс-гард, фин.математика калькулятора.
Данные: живая биржа, а не статика
- MOEX ISS — батч-запросы на весь юниверс (1–2 HTTP-запроса на десятки инструментов): цены фондов и ОФЗ (dirty-цена = чистая + НКД), размеры лотов, купоны, индекс Мосбиржи, недельные бары для тренда.
- Единственный источник истины по инструментам — файл-whitelist: юниверс портфеля (4 биржевых фонда, лонг-онли) отделён от контентного whitelist для статей.
- Батч-цены обязаны включать все открытые позиции, включая выводимые из портфеля легаси — суммы инструкций и кэш считаются по живым котировкам.
- Graceful degradation: недоступность одного источника не валит конвейер.
Комплаенс как код, а не как обещание
Публичный выпуск проходит детерминированный гард (не LLM!): жёсткий блок на гарантии доходности и торговые «сигналы», блэклист источников, allowlist-фильтрация доменов в теле статьи и в метаданных, правила по военному контенту. Финансовый контент в РФ — зона высокой ответственности, и это защищено кодом, который нельзя «уговорить».
Плюс продуктовая честность: ИИ-авторство заявлено открыто на странице автора и в бейдже каждой статьи; дисклеймеры в методологии; счётчик просмотров — клиентский и дедуплицированный, без единого трекера и cookie-баннера (никакой аналитики посетителей, VPS в РФ, 152-ФЗ); калькулятор инвестора считает всё в браузере — введённые данные не покидают устройство.
Инфраструктура и эксплуатация
- Прод: nginx + TLS → Next.js (systemd) + BullMQ-воркер (systemd), PostgreSQL и Redis в Docker. Всё на собственном VPS.
- Дисциплина деплоя: сборка и рестарт — одна неделимая операция (иначе ISR отдаёт HTML со ссылками на несуществующие чанки и стили слетают), сброс ISR-кэша сразу после рестарта, проверка отдачи CSS-ассетов скриптом. Чеклист задокументирован.
- Очереди: BullMQ + repeatable jobs с автоматической перерегистрацией расписаний; ручные ретраи и re-post скрипты для восстановления после сбоев.
- Наблюдаемость: структурные логи (pino, JSON), отдельный лог-файл воркера, алерты о стоп-условиях прямо в Telegram с ретраями.
Эволюция продукта
За пять месяцев продукт пережил несколько осознанных пивотов: квант-деск → трекинг инвестидей → ежедневный дайджест → экспертный разбор → недельный журнал + портфельный стол (текущая форма). Легаси-маршруты отдают 410 Gone вместо редиректов, чтобы не ловить soft-404 в поисковиках; контент сохранён в БД, код — в истории git. Каждая итерация — вывод из реального использования, а не догадка: текущая форма — та, в которой ценность (регулярный качественный выпуск + проверяемые результаты) подтверждается фактом.
Стек
| Слой | Технологии |
|---|---|
| Frontend / SSR | Next.js 14 (App Router), React 18, TypeScript, Tailwind v4, shadcn/ui, SSG + ISR |
| Данные | PostgreSQL + Prisma (миграции, seed), Redis |
| Очереди и расписание | BullMQ, repeatable jobs, cron-планировщик с чисткой stale-ключей |
| ИИ | OpenRouter (мультиагентная оркестрация, zod-контракты, аудит вызовов), Perplexity Sonar, image-модели |
| Рыночные данные | MOEX ISS (батчи, dirty-цены ОФЗ, лоты, индекс), Twelve Data |
| Безопасность | NextAuth v5, bcrypt, rate-limit на Redis, zod-валидация env |
| Дистрибуция / SEO | Telegram Bot API (2 канала), RSS 2.0, Google News sitemap, IndexNow, JSON-LD |
| Инфраструктура | nginx + TLS, systemd × 2, Docker (PostgreSQL, Redis), pino-логи |
| Качество | vitest — 180 юнит-тестов на чистое ядро, tsc --noEmit, детерминированный комплаенс-гард |
Что этот проект демонстрирует
- Продуктовое мышление: пять итераций формы продукта по данным реального использования, честное позиционирование вместо обещаний доходности.
- Оркестрация ИИ в продакшене: мультиагентный конвейер с ролевыми моделями, контрактной валидацией, критиком, полным аудитом стоимости и версионированием промптов.
- Инженерную зрелость там, где ИИ касается денег: детерминированное ядро с 180 юнит-тестами между «мнением модели» и реальными торговыми инструкциями.
- Системную интеграцию: живые данные Московской биржи с батч-оптимизациями, dirty-ценами ОФЗ, купонами и лотовым сайзингом.
- Надёжную эксплуатацию: идемпотентные процессы, graceful degradation, дисциплина деплоя, наблюдаемость, автономная работа без ручного вмешательства.
Инвесторум — это не демо и не pet-проект с заглушками: это работающий продукт с реальными данными, реальными деньгами в модельном портфеле и инженерными решениями, принятыми так, как я их принял бы в команде над бизнес-критичной системой.