В 2021 году мир инвестиций перевернуло с ног на голову небольшое сообщество внутридневных трейдеров, известное миру как r/WallStreetBets. Они взяли на себя инвестиционных акул, коллективно стреляя в такие акции, как Gamestop и, в конечном итоге, AMC. Событие было достаточно большим, чтобы вскружить головы политикам, повлиять на первую рекламу Super Bowl на Reddit и вдохновить мелкого инвестора на видение будущего. Это зрелище, которого мы никогда раньше не видели, и нам интересно, произойдет ли оно снова. Одним из основных выводов является то, что количество глаз, наблюдающих за сабреддитом и фондовой биржей, выросло как минимум в десять раз.

Это заставило меня задуматься о влиянии социальных сетей на фондовый рынок. Есть ли корреляция с фондовым рынком и активностью на r/WallStreetBets?

Как обычно, мы собираемся исследовать это с помощью машинного обучения.

Какие данные здесь можно использовать?

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

Внизу находится бессерверная платформа данных в режиме реального времени. У них есть наборы данных, охватывающие популярные посты Reddit, блокчейн Ethereum и, самое главное, аналитику r/WallStreetBets. Для этого эксперимента я буду использовать набор данных упоминаний биржевых символов в сообщениях.

Alpha Vantage – это удобный для разработчиков API, предоставляющий данные финансового рынка. Его можно использовать для получения исторической информации о различных ценах на акции, торгуемые на бирже. См. пример ниже для акций Tesla (TSLA).

Соединение точек

Как я упоминал ранее, у Beneath есть данные об упоминании акций в сабреддите r/WallStreetBets. Этот набор данных конкретно относится к сообщениям верхнего уровня, а не к комментариям к сообщению. Некоторые другие предоставленные данные включают количество упоминаний биржевых символов, найденных в заголовке, время публикации сообщения и длину тела сообщения, среди других характеристик. Кстати говоря, вот топ-50 акций, упомянутых в сообщениях r/WallStreetBets:

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

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

Однако, прежде чем мы продолжим, я должен сделать признание и внести небольшую поправку — я не фондовый аналитик (и мои блоги не должны восприниматься как финансовые советы!) и не сразу заметил, что Alpha Vantage предоставляет нескорректированные биржевые данные на уровне бесплатного пользования. Это означает, что API будет показывать цены, по которым акции фактически не торговались. Например, если выполняется эта последовательность кода:

from alpha_vantage.timeseries import TimeSeries
ts = TimeSeries(key=key, output_format='pandas') # key is an API key
nvda, _ = ts.get_daily(symbol='NVDA', outputsize='full')
nvda.loc['2021-01-14']

Что возвращает, так это то, что акции NVIDIA торгуются между 527,22 и 543,99 долларов в день, тогда как на момент написания исторического максимума фактически ближе к 325,85 долларов. Короче говоря, со временем это приводит к расхождениям, которые делают данные менее точными для алгоритма машинного обучения.

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

  1. Получите среднедневную цену за каждый день, когда рынок был открыт:
    (максимум + минимум) / 2.
  2. Получите среднемесячную цену, усредняя дневные средние значения за месяц.
  3. Сравните среднемесячное значение одного месяца со среднемесячным значением следующего месяца. Есть ли увеличение или уменьшение?
  4. Увеличение преобразует точку данных в +1, а уменьшение - в -1. Теперь у нас есть метки классов! Мы сопоставим акции и дату, чтобы добавить метки к данным Reddit.

Наш очищенный набор данных будет выглядеть так:

Вот список всех функций, которые у меня есть:

  • num_mentions_title:сколько раз символы акций упоминаются в заголовке сообщения.
  • num_mentions_body:сколько символов акций упоминается в тексте сообщения.
  • num_unique_symbols_title:количество уникальных символов в заголовке. Например, если в заголовке сообщения есть «GOOGL» и «AMZN», это значение будет равно 2.
  • num_unique_symbols_body:количество уникальных символов в теле сообщения.
  • length_title: длина символа заголовка.
  • length_body: длина тела символа.
  • num_unique_posts:количество сообщений, в которых хотя бы раз упоминается символ акции. Это достигается путем подсчета соответствующих строк из данного набора данных.

Подготовив это, давайте немного поговорим о применении машинного обучения.

Обучение на основе данных

Поскольку мы решаем проблему классификации, мы будем использовать удобное дерево с градиентным усилением. Это решение обусловлено надежностью алгоритма. См. этот отрывок из [1], на который я часто ссылаюсь, практикуя машинное обучение:

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

Если вы новичок в деревьях с градиентным усилением, они представляют собой разновидность дерева решений. Деревья решений — это изученные классификаторы (или регрессоры), которые делают прогноз на основе пороговых значений, полученных из обучающих данных. Например, цена акции может пойти вверх или вниз, и моя модель может сделать этот прогноз в зависимости от того, было ли в прошлом месяце более 300 упоминаний акции в сабреддите или менее 300 упоминаний в прошлом месяце. Для деревьев с усилением градиента мы сначала объединяем множество деревьев в случайный лес или набор деревьев решений, работающих вместе, чтобы сделать прогноз. Элемент «Gradient Boosted» подразумевает, что одно дерево учится у другого при обучении, а не деревья обучаются независимо и усредняют свои прогнозы.

Вот параметры, которые я изменю для создания разных моделей. Подробнее см. в документации scikit-learn:

  • learning_rate: изменяет вклад каждого дерева
  • n_estimators: количество этапов повышения или количество деревьев, из которых одно дерево может извлечь уроки.
  • max_depth: максимальная глубина дерева.
  • min_samples_split: минимальное количество выборок, необходимое для разделения узла (т. е. для ответвления от него сейчас).
  • min_samples_leaf: минимальное количество образцов, необходимое для конечного узла.
  • max_features: количество функций, которые следует учитывать при поиске наилучшего разделения.

При этом давайте на мгновение уменьшим масштаб и рассмотрим следующие шаги.

Метрики и настройка параметров

Мы возьмем данные, показанные выше, попытаемся подогнать к ним модель, наблюдать за производительностью и настраивать параметры, чтобы получить наилучшую производительность, насколько это возможно. Показателем производительности, который я использую, является кривая AUC-ROC. Вот фантастический пост от «Саранг Нархеде, подробно объясняющий метрику, но если у вас мало времени, он поможет нам отличить наши основные истинные значения от прогнозируемых значений, измеряя истинные положительные, ложноотрицательные, истинные отрицательные значения. , и ложные срабатывания наших прогнозов. Показатель AUC находится между 0 и 1, и, как правило, чем он выше, тем выше эффективность прогнозирования.

Для начала я буду обучать модель, используя только learning_rate=0,0001, n_estimators=10000 и max_depth=4. После обучения я буду использовать эту модель для прогнозирования как набора данных для обучения, так и набора данных для тестирования.

Train AUC: 0.513355592654424
Test AUC: 0.4996242753882487

Довольно низкие оценки! Оценка около 0,5 предполагает, что модель столь же эффективна, как и предположение о том, пойдет ли акция вверх или вниз. Уважаемый AUC не должен быть ниже, скажем, 0,65, чтобы иметь любую полезность. В идеале мы хотим прогнозировать с лучшим результатом выше 0,7. Но мы еще не закончили, давайте проверим все параметры, чтобы увидеть, существует ли наилучшая точка, которая улучшит AUC. Мы попытаемся найти наилучшее значение для каждого параметра, затем обучим окончательную модель и проверим ее производительность.

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

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

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

Вот что я установил для каждого параметра:

  • скорость_обучения = 0,5,
  • n_оценщиков = 200,
  • максимальная_глубина=3,
  • min_samples_split=0,1,
  • min_samples_leaf=0,2,
  • max_features=6

И результаты:

Train AUC: 0.6432344797435151
Test AUC: 0.5291709844559586

К сожалению, здесь мы не видим какого-либо значимого скачка в баллах. Я упоминал ранее, что мы можем достичь некоторого соответствия обучающим данным, но, увы, это не может быть преобразовано в данные тестирования. В контексте это означает, что мы можем смоделировать некоторые исторические события r/WallStreetBets, но мы не можем смоделировать их так, чтобы мы могли предсказать, как субреддит повлияет на будущее фондового рынка (ни криптовалюты). обмен, если на то пошло).

Мой последний трюк здесь заключался в более тщательном выборе обучающих данных. Упоминания акций Gamestop и AMC в сабреддите затмевают упоминания любых других акций, что делает их огромными выбросами, которые могут повлиять на интерпретацию модели для упоминаний любого другого символа акции. Тем не менее, даже после их удаления значительного увеличения показателя AUC по-прежнему не наблюдается:

Train AUC: 0.647909558084076
Test AUC: 0.5176788542312194

Является ли это неожиданностью?

Фондовый рынок находится под влиянием различных рыночных сил. Правила, политика, деятельность компании, текущие события и иногда натиск инвесторов YOLO в виде сабреддита. Никто не смог идеально смоделировать весь фондовый рынок (или, по крайней мере, если и смог, то никому об этом не сказал), и это в значительной степени включает в себя Интернет.

Тем не менее, надеюсь, вы читаете этот блог не в поисках подтверждения того, что вы вкладываете свои сбережения в r/WallStreetBets. Если да, то я слышал, что у них есть подсообщество для утешения тех, кто терпит убытки.

Заключение и следующие шаги

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

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

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

Если вы хотите просмотреть исходный код для этого эксперимента, вы можете проверить мой репозиторий Github. Он включает в себя некоторые вещи, о которых я здесь не говорил, такие как предварительная обработка данных и дополнительные методы настройки параметров.

Рекомендации

[1] А. К. Мюллер, С. Гвидо, Введение в машинное обучение с помощью Python: руководство для специалистов по данным. («О’Рейли Медиа, Инк.», 2016 г.)