Соавторы: Илинь Ван, Миксин Шен, Сандро Горини, Джеффри Лю

Введение

В современном мире социальные сети стали мощным инструментом, позволяющим людям высказывать свое мнение и делиться своими мыслями с миром. С появлением онлайн-платформ, таких как Twitter и Reddit, стало проще, чем когда-либо, выражать мнение о компаниях и их продуктах. Но какое влияние эти мнения оказывают на цены акций и результаты публично торгуемых компаний?

В этой статье мы намерены изучить влияние мнений, высказанных публично через Интернет, на цены акций и результаты публично торгуемых компаний. С этой целью мы будем применять Анализ настроений к новостным онлайн-статьям и сообщениям в Твиттере, чтобы определить общие настроения компании в различные моменты времени. Затем мы будем использовать эти настроения в качестве характеристик для прогнозирования поведения акций.

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

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

  • Первый набор данных представляет собой предварительно загруженный набор данных Twitter, содержащий 26 твитов, связанных с акциями Dow Jones, с диапазоном дат с января по сентябрь 2011 года.
  • Второй набор данных — это новостные статьи в Интернете, полученные с помощью NewsAPI, который обеспечивает легкий доступ к новостным статьям в Интернете со всего мира с помощью простого интерфейса REST. Данные, к которым у нас был доступ с использованием бесплатной учетной записи разработчика, относятся к периоду с марта по апрель 2023 года.
  • Исторические 5-летние (с апреля 2018 г. по апрель 2023 г.) цены акций были загружены из Yahoo Finance. Мы использовали цены акций, охватывающие упомянутые выше периоды времени твитов и новостей.

Предварительная обработка данных

Набор данных Твиттера

Набор данных Twitter — это большой набор твитов с более чем 470 тысячами строк, связанных с 26 различными акциями.

Мы рассмотрели следующие проблемы, связанные с набором данных Twitter:

  1. Удален неанглийский текст с использованием корпуса английских слов Natural Language Toolkit (nltk); и
  2. Количество подписчиков и друзей преобразовано в функции; и
  3. Использовали POS-теги (дополнительная информация ниже), чтобы лучше понять язык, используемый в твитах, и его отношение к фондовому рынку; и
  4. Включено общее количество слов и символов в качестве дополнительных функций для разработки более точных моделей прогнозирования цен на акции.

Набор данных новостей

Между тем, набор данных новостей содержит 225 тысяч элементов.

Мы рассмотрели следующие проблемы, связанные с набором данных NewsAPI:

  1. Идентифицировано подмножество уникальных и не подстрочных биржевых символов для фильтрации статей и извлечения наиболее распространенных (четырех) слов в качестве дополнительного критерия фильтрации;
  2. Применены слова-фильтры ко всем новостным статьям, извлеченным с ключевыми словами биржевых символов из списка кандидатов-фильтров на основе экспертной оценки;
  3. Исключены статьи с ключевыми словами C и V, поскольку они могут относиться к чему угодно, кроме Visa или Citigroup;
  4. Проанализированы наиболее распространенные заголовки, описания и содержание, чтобы выявить и потенциально исключить стандартные фразы или тексты, не относящиеся к ключевому слову.

Применяя эти методы, мы смогли убедиться, что наш анализ наборов данных NewsAPI и Twitter сосредоточен на релевантных данных и приводит к более точным прогнозам и выводам о влиянии общественного мнения на фондовый рынок.

Разработка функций

Ключевая особенность: настроение

Инструмент, который мы использовали для анализа тональности в Python, предоставляется пакетом Natural Language Toolkit (nltk), который использует подход на основе лексики для анализа тональности текста.

Мы создали экземпляр класса SentimentIntensityAnalyzer и используем его метод polarity_scores() для анализа тональности фрагмента текста.

Метод polarity_scores() возвращает словарь, содержащий четыре оценки: положительную оценку, отрицательную оценку, нейтральную оценку и составную оценку. Составная оценка — это нормализованная оценка, которая находится в диапазоне от -1 (наиболее негативная) до 1 (наиболее позитивная) и представляет собой общую оценку тональности для текста.

POS-теги

Тегирование POS — это процесс маркировки каждого слова в тексте в соответствии с его частью речи, такой как существительное, глагол, прилагательное или наречие. У нас есть nn_count, pr_count и т. д. в нашем наборе данных Twitter.

PageRank и количество подписчиков/друзей

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

То же самое с набором данных новостей.

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

Мы делаем следующие предположения:

  1. Источник и достоверность. Статьи из авторитетных источников, таких как финансовые новостные агентства, авторитетные инвестиционные компании и регулирующие органы, могут иметь больший вес, чем статьи из менее известных источников или социальных сетей.
  2. Статьи с большим количеством просмотров или перепостов могут указывать на то, что статья читается более широко и оказывает большее влияние на настроения участников рынка.

Хотя поисковые системы, такие как Google, напрямую не предоставляют ранжирование медиаисточников, мы все же можем косвенно собирать некоторую информацию, используя их API или выполняя пользовательские поисковые запросы.

API пользовательского поиска: Google предлагает RestAPI пользовательского поиска, который позволяет нам создавать настраиваемую поисковую систему и программно извлекать результаты поиска. Мы использовали этот API для запроса имен медиаисточников и получения количества результатов поиска, которые могут быть показателем популярности или важности источника.

Кроме того, мы использовали API, предоставленный RankAPI с бесплатной учетной записью, для извлечения рейтинга страниц Google наиболее распространенных новостных доменов в нашем наборе данных.

Обзор функций

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

  1. Stock: биржевой символ или аббревиатура, связанная с твитом.
  2. day: Дата публикации твита.
  3. followers_count: количество подписчиков пользователя, разместившего твит.
  4. friends_count: количество друзей (аккаунтов, на которые подписаны) пользователя, опубликовавшего твит.
  5. Word_Count: общее количество слов в тексте твита.
  6. Charac_Count: общее количество символов в тексте твита.
  7. Upper_Case_Count: количество символов верхнего регистра в тексте твита.
  8. nn_count: Количество существительных в тексте твита.
  9. pr_count: Количество местоимений в тексте твита.
  10. vb_count: количество глаголов в тексте твита.
  11. jj_count: количество прилагательных в тексте твита.
  12. uh_count: количество междометий в тексте твита.
  13. cd_count: количество количественных чисел в тексте твита.
  14. Compound: Суммарная оценка тональности, рассчитанная с помощью инструмента анализа тональности VADER (Valence Aware Dictionary and sEntiment Reasoner), которая варьируется от -1 (наиболее негативная) до +1 (наиболее позитивная). Эта оценка представляет собой общее настроение твита.

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

  1. keyword_is_symbol: флаг, указывающий, было ли ключевое слово для поиска символом акций или названием компании.
  2. title_score: тональность заголовка новостной статьи.
  3. description_score: тональность описания новостной статьи.
  4. content_score: оценка тональности фрагмента контента из новостной статьи.
  5. page_rank: оценка Google PageRank от RankAPI, которая указывает на важность веб-страницы на основе качества и количества ее внешних ссылок.
  6. has_page_rank: переменная индикатора, которая принимает значение true, если существует page_rank, и значение false в противном случае.
  7. google_query_result: количество результатов поиска для определенного корневого URL, возвращенных Google.
  8. has_google_query_result: переменная индикатора, которая принимает значение true, если google_query_result существует, и значение false в противном случае.

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

  1. Date: Дата записи данных запаса.
  2. Open: цена открытия акции в начале торгового дня.
  3. High: Самая высокая цена, по которой акции торговались в течение торгового дня.
  4. Low: самая низкая цена, по которой акции торговались в течение торгового дня.
  5. Close: Цена закрытия акции в конце торгового дня.
  6. Adj Close: скорректированная цена закрытия акции, учитывающая дивиденды, дробление акций и другие корпоративные действия, влияющие на цену акции.
  7. Volume: Общее количество акций, проданных в течение торгового дня.
  8. Ticker: уникальный символ акций или аббревиатура, обозначающая акции компании.
  9. trend_indicator_with_lag_1_bds: индикатор тренда, рассчитанный с задержкой в ​​один рабочий день. Эта функция представляет направление тренда акции (восходящий или нисходящий) на основе исторических ценовых данных.
  10. trend_indicator_with_lag_5_bds: индикатор тренда, рассчитанный с задержкой в ​​пять рабочих дней. Эта функция представляет направление тренда акции (восходящий или нисходящий) на основе исторических ценовых данных за более длительный период.
  11. Adj_Close_Perc: Процентное изменение скорректированной цены закрытия акции по сравнению с предыдущим торговым днем.

Обучение

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

  1. Логистическая регрессия

Логистическая регрессия — широко используемый алгоритм классификации, основанный на концепции вероятности. Он предсказывает вероятность события, моделируя взаимосвязь между входными функциями и бинарной целевой переменной.

Результаты для набора данных Twitter:

Accuracy (lag1): 55%
Accuracy (lag5): 56%

Результаты для набора данных новостей:

Accuracy (lag1): 40%
Accuracy (lag5): 51%

2. Логистическая регрессия с PCA

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

Результаты для набора данных Twitter:

Accuracy (lag1): 54%
Accuracy (lag5): 54% 

Результаты для набора данных новостей:

Accuracy (lag1): 40%
Accuracy (lag5): 51%

3. Случайный лес

Случайный лес — это метод ансамблевого обучения, который строит несколько деревьев решений и объединяет их результаты для получения более точного и стабильного прогноза. Агрегируя результаты отдельных деревьев, Random Forest может преодолеть ограничения отдельных деревьев решений, такие как переобучение и высокая дисперсия.

Есть несколько предостережений, которые следует учитывать в отношении моделей Random Forest, используемых в этом проекте. Первоначальный план предусматривал использование GridSearchCV для точной настройки гиперпараметров, таких как минимальное разделение выборки в каждом узле, общее количество деревьев и максимальная глубина дерева. Мы пытались запустить этот процесс тонкой настройки несколько раз, но столкнулись с проблемами из-за нехватки ресурсов личного ноутбука/ПК. Процесс обучения либо вызывал сбои, либо занимал слишком много времени.

В качестве резервного плана мы решили последовательно обучить несколько моделей случайного леса, каждая из которых имеет разные комбинации гиперпараметров. Из этих моделей была выбрана лучшая. Хотя этот подход обеспечил обход вычислительных ограничений, важно признать, что более комплексная настройка гиперпараметров с помощью GridSearchCV или других методов оптимизации могла бы привести к еще более высокой производительности модели.

Результаты для набора данных Twitter:

Accuracy (lag1): 75%
Accuracy (lag5): 79%

Результаты для набора данных новостей:

Accuracy (lag1): 66%
Accuracy (lag5): 51%

4. XGBoost

XGBoost, или Extreme Gradient Boosting, — это мощная и эффективная платформа повышения градиента, основанная на концепциях деревьев решений и повышения. Он последовательно создает ансамбль слабых учеников (обычно деревьев решений), где каждое новое дерево исправляет ошибки, допущенные предыдущими деревьями. XGBoost предлагает несколько преимуществ, таких как распараллеливание, регуляризация и обработка пропущенных значений, что делает его очень эффективным для широкого круга приложений.

Мы попытались использовать GridSearchCV для точной настройки гиперпараметров модели XGBoost, таких как max_depth, n_estimators, learning_rate и других. Однако из-за большого объема данных твитов и ограниченных вычислительных ресурсов, доступных в Colab, было невозможно справиться с такими обширными вычислениями. В результате GridSearchCV не удалось включить в процесс обучения модели для этого проекта.

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

Результаты для набора данных Twitter:

Accuracy (lag1): 52%
Accuracy (lag5): 58%

Результаты для набора данных новостей:

Accuracy (lag1): 43%
Accuracy (lag5): 50%

Краткое содержание

В этом проекте мы исследовали потенциал использования анализа настроений в твитах и ​​новостных статьях для прогнозирования тенденций цен на акции. Мы разделили наш проект на две части, сосредоточившись на разных источниках данных, чтобы определить, существует ли корреляция между общественным мнением и фондовыми тенденциями.

Набор данных твитов

Мы собрали более 470 тыс. твитов, связанных с 26 акциями, и применили четыре модели классификации (логистическая регрессия, логистическая регрессия с PCA, случайный лес и XGBoost) для прогнозирования тенденций акций на основе настроений и других соответствующих функций. Модели оценивались по точности, воспроизводимости и отзыву с использованием матриц путаницы для визуализации. Алгоритм Random Forest стал самым эффективным, достигнув точности 75% при задержке в один рабочий день и 79% при задержке в пять рабочих дней.

Набор данных новостей

Для набора новостных данных мы использовали аналогичный подход, применив те же четыре модели классификации к коллекции из 225 тыс. новостных статей. Модель Random Forest снова показала наилучшие результаты, достигнув точности 66% при задержке в один день и 51% при задержке в пять дней.

Анализ

Лучшая производительность алгоритма Random Forest для обоих наборов данных может быть связана с его способностью обрабатывать шум, сложность и определять важные функции для прогнозирования тенденций запасов. Набор данных Twitter превзошел набор данных новостей с точки зрения точности, что может быть результатом твитов, содержащих реакции в реальном времени и фиксирующих различные мнения. Кроме того, больший размер набора данных Twitter может способствовать более точным прогнозам.

Этот проект подчеркивает потенциал использования данных социальных сетей, таких как твиты и новостные статьи, для прогнозирования тенденций цен на акции. Однако наши выводы носят предварительный характер из-за ограниченных ресурсов для настройки гиперпараметров в моделях Random Forest и XGBoost. Для подтверждения этих выводов необходимы дальнейшие исследования более крупных и разнообразных наборов данных и более сложное обучение моделей с использованием нескольких графических процессоров.