Разработка ИИ-помощника для инвестиций на российском фондовом рынке

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

1. Сбор и подготовка данных: API Московской биржи (MOEX) и парсинг финансовых новостей

Сбор и подготовка данных: API Московской биржи (MOEX) и парсинг финансовых новостей

Добро пожаловать в курс по разработке ИИ-помощника для инвестиций! Вы поставили амбициозную цель: создать инструмент, который поможет анализировать российский фондовый рынок. Любой искусственный интеллект, будь то простая регрессия или сложная нейросеть, нуждается в «топливе». Этим топливом являются данные.

В этой первой статье мы разберем фундамент вашего будущего проекта: откуда брать котировки акций (Сбербанк, Газпром, Лукойл и др.), как автоматически собирать новости, влияющие на рынок, и как привести эти данные в вид, понятный машине.

Общий план разработки ИИ-помощника

Прежде чем писать код, давайте сформируем дорожную карту всего проекта. Чтобы создать полноценного помощника, нам предстоит пройти следующие этапы:

  • Сбор данных (Data Collection): Получение исторических цен, объемов торгов и новостного фона. (Тема этой статьи).
  • Хранение данных (Storage): Организация базы данных для быстрого доступа.
  • Анализ и обработка (Feature Engineering): Превращение «сырых» данных в полезные индикаторы (RSI, MACD, тональность текста).
  • Моделирование (AI/ML): Обучение модели предсказывать движение цены или классифицировать тренд.
  • Интерфейс и бэктестинг: Создание бота (например, в Telegram) и проверка стратегии на истории.
  • Сегодня мы фокусируемся на пункте №1.

    !Схема архитектуры сбора данных: от источников через скрипты Python в базу данных

    Часть 1. Получение рыночных данных: MOEX ISS API

    Для работы с российским рынком лучшим источником является сама Московская биржа (MOEX). У биржи есть отличный информационно-статистический сервер (ISS), который предоставляет программный интерфейс (API).

    Почему MOEX ISS?

    * Официальный источник: Данные приходят напрямую от первоисточника. * Бесплатно: Исторические данные и данные с задержкой (15 минут) доступны бесплатно без регистрации. * Документировано: Существует официальная документация и готовые библиотеки.

    Как это работает?

    API работает через HTTP-запросы. Вы отправляете запрос по определенному URL, а сервер возвращает вам данные в формате JSON, XML или CSV. Структура запроса выглядит так:

    https://iss.moex.com/iss/engines/[рынок]/markets/[секция]/boards/[режим]/securities/[тикер]/candles

    Где: * engines/stock — фондовый рынок. * markets/shares — акции. * boards/TQBR — основной режим торгов (Т+). * securities/SBER — тикер инструмента (например, Сбербанк).

    Инструменты Python

    Для работы нам понадобятся библиотеки requests (для запросов) и pandas (для работы с таблицами). Также существует удобная обертка apimoex.

    Установим необходимые библиотеки:

    Пример кода: Скачивание истории котировок

    Напишем скрипт, который скачивает дневные свечи акций Сбербанка за последний год.

    В результате вы получите таблицу (DataFrame), где каждая строка — это один торговый день. Это и есть наши структурированные данные.

    Часть 2. Парсинг финансовых новостей

    Цена акции — это не просто число. Это отражение ожиданий инвесторов, на которые влияют новости. Отчеты компаний, геополитика, изменения ключевой ставки — всё это двигает рынок.

    Для ИИ-помощника нам нужно научиться собирать текстовые данные. Это называется парсинг (или скрапинг).

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

  • Новостные агрегаторы: Investing.com, RBC, Interfax.
  • Telegram-каналы: Один из самых оперативных источников информации в РФ.
  • Официальные сайты компаний: Разделы «Для инвесторов».
  • Технические нюансы и этика

    > Парсинг сайтов находится в «серой» зоне. Всегда проверяйте файл robots.txt на сайте (например, site.ru/robots.txt), чтобы узнать, разрешает ли владелец автоматический сбор данных.

    Для начала мы будем использовать библиотеку BeautifulSoup для разбора HTML-кода страниц.

    Пример кода: Простой парсер заголовков

    Представим, что мы хотим собрать заголовки с условного новостного сайта.

    Для более сложных задач (например, парсинг Telegram) лучше использовать официальные API мессенджера через библиотеки Telethon или Pyrogram, так как обычный парсинг там не сработает.

    Часть 3. Подготовка данных (Preprocessing)

    Сырые данные нельзя сразу подавать в нейросеть. Их нужно очистить и нормализовать.

    1. Очистка данных

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

    * Заполнение пропусков: Если нет цены за выходной, можно продублировать цену пятницы. * Удаление дубликатов: Новости могут повторяться в разных источниках.

    2. Логарифмическая доходность

    Для ИИ-моделей абсолютная цена (например, 250 рублей за акцию) менее важна, чем её относительное изменение. Акция, выросшая с 10 до 11 рублей, показала такой же результат (+10%), как и акция, выросшая со 100 до 110. Чтобы уравнять эти масштабы, используют логарифмическую доходность.

    Формула логарифмической доходности:

    Где: * — логарифмическая доходность в момент времени . * — натуральный логарифм. * — цена закрытия в текущий момент времени. * — цена закрытия в предыдущий момент времени.

    Использование логарифмов делает распределение данных более похожим на нормальное (гауссово), что упрощает обучение моделей.

    3. Нормализация (Min-Max Scaling)

    Нейросети плохо работают с большими числами (например, объем торгов может быть в миллиардах). Нам нужно привести все данные к диапазону от 0 до 1.

    Формула нормализации:

    Где: * — нормализованное значение (от 0 до 1). * — исходное значение. * — минимальное значение во всей выборке данных. * — максимальное значение во всей выборке данных.

    !Визуализация процесса нормализации данных: приведение значений к единому масштабу

    Резюме

    Мы сделали первый шаг к созданию ИИ-помощника:

  • Изучили MOEX ISS API для получения точных рыночных данных.
  • Рассмотрели основы парсинга новостей для анализа сентимента.
  • Познакомились с математическими методами предобработки (логарифмическая доходность и нормализация).
  • В следующей статье мы разберем, как эффективно хранить эти данные, спроектируем базу данных и настроим автоматическое обновление нашего архива.

    2. Анализ данных: технические индикаторы и применение NLP для оценки настроений рынка

    Анализ данных: технические индикаторы и применение NLP для оценки настроений рынка

    Приветствую вас на втором этапе нашего курса! В прошлой статье мы научились собирать «сырую нефть» для нашего ИИ — исторические котировки с Московской биржи и тексты финансовых новостей. Однако, как сырая нефть не подходит для заправки автомобиля, так и необработанные данные бесполезны для нейросети.

    Сегодня мы займемся Feature Engineering (конструированием признаков). Мы превратим сухие цифры и хаотичный текст в мощные сигналы, которые помогут модели понимать, что происходит на рынке.

    Часть 1. Технический анализ: язык цифр

    Для трейдера график — это кардиограмма рынка. Чтобы ИИ мог «читать» этот график, нам нужно рассчитать технические индикаторы. Это математические преобразования цены и объема, которые подсвечивают тренды, волатильность и моменты разворота.

    Мы разберем три фундаментальных индикатора, которые станут отличным базисом для вашей модели.

    1. Скользящая средняя (Simple Moving Average — SMA)

    Цена акции часто «шумит» — совершает хаотичные движения вверх-вниз. Скользящая средняя сглаживает эти колебания, показывая истинное направление тренда.

    Формула простой скользящей средней:

    Где: * — значение простой скользящей средней за период . * — количество периодов (дней), за которые мы усредняем цену (окно сглаживания). * — знак суммирования. * — цена закрытия в момент времени (текущая цена, вчерашняя, позавчерашняя и т.д.).

    Если текущая цена выше SMA, это часто интерпретируется как восходящий тренд («бычий» сигнал). Если ниже — нисходящий («медвежий»).

    !Пример сглаживания ценового шума с помощью SMA

    2. Индекс относительной силы (RSI)

    RSI (Relative Strength Index) — это осциллятор, который показывает, не перегрет ли рынок. Он изменяется от 0 до 100.

    * RSI > 70: Акция «перекуплена». Цена выросла слишком быстро, вероятна коррекция вниз. * RSI < 30: Акция «перепродана». Цена упала слишком сильно, возможен отскок вверх.

    Формула расчета RSI состоит из двух этапов. Сначала считаем относительную силу (RS):

    Где: * — относительная сила. * — сглаженная скользящая средняя. * — средний рост цены за дни, когда она росла. * — среднее падение цены за дни, когда она падала. * — период (стандартно 14 дней).

    Затем переводим это в индекс от 0 до 100:

    Где: * — итоговое значение индекса. * — значение относительной силы, полученное на предыдущем шаге.

    3. Схождение/расхождение скользящих средних (MACD)

    MACD — это индикатор, который следит за силой тренда. Он строится на разнице между «быстрой» (короткой) и «медленной» (длинной) экспоненциальными скользящими средними.

    Реализация на Python

    Для расчета индикаторов мы будем использовать библиотеку pandas. Представим, что у нас уже есть DataFrame df с колонкой CLOSE (цена закрытия).

    Теперь каждая строка наших данных содержит не только цену, но и контекст: перекуплена ли акция и каков среднесрочный тренд.

    Часть 2. NLP: Учим ИИ читать новости

    Рынок движим не только математикой, но и психологией. Новость «Газпром отменил дивиденды» обвалит акции мгновенно, даже если технические индикаторы кричали о росте. Чтобы учитывать это, нам нужен NLP (Natural Language Processing) — обработка естественного языка.

    Наша задача: превратить текст новости в числовую оценку — Sentiment Score (от -1 до 1, где -1 — негатив, 1 — позитив).

    Этап 1: Предобработка текста (Preprocessing)

    Тексты новостей «грязные». Перед анализом их нужно почистить.

  • Токенизация: Разбиение текста на отдельные слова (токены).
  • Удаление стоп-слов: Слова типа «и», «в», «на», «что» не несут смысла для оценки настроения, но создают шум.
  • Лемматизация: Приведение слов к начальной форме (например, «акциями», «акций», «акции» «акция»). Для русского языка отлично подходит библиотека pymorphy2 или natasha.
  • Этап 2: Анализ тональности (Sentiment Analysis)

    Существует два основных подхода:

    #### А. Словарный подход (Lexicon-based) У нас есть словарь слов с оценками (например: «прибыль» = +1, «убыток» = -1, «санкции» = -2). Мы просто суммируем баллы всех слов в новости.

    Плюсы:* Быстро, просто, понятно. Минусы:* Не понимает контекст (фраза «убытков не ожидается» будет оценена негативно из-за слова «убыток», хотя смысл позитивный).

    #### Б. Нейросетевой подход (Transformer-based) Использование предобученных моделей, таких как BERT или RuBERT. Эти модели читают предложение целиком и понимают контекст, сарказм и сложные конструкции.

    Для нашего курса мы используем готовую модель для русского языка из библиотеки dostoevsky или transformers (Hugging Face).

    !Процесс превращения текста новости в числовой коэффициент настроения

    Реализация на Python (используем Hugging Face)

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

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

    Часть 3. Объединение данных (Data Fusion)

    Теперь у нас есть две таблицы:

  • Рыночные данные: Дата, Цена, SMA, RSI.
  • Новости: Дата, Текст, Sentiment Score.
  • Главная проблема — синхронизация времени. * Биржа работает с 10:00 до 18:40 по будням. * Новости выходят круглосуточно и в выходные.

    Стратегия объединения

  • Агрегация новостей: Если за один день вышло 10 новостей, мы не можем создать 10 строк с одной и той же ценой закрытия. Нам нужно усреднить тональность за день.
  • Где: * — итоговый сентимент дня. * — количество новостей за день. * — сентимент -й новости. * — вес новости (опционально: важные новости можно учитывать с большим весом).

  • Сдвиг выходных: Новости, вышедшие в субботу и воскресенье, влияют на открытие торгов в понедельник. Поэтому сентимент выходных нужно суммировать с сентиментом понедельника (или утра понедельника).
  • Итоговый датасет

    После объединения ваш итоговый DataFrame для обучения модели будет выглядеть примерно так:

    | Date | Close | Volume | SMA_20 | RSI_14 | News_Sentiment_Avg | | :--- | :--- | :--- | :--- | :--- | :--- | | 2023-10-01 | 250.5 | 10M | 248.1 | 65.2 | 0.8 (Позитив) | | 2023-10-02 | 249.0 | 8M | 248.5 | 58.1 | -0.2 (Нейтрально/Негатив) |

    Именно эту таблицу мы будем «скармливать» нашей нейросети в следующих уроках.

    Резюме

    Мы сделали огромный шаг вперед:

  • Разобрали технические индикаторы (SMA, RSI), которые переводят движение цены на язык математики.
  • Познакомились с NLP и узнали, как извлекать настроение рынка из текста с помощью нейросетей.
  • Поняли, как объединить эти разнородные данные в единый массив.
  • Теперь у нашего ИИ есть «глаза» (технический анализ) и «уши» (анализ новостей). В следующей статье мы перейдем к самому интересному — созданию «мозга». Мы выберем архитектуру модели машинного обучения и попробуем сделать первое предсказание цены.

    3. Архитектура ИИ: выбор LLM, промпт-инжиниринг и построение RAG-системы для контекстных ответов

    Архитектура ИИ: выбор LLM, промпт-инжиниринг и построение RAG-системы для контекстных ответов

    Добро пожаловать на третий этап нашего курса! Мы уже проделали большую работу: научились собирать данные с Московской биржи и парсить новости (Статья 1), а также рассчитали технические индикаторы и научили компьютер определять тональность текста (Статья 2).

    Сейчас у нас есть «топливо» (данные) и «приборы» (индикаторы). Но у нас нет «пилота», который мог бы взглянуть на все это и принять решение. В этой статье мы создадим «мозг» нашего помощника. Мы разберем, как выбрать языковую модель (LLM), почему нельзя просто «скармливать» ей графики и как технология RAG поможет ИИ давать советы, основанные на актуальных фактах, а не на галлюцинациях.

    Часть 1. Выбор «мозга»: LLM для финансов

    Сердцем нашего помощника станет Large Language Model (LLM) — большая языковая модель. Однако не все модели одинаково полезны для анализа российского рынка.

    Проблема «замороженного времени»

    Главное ограничение любой LLM (будь то GPT-4, Claude или Llama) — она ничего не знает о сегодняшнем дне. Ее знания ограничены датой окончания обучения. Если вы спросите модель: «Стоит ли покупать Сбербанк сегодня?», она либо откажется отвечать, либо начнет фантазировать, опираясь на данные двухлетней давности.

    Критерии выбора модели

    Для нашего проекта важны три параметра:

  • Владение русским языком: Финансовая терминология специфична. Модель должна понимать разницу между «шортом» в одежде и на бирже.
  • Контекстное окно (Context Window): Нам нужно передавать модели много данных (историю цен, заголовки новостей). Чем больше окно, тем больше информации модель может «переварить» за один раз.
  • Приватность и доступность: Использование зарубежных API может быть затруднено оплатой или блокировками. Локальные модели или российские API надежнее.
  • Кандидаты

    * SaaS-решения (API): YandexGPT / GigaChat:* Отличное понимание русского контекста, официальный доступ в РФ. OpenAI (GPT-4o):* Эталонное качество, но требует обходных путей для оплаты и доступа. * Open Source (Локальные модели): Llama-3 (8B/70B):* Мощная модель от Meta. Существуют дообученные версии для русского языка (например, Saiga). Qwen 2.5:* Китайская модель, показывающая феноменальные результаты в математике и кодинге, хорошо работает с русским.

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

    Часть 2. RAG: Как дать модели актуальные знания

    Чтобы решить проблему устаревших знаний, мы используем архитектуру RAG (Retrieval-Augmented Generation) — генерацию, дополненную поиском.

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

    !Архитектура RAG: процесс обогащения запроса пользователя реальными рыночными данными перед отправкой в нейросеть

    Как это работает технически?

  • Запрос пользователя: «Что происходит с акциями Газпрома?»
  • Поиск (Retrieval): Скрипт идет в нашу базу (которую мы готовили в прошлых уроках), берет последние 30 свечей, значения RSI и последние 5 новостей по тикеру GAZP.
  • Генерация контекста: Мы превращаем эти цифры в текст.
  • Ответ (Generation): Мы отправляем LLM промпт: «Ты финансовый аналитик. Вот данные по Газпрому: цена 160, RSI 35, новости негативные. Ответь пользователю, что происходит».
  • Векторный поиск для новостей

    Если новостей тысячи, мы не можем передать их все. Нам нужно найти только те, которые релевантны текущей ситуации. Для этого используется косинусное сходство (Cosine Similarity). Мы превращаем текст запроса и тексты новостей в векторы (числовые массивы) и ищем наиболее близкие.

    Формула косинусного сходства:

    Где: * — мера сходства между вектором запроса и вектором новости (от -1 до 1). * — скалярное произведение векторов (сумма произведений соответствующих координат). * и — длины (евклидовы нормы) векторов и .

    Чем ближе значение к 1, тем больше новость соответствует теме запроса.

    Часть 3. Промпт-инжиниринг: Искусство управления ИИ

    Качество ответа зависит от качества промпта (инструкции). В финансовой сфере цена ошибки высока, поэтому мы используем структуру промпта, минимизирующую галлюцинации.

    Структура идеального финансового промпта

  • Роль (Persona): Задаем модель поведения.
  • Контекст (Context): Вставляем наши данные (DataFrame в виде текста).
  • Инструкция (Task): Что именно нужно сделать.
  • Ограничения (Constraints): Чего делать нельзя (например, «не давай прямых инвестиционных рекомендаций»).
  • Формат вывода (Output Format): Как должен выглядеть ответ.
  • Пример реализации на Python

    Предположим, у нас есть функция get_market_data(ticker), которая возвращает строку с данными из предыдущих уроков.

    Chain-of-Thought (Цепочка рассуждений)

    Чтобы улучшить логику модели, можно добавить в промпт требование: «Сначала распиши свои рассуждения шаг за шагом, а потом напиши итоговый вывод». Это техника называется Chain-of-Thought. Она заставляет модель «подумать» перед ответом, что снижает количество логических ошибок.

    Часть 4. Сборка системы

    Теперь объединим все компоненты в единый пайплайн.

    Шаг 1. Подготовка данных (Data Loader)

    Мы берем DataFrame из второй статьи, где у нас есть CLOSE, SMA_20, RSI_14 и News_Sentiment. Преобразуем последнюю строку (сегодняшний день) в читаемый текст.

    Шаг 2. Вызов LLM

    Используем любую доступную библиотеку (например, langchain или openai, gigachat).

    Результат

    Модель ответит примерно так: > «На основе предоставленных данных, акции Сбербанка торгуются по 250 руб., что выше скользящей средней (248 руб.), указывая на восходящий тренд. Однако RSI составляет 65, что близко к зоне перекупленности. Новостной фон умеренно позитивный (0.8). Вывод: Наблюдается бычий тренд, но возможна краткосрочная коррекция. Рекомендуется дождаться небольшого отката перед входом.»

    Это именно то, чего мы добивались! Ответ обоснован цифрами, учитывает новости и звучит профессионально.

    Резюме

    В этой статье мы построили архитектуру нашего ИИ-помощника:

  • Выбрали стратегию использования LLM (упор на русский язык и API).
  • Внедрили RAG, чтобы модель знала актуальные цены и новости, а не галлюцинировала.
  • Изучили Промпт-инжиниринг и создали шаблон, который превращает сухую статистику в аналитический отчет.
  • Теперь у нас есть полностью рабочий «движок». В следующей, заключительной статье курса, мы создадим пользовательский интерфейс (Telegram-бот), подключим нашу систему к реальному миру и проведем тестирование стратегии (бэктестинг).

    До встречи в финале!

    4. Разработка и деплой: создание бэкенда на Python и интеграция бота в мессенджеры

    Разработка и деплой: создание бэкенда на Python и интеграция бота в мессенджеры

    Поздравляю! Мы вышли на финишную прямую. В предыдущих статьях мы создали мощный фундамент: научились собирать данные с Московской биржи, анализировать их с помощью технических индикаторов и NLP, а также спроектировали «мозг» на базе LLM и RAG. Но пока что наш ИИ — это просто набор скриптов на вашем компьютере.

    В этой финальной статье мы превратим разрозненный код в полноценный продукт. Мы создадим бэкенд-архитектуру, «упакуем» нашего аналитика в удобный Telegram-бот и разберемся, как запустить это приложение на сервере так, чтобы оно работало 24/7.

    Архитектура приложения

    Прежде чем писать код, давайте представим, как компоненты будут взаимодействовать друг с другом. Нам нужно уйти от запуска скриптов вручную к событийно-ориентированной модели (Event-driven).

    !Диаграмма потоков данных: от запроса пользователя в Telegram до получения ответа от ИИ-аналитика

    Наш проект будет состоять из трех слоев:

  • Интерфейс (Presentation Layer): Telegram-бот, который принимает тикер акции (например, «SBER») и отправляет ответ.
  • Бизнес-логика (Service Layer): Тот самый код из прошлых уроков, который собирает данные, считает RSI и формирует промпт для LLM.
  • Инфраструктура (Infrastructure Layer): Docker-контейнер, который обеспечивает работу приложения в любой среде.
  • Часть 1. Сборка ядра (Core Logic)

    Для начала нам нужно объединить наработки из трех предыдущих статей в один класс. Назовем его InvestmentAssistant. Это будет «сердце» нашего бэкенда.

    Создадим файл core.py. В нем мы инкапсулируем всю логику получения данных и генерации ответа.

    Обратите внимание на ключевое слово async. Поскольку запросы к бирже и к LLM занимают время (сетевое ожидание), мы должны использовать асинхронность, чтобы бот не «зависал» для других пользователей, пока обрабатывает запрос одного.

    Часть 2. Создание Telegram-бота

    Telegram — идеальный интерфейс для финансовых помощников: он быстрый, мобильный и безопасный. Мы будем использовать библиотеку aiogram 3.x. Это современный, полностью асинхронный фреймворк.

    Установка зависимостей

    Регистрация бота

  • Найдите в Telegram бота @BotFather.
  • Напишите команду /newbot.
  • Придумайте имя и юзернейм (например, MyInvestAI_bot).
  • Получите API Token. Сохраните его, он понадобится нам прямо сейчас.
  • Настройка переменных окружения

    Никогда не храните пароли и токены прямо в коде! Это грубейшая ошибка безопасности. Используйте файл .env.

    Создайте файл .env в папке проекта:

    Код бота (main.py)

    Теперь напишем точку входа в приложение.

    Этот код создает бота, который слушает сообщения. Когда пользователь пишет «LKOH», бот передает это в InvestmentAssistant, ждет ответ от нейросети и пересылает его пользователю.

    Часть 3. Деплой: Docker и контейнеризация

    Ваш код работает на вашем ноутбуке. Но что, если вы захотите запустить его на сервере? Там может быть другая версия Python, другие библиотеки или другая операционная система. Чтобы избежать проблемы «на моем компьютере всё работало», мы используем Docker.

    Docker упаковывает ваше приложение и все его зависимости в изолированный контейнер. Это как виртуальная машина, только намного легче.

    Создание Dockerfile

    Создайте файл с именем Dockerfile (без расширения) в корне проекта:

    Не забудьте создать файл requirements.txt, перечислив там все библиотеки (aiogram, pandas, requests и т.д.).

    Запуск через Docker Compose

    Если в будущем вы захотите добавить базу данных (например, PostgreSQL для хранения истории запросов), вам понадобится оркестрация контейнеров. Для этого используется docker-compose.yml.

    Теперь, чтобы запустить вашего бота на любом сервере (будь то дешевый VPS за 200 рублей или мощный облачный кластер), достаточно двух команд:

    Часть 4. Оценка производительности и масштабирование

    При разработке бэкенда важно понимать, какую нагрузку он выдержит. В нашем случае узким местом (bottleneck) является не Python, а внешние API (MOEX и LLM).

    Предположим, запрос к LLM занимает 3 секунды. Если мы используем синхронный код, 10 пользователей заблокируют бота на 30 секунд. Асинхронный подход (async/await) позволяет обрабатывать их параллельно.

    Однако, у LLM есть лимиты (Rate Limits). Например, не более 3 запросов в секунду.

    Для расчета пропускной способности системы можно использовать простую формулу:

    Где: * — пропускная способность (запросов в секунду). * — среднее время обработки одного запроса (в секундах). * — количество параллельных воркеров (процессов).

    Если секунды, то один процесс может обработать всего 0.33 запроса в секунду. Чтобы обслуживать 100 пользователей одновременно, нам потребуется очередь задач (например, Celery или Redis) и масштабирование количества воркеров.

    !Иллюстрация работы очереди задач для распределения нагрузки

    Заключение курса

    Поздравляю! Вы прошли путь от идеи до работающего прототипа.

    Давайте вспомним, что мы сделали:

  • Данные: Научились добывать котировки и новости.
  • Анализ: Превратили хаос рынка в четкие индикаторы (RSI, SMA, Sentiment).
  • Интеллект: Внедрили RAG и LLM для генерации человеческих советов.
  • Продукт: Упаковали всё это в Telegram-бот и Docker-контейнер.
  • Что дальше? Мир финтеха огромен. Вы можете улучшить свой проект: * Добавить базу данных (PostgreSQL) для сохранения портфеля пользователя. * Настроить автоматические уведомления («Цена Сбера упала ниже 250, пора покупать!»). * Провести бэктестинг стратегии на исторических данных, чтобы проверить, приносит ли ваш ИИ прибыль.

    Теперь у вас есть все инструменты, чтобы стать разработчиком финансовых ИИ-сервисов. Удачи в инвестициях и кодинге!

    5. Бэктестинг стратегий, управление рисками и юридические нюансы финансовых советников в РФ

    Бэктестинг стратегий, управление рисками и юридические нюансы финансовых советников в РФ

    Поздравляю, вы добрались до финальной статьи нашего курса! Мы прошли долгий путь: научились собирать данные с Московской биржи, анализировать их с помощью NLP и технических индикаторов, создали «мозг» на базе LLM и упаковали всё это в Telegram-бота. Ваш ИИ-помощник готов к работе... технически.

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

  • Работает ли стратегия на истории (Бэктестинг)?
  • Как не потерять депозит при ошибке модели (Риск-менеджмент)?
  • Как не нарушить закон РФ, давая финансовые советы (Юридические аспекты)?
  • В этой статье мы превратим наш прототип в профессиональный инструмент, готовый к суровой реальности рынка.

    Часть 1. Бэктестинг: Машина времени для инвестора

    Бэктестинг (Backtesting) — это процесс проверки торговой стратегии на исторических данных. Мы «прогоняем» нашего бота через события прошлого (например, за 2022–2023 годы) и смотрим, сколько бы он заработал или потерял.

    Основные ловушки бэктестинга

    Многие новички получают красивые графики доходности на тестах, но теряют деньги в реальности. Причина — в методологических ошибках:

    * Заглядывание в будущее (Look-ahead Bias): Самая частая ошибка. Это происходит, когда модель использует данные, которые в момент принятия решения ещё не были известны. Например, использование цены закрытия дня (CLOSE) для принятия решения о покупке утром этого же дня. * Переобучение (Overfitting): Модель просто «запоминает» график прошлого, но не находит закономерности. На тесте доходность +100%, на новых данных — убыток. * Игнорирование комиссий: Биржа и брокер берут комиссию за каждую сделку (обычно 0.05% – 0.3%). При частой торговле это может «съесть» всю прибыль.

    !Схематичное изображение цикла тестирования стратегии на исторических данных

    Ключевые метрики эффективности

    Просто знать «итоговую прибыль» недостаточно. Важно понимать, какой ценой она получена. Для этого используют специальные коэффициенты.

    #### 1. Коэффициент Шарпа (Sharpe Ratio)

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

    Где: * — коэффициент Шарпа. * — доходность портфеля (стратегии) за период. * — безрисковая ставка (например, доходность ОФЗ или ставка по депозитам). * — стандартное отклонение доходности портфеля (мера волатильности/риска).

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

    #### 2. Максимальная просадка (Maximum Drawdown)

    Показывает максимальное падение счета от пика до дна в процентах. Это помогает понять психологический комфорт стратегии.

    Где: * — максимальная просадка. * — минимальная стоимость портфеля после пика. * — максимальная стоимость портфеля (локальный пик) перед падением.

    Часть 2. Управление рисками (Risk Management)

    Даже лучшие ИИ-модели ошибаются. Задача риск-менеджмента — сделать так, чтобы серия ошибок не обнулила ваш счет. В трейдинге выживание важнее прибыли.

    Правило 2%

    Золотой стандарт классического трейдинга: никогда не рискуйте более чем 1-2% от депозита в одной сделке.

    Это не значит, что вы покупаете акции только на 2% от денег. Это значит, что если сработает стоп-лосс (ограничитель убытков), вы потеряете не более 2% от всего капитала.

    Критерий Келли

    Для более продвинутого управления размером позиции можно использовать формулу Келли. Она подсказывает оптимальную долю капитала для ставки, если известна вероятность успеха.

    Где: — доля капитала, которую нужно вложить в сделку. * — коэффициент выигрыша (отношение средней прибыли к среднему убытку). * — вероятность выигрыша (точность модели, например, 0.6). * — вероятность проигрыша ().

    > В реальности трейдеры часто используют «половинный Келли» (делят результат формулы на 2), так как формула агрессивна и предполагает, что вы точно знаете свои вероятности, что на рынке невозможно.

    Stop-Loss и Take-Profit

    Ваш бот обязан выдавать не только сигнал «Покупать», но и уровни выхода:

  • Stop-Loss (Стоп-лосс): Цена, при которой мы признаем ошибку и продаем актив с убытком, чтобы не потерять больше.
  • Take-Profit (Тейк-профит): Цена, при которой мы фиксируем прибыль.
  • Для ИИ-бота уровни можно рассчитывать динамически, например, на основе волатильности (ATR — Average True Range).

    Часть 3. Юридические нюансы в РФ: Как не стать «инфоцыганом»

    Создавая публичного бота (даже бесплатного), вы вступаете на территорию, регулируемую Центральным Банком РФ (ЦБ РФ) и Федеральным законом № 397-ФЗ.

    Индивидуальная инвестиционная рекомендация (ИИР)

    По закону, давать индивидуальные инвестиционные рекомендации могут только профессиональные участники рынка ценных бумаг — инвестиционные советники, включенные в реестр ЦБ РФ.

    Что считается ИИР?

  • Адресность (совет дан конкретному человеку).
  • Конкретика (указан актив, цена, действие).
  • Связь с профилем клиента (совет учитывает риск-профиль человека).
  • Если ваш бот пишет пользователю «Иван, купи акции Газпрома сейчас на 50% портфеля» — это ИИР. Если у вас нет лицензии, это незаконная деятельность.

    Как работать легально без лицензии?

    Большинство сервисов работают в формате информационно-аналитических услуг. Чтобы оставаться в правовом поле, необходимо соблюдать правила:

  • Дисклеймер (Отказ от ответственности): В описании бота и в каждом сообщении (или в закрепленном меню) должно быть четко указано:
  • > «Информация не является индивидуальной инвестиционной рекомендацией. Данные предоставляются исключительно в ознакомительных целях. Пользователь несет полную ответственность за любые принятые инвестиционные решения».

  • Отсутствие персонализации: Бот должен анализировать рынок, а не портфель конкретного пользователя. Формулировки должны быть общими: «Технический анализ показывает вероятность роста», а не «Тебе нужно купить».
  • Прозрачность алгоритма: Вы не обещаете гарантированную доходность (это запрещено законом для всех). Вы предоставляете инструмент анализа.
  • Пример безопасного ответа бота

    Плохо (Риск штрафа): > «Покупай Сбербанк! Завтра вырастет на 5%. Гарантирую прибыль.»

    Хорошо (Легально): > «Анализ акций Сбербанка: Индикатор RSI указывает на перепроданность. Новостной фон позитивный. Исторически в таких ситуациях цена росла в 60% случаев. Не является ИИР.»

    Заключение курса

    Мы прошли огромный путь создания ИИ-помощника для российского фондового рынка. Давайте подведем итоги нашей архитектуры:

  • Сбор данных: MOEX API + парсинг новостей.
  • Анализ: Технические индикаторы + NLP (анализ тональности).
  • Ядро: RAG-система, объединяющая факты и мощь LLM.
  • Интерфейс: Telegram-бот на Python.
  • Безопасность: Бэктестинг стратегий и юридически грамотные формулировки.
  • Теперь у вас есть не просто код, а понимание полного цикла разработки FinTech-продукта. Рынок постоянно меняется, и ваш бот должен эволюционировать вместе с ним. Удачи в разработке и профита в инвестициях!