Read the book: «ИИ-аналитика для инвесторов и трейдеров»
ИИ-Аналитика
для инвесторов и трейдеров
Сергей Степанов
Введение
Финансовая информация становится полезной, когда из неё можно восстановить понятную связь между событием, показателями бизнеса и условиями инвестиционной гипотезы. Короткая новость о росте прибыли такой связи обычно не содержит. Нужно установить период сравнения, понять состав прибыли, проверить денежный поток и выяснить, какую часть результата рынок уже ожидал. У частного инвестора на это может уходить больше времени, чем на сам выбор инструмента.
Искусственный интеллект помогает сократить работу с текстом. Он может находить нужные примечания, извлекать показатели из подготовленных документов, группировать сообщения и создавать первый вариант кода. Однако скорость обработки не превращает найденную закономерность в доходную стратегию. Между краткой выжимкой и финансовым решением остаётся проверка: действительно ли данные относятся к одной компании, доступны ли они на нужную дату, правильно ли рассчитаны величины и можно ли было исполнить предполагаемую сделку.
Эта книга предназначена для частного инвестора, который работает с акциями Московской биржи или криптоактивами, и для аналитика, которому нужен воспроизводимый способ обработки документов. Для чтения финансовой части достаточно понимать, что акция представляет долю в бизнесе, а цена инструмента может изменяться. Термины бухгалтерского анализа вводятся по мере необходимости. В практической части используются простые скрипты Python; их устройство объясняется до того, как читателю предлагают изменить параметры.
В книге вы соберёте таблицу показателей из отчёта, подготовите короткую аналитическую записку, разметите русскоязычные новости и проверите простую торговую гипотезу. Для каждого результата показано, как обнаружить ошибку до его использования. Сначала выполните эти задачи вручную, затем автоматизируйте отдельные операции, сохраняя контроль над выводами. Исходный документ, извлечённые факты, расчёты, интерпретация и решение хранятся раздельно. Благодаря этому ошибку можно найти на конкретном шаге, а новый отчёт не заставляет начинать исследование заново.
Учебные компании и синтетические данные обозначены как условные. Наряду с ними разобраны исторические материалы Московской биржи, Сбербанка, Норникеля, Банка России и Ethereum. Даты этих материалов указаны в тексте: они служат примерами работы и не описывают текущую привлекательность активов. Приведённые параметры расходов, пороги классификации и правила стратегий служат примерами настройки. Их нельзя переносить в реальные сделки без проверки конкретного рынка, тарифа, доступности инструмента и собственного финансового положения.
Книга посвящена аналитике и исследованию, а не персональному подбору инвестиций. В ней нет обещаний доходности и сигналов на покупку конкретных активов. Возможность потерять деньги относится и к стратегиям, которые хорошо выглядят в историческом тесте. Поэтому практические задания сначала выполняются на учебных данных и в режиме наблюдения, без отправки заявок.
Сведения о стандартах отчётности и интерфейсах рассматриваются по состоянию на октябрь 2026 года. Конкретные сервисы могут менять ограничения и условия доступа. При смене сервиса сохраняйте исходные материалы и те же правила проверки. Хороший результат можно проверить независимо от того, какая модель подготовила первоначальный ответ.
Глава 1 Задачи искусственного интеллекта
Аналитическая задача начинается с вопроса
Запрос «проанализируй компанию» не определяет результат. Модель может написать обзор бизнеса, пересказать последние новости или составить список коэффициентов. Каждый вариант выглядит содержательным, но ни один не обязан отвечать на вопрос пользователя. До загрузки документов нужно сформулировать, какое неизвестное требуется уменьшить.
Для долгосрочного инвестора таким вопросом может быть способность бизнеса финансировать расширение из собственного денежного потока. Для владельца облигации — достаточность доступных средств перед ближайшими погашениями. Для трейдера — наличие измеримого эффекта после публикации определённого типа новости. Эти вопросы требуют разных документов, горизонтов и способов проверки. Одного универсального «анализа рынка» для них нет.
Условная компания сообщила, что выручка выросла на 18%. Инвестор хочет понять, означает ли это улучшение бизнеса. Сначала он поручает ИИ найти выручку текущего и сопоставимого периода. Затем отдельно просит извлечь объём продаж, изменение цен и сведения о приобретённых компаниях. Если рост связан преимущественно с покупкой другого предприятия, вывод об органическом расширении прежнего бизнеса делать нельзя. Краткая выжимка становится полезной только после разделения механизмов роста.
В хорошем задании указаны объект, период, материалы, требуемые поля и запрещённые допущения. Например: «Используй только приложенную промежуточную отчётность группы. Извлеки выручку за первое полугодие и сопоставимый период прошлого года. Сохрани единицы измерения. Если значение отсутствует, напиши “не найдено”. Не вычисляй третий квартал и не оценивай привлекательность акции». Такой запрос можно проверить по ограниченному числу строк.
Четыре вида работы
Извлечение переносит сведения из документа в установленную структуру. Здесь важна точность: число, подпись, период, валюта и место в документе. Суммаризация сокращает текст, сохраняя смысл и оговорки. Классификация относит сообщение к заранее определённой категории. Генерация создаёт новый материал: объяснение, промпт, код или сценарий.
Ошибка возникает, когда эти операции смешивают. Если при извлечении модель незаметно дополняет пропущенные значения, она уже генерирует предположения. Если в суммаризации превращает «возможно» в «произойдёт», она меняет степень уверенности. Если при классификации придумывает событие, которого нет в сообщении, она подменяет объект анализа. Поэтому для каждого этапа нужен отдельный договор о том, что считается допустимым выходом.
Языковая модель создаёт ответ по закономерностям текста и контексту запроса. Наличие убедительных формулировок не означает, что она прочитала актуальную отчётность. Без предоставленного документа или проверяемого доступа к нему нельзя считать названные цифры извлечёнными фактами. Особенно это касается свежих публикаций, редких эмитентов и изменений после даты обучения модели.
Для арифметики лучше использовать калькулятор или скрипт. Модель может объяснить формулу и помочь написать проверку, но итоговый коэффициент должен рассчитываться из сохранённых чисел. Проверьте число до того, как просить модель объяснить его.
Рабочая карточка исследования
Перед началом составьте короткую карточку: что исследуется, на какую дату, с каким горизонтом, каким исходом будет завершён первый проход. Допустим, задача состоит в сравнении долговой нагрузки двух промышленных компаний. Результатом первого прохода будет не рекомендация купить одну из них, а согласованная таблица долга, денежных средств, сроков погашения и ограничений по доступности денег.
Отдельно укажите, что способно опровергнуть первоначальную гипотезу. Если предположение звучит как «денежного потока достаточно для погашений», опровержением могут стать крупные обязательные инвестиции, ограниченные денежные средства или сокращение кредитных линий. Такая запись направляет поиск на слабые места, а не только на удобные подтверждения.
Как выбрать первую задачу для автоматизации
Выберите повторяющуюся операцию и проверьте один стандартный запрос на небольшой выборке. Сложная настройка ради единственного документа может занять больше времени, чем ручное чтение.
Глава 2 Данные и время доступности
Дата показателя и дата знания
В отчётности за первое полугодие отражены события до конца июня, но сам документ может быть опубликован значительно позже. На торговой дате между окончанием периода и публикацией инвестор ещё не мог использовать эти сведения. Для исторического исследования поэтому недостаточно даты финансового периода. Нужна дата и, по возможности, время первого доступного раскрытия.
В рабочей базе полезно хранить четыре момента: окончание периода, публикацию, собственную загрузку и начало допустимого использования. Последний момент учитывает техническую задержку обработки. Если сообщение вышло после закрытия выбранной торговой сессии, стратегия на дневных данных не должна совершать сделку по цене закрытия этой же сессии.
Условный отчёт за полугодие опубликован в 19:20. Предыдущая строка дневных котировок завершилась в 18:50. Присоединение отчёта к этой строке делает будущую информацию доступной раньше публикации. Правильное решение зависит от реального расписания рынка и режима торгов. В учебной модели можно заранее установить правило: сведения используются с открытия следующей доступной сессии после заданной задержки. Это консервативное допущение, а не описание всех возможных торговых режимов.
Первичный документ и производный материал
Пресс-релиз облегчает знакомство с результатами, но выбирает показатели и объяснения с позиции компании. Бухгалтерская отчётность содержит более широкий набор величин и примечаний. Новость пересказывает часть релиза. Сообщение в Telegram может пересказывать уже новость. Если четыре публикации восходят к одному документу, независимых подтверждений не становится четыре.
Для каждого материала запишите происхождение. Достаточно полей «кто опубликовал», «что является первоисточником», «когда появился исходный текст» и «есть ли изменения». Это позволяет отделить новое событие от распространения старого. Различие особенно существенно при измерении количества новостей: волна копий может увеличить видимость темы без появления новых фактов.
При работе с компаниями используйте устойчивые идентификаторы. Название группы, юридического лица и биржевой тикер могут отличаться. Тикер тоже нельзя считать вечным идентификатором без проверки истории. Для криптоактива одного символа недостаточно: одинаковые обозначения могут существовать в разных сетях. В базе требуется сеть и идентификатор контракта либо точное описание нативного актива.
Исходный слой должен сохраняться
Не редактируйте единственную копию полученного файла. Сохраните оригинал и отдельную обработанную версию. К оригиналу добавьте дату получения и контрольную сумму. Контрольная сумма — короткое значение, вычисленное из байтов файла; изменение хотя бы части содержимого обычно приводит к другому результату. Она помогает заметить подмену версии, но сама по себе не подтверждает истинность документа.
Обработанная версия может содержать текст после распознавания, таблицы в CSV и очищенные сообщения. Связь с оригиналом сохраняется через идентификатор документа и номер страницы. Тогда неправильное число можно исправить в извлечении, не теряя материал, из которого оно возникло.
Если компания выпустила исправленную отчётность, обе версии имеют аналитический смысл. Для текущего анализа обычно нужна последняя корректная версия. Для исторического теста нужна та информация, которая была доступна на соответствующую дату. Подстановка поздней корректировки в прошлое улучшает качество данных для учёта, но может искажать оценку торговой стратегии.
Пропуски тоже являются данными
Пустое поле бывает следствием отсутствия раскрытия, ошибки распознавания, ограничения доступа или несовместимости определения. Эти причины требуют разных действий. Объединение их в ноль меняет экономический смысл таблицы. Нулевая выручка и неизвестная выручка — разные состояния.
Используйте значение «не найдено» и отдельный код причины. Например: «документ отсутствует», «строка не раскрыта», «нужна ручная проверка». Для расчёта коэффициента с отсутствующим знаменателем результат также отсутствует. Модель не должна заменять его «примерной отраслевой величиной», если задача не предусматривает явно маркированную оценку.
В истории цен пропущенный день может означать выходной, остановку торгов или потерю выгрузки. Автоматическое заполнение предыдущей ценой допустимо для некоторых оценок стоимости портфеля, но создаёт вымышленные возможности исполнения. Поэтому исходные наблюдения и заполненный ряд хранят отдельно, а правило заполнения записывают.
Минимальный словарь полей
Для финансовых показателей сохраните: объект, стандарт, периметр, период начала и окончания, тип величины, название строки, значение, единицу, валюту, страницу и время доступности. Тип величины различает поток за период и остаток на дату. Для новостей добавьте автора, время сообщения, время исходного события, редактирование, связь с копиями и статус подтверждения.
Не все поля придётся сразу автоматизировать. Но их смысл нужно определить заранее. Если в одном файле «долг» включает аренду, а в другом нет, одинаковые названия колонок не делают наблюдения сопоставимыми. Качество аналитики зависит от определений ещё до того, как появляются сложные модели.
Глава 3 Подготовка отчёта для анализа
Проверка документа перед загрузкой
Откройте файл и посмотрите титульный лист, состав отчётности и страницы с ключевыми формами. Установите, кто отчитывается, за какой период, в каких единицах и входит ли документ в полный комплект. Имя файла не является достаточным основанием: файл с названием «результаты за квартал» может содержать презентацию с выборочными величинами.
Проверьте, выделяется ли текст мышью. Если выделяется, PDF обычно содержит текстовый слой, но таблицы всё равно могут извлекаться неверно. Если страница представляет изображение, требуется распознавание текста. OCR — технология превращения изображения букв и цифр в машиночитаемые символы. Она ускоряет подготовку, но не устраняет необходимость проверки чисел.
Сначала обработайте две разные страницы: обычный текст и таблицу. Сравните результат с изображением. Если распознавание путает скобки, десятичные разделители или колонки, не отправляйте весь документ в следующий этап без коррекции. Сто ошибочных страниц обходятся дороже, чем ранняя проверка двух.
Почему таблицы особенно уязвимы
На странице числа организованы пространственно. При переводе в обычный текст расположение может исчезнуть. Значения текущего периода становятся рядом со значениями прошлого, а подписи переносятся в другую строку. Модель способна построить убедительную таблицу из такого текста, но уверенность ответа не восстанавливает потерянную геометрию.
Типичные ошибки: отрицательное число в скобках становится положительным; пробел внутри разряда воспринимается как разделитель двух значений; пустая ячейка заполняется числом из соседней колонки; строка «в том числе» принимается за независимую сумму. В финансовом анализе каждая из этих ошибок способна изменить вывод.
Используйте несколько каналов проверки. Текстовый слой помогает находить нужную строку. Изображение страницы показывает фактическое расположение. Арифметическая сверка обнаруживает несходящиеся итоги. Ни один канал отдельно не достаточен: правильно сходящаяся сумма может быть перенесена целиком из другой колонки.
Дробление без потери контекста
Длинный документ делят на фрагменты, чтобы система могла работать с ним в пределах доступного контекста. Контекст — объём материала, доступного модели при конкретном ответе. Размер зависит от сервиса и модели. Возможность загрузить большой файл не означает, что каждая его строка одинаково доступна в каждом запросе.
Фрагмент должен включать заголовок раздела, единицы измерения и пояснения к таблице. Если таблица продолжается на следующей странице, обе части связывают. Разрезать её посередине и анализировать части независимо опасно: пояснение к знаку или периоду может оказаться только в первой части.
Для примечаний полезно дробление по смысловым разделам: долг, сегменты, связанные стороны, обязательства. Небольшое перекрытие соседних фрагментов помогает сохранить предложение на границе. Затем при объединении результатов необходимо удалять дубликаты, иначе повторённое число может быть учтено дважды.
Двухпроходное извлечение
Первый проход составляет карту документа: страницы основных форм и примечаний, единицы, даты, признаки консолидации. Второй извлекает конкретные значения из выбранных страниц. Такая схема уменьшает количество материала, который надо проверять при одном запросе.
Промпт первого прохода может звучать так: «Определи назначение документа и страницы, на которых находятся отчёт о финансовом положении, отчёт о прибыли, денежные потоки и примечания о долге. Не извлекай показатели. Если название раздела неоднозначно, сохрани его дословно». Результат проверяют просмотром перечисленных страниц.
Во втором проходе задают схему полей. «Для каждой величины укажи дословную подпись, значение, колонку периода, единицу и страницу. Не объединяй строки. Не пересчитывай миллионы в миллиарды. Не подставляй данные из другого документа». После проверки исходных значений их можно нормализовать отдельным скриптом.
Контроль качества распознавания
Выберите критические показатели заранее: например, выручку, чистую прибыль, денежные средства, долг и операционный денежный поток. Сверьте каждое значение с изображением. Затем проверьте несколько некритических строк случайным образом. Выбор только хорошо распознанных страниц создаёт ложную оценку качества.
Если на выборке найдена систематическая ошибка знака, исправьте правило извлечения для всего документа. Если ошибка единичная и причина понятна, сохраните ручную корректировку с пояснением. Исправленное значение не должно выглядеть как первичное: отметка о корректировке нужна для последующего воспроизведения.
Установите предел автоматического доверия. Например, система может подготовить сводку, но при неустановленной единице или смешанных колонках обязана остановиться и вернуть список вопросов. Это полезнее, чем любой ценой заполненная таблица. Прекращение обработки при противоречии сохраняет возможность найти причину до расчётов.
От PDF к запросу для модели
Для первого опыта возьмите один отчёт с выделяемым текстом. Сохраните исходный PDF в папку input, не меняя его содержание. Подготовьте рядом текстовую копию, в которой видны границы страниц. Номер страницы PDF и напечатанный номер внутри отчёта могут различаться; в практикуме используется номер страницы файла, начиная с единицы.
Скрипт scripts/14_pdf_text.py создаёт такую копию. Его удобнее запускать после настройки Python в главе 17. Дополнительная зависимость устанавливается командой python -m pip install pymupdf. Затем сохраните следующий листинг.
from pathlib import Path
import sys
import pymupdf
source = Path(sys.argv[1])
target = Path(sys.argv[2])
parts = []
with pymupdf.open(source) as document:
for index, page in enumerate(document, start=1):
text = page.get_text('text', sort=True).strip()
if not text:
raise ValueError(f'Page {index} needs OCR or inspection')
parts.append(f'[PDF_PAGE {index}]\n{text}')
target.parent.mkdir(parents=True, exist_ok=True)
target.write_text('\n\n'.join(parts), encoding='utf-8')
print('Pages:', len(parts), 'Output:', target)
Пример команды: python scripts/14_pdf_text.py input/report.pdf input/report.txt. Скрипт открывает локальный файл и не отправляет его в интернет. Пустая страница останавливает обработку: это может быть скан, титульный лист без текстового слоя или другая страница, требующая просмотра. Он не выполняет OCR. Если пустая страница действительно не содержит нужных данных, подготовьте проверенную текстовую копию вручную и явно отметьте пропуск.
Сортировка текста помогает приблизить порядок чтения к расположению на странице, но не восстанавливает сложную таблицу. Сверьте в PDF заголовки колонок, скобки вокруг отрицательных значений и единицы измерения. При нарушении порядка приложите модели изображение нужной страницы. Текстовую копию используйте для поиска, изображение — для подтверждения спорного значения.
Не отправляйте большой PDF с просьбой немедленно написать вывод. Сначала получите карту разделов, затем извлеките нужные строки. В главе 20 показано, как сохранить ответ в JSON и проверить его скриптом. Так из одного и того же отчёта можно получить одинаковую структуру данных даже после смены модели.