Предсказание цен акций «мемов» на основе постов с r/WallStreetBets

Введение/Мотивация

Одно распространенное заблуждение о фондовом рынке состоит в том, что он предназначен для больших парней с Уолл-стрит, которые сидят в своих роскошных офисах в костюмах-тройках в красивых сверкающих офисных зданиях в финансовом районе Нью-Йорка. Поэтому, когда в 2021 году розничные трейдеры успешно обыграли GameStop (тикер: GME), обанкротившийся розничный магазин видеоигр, люди обрадовались. С помощью Интернета розничные трейдеры с форума Reddit r/WallStreetbets подняли цену GME с цены закрытия в 19,94 доллара 11 января до 347,51 доллара 19 января.

В то время как инвестиционные фирмы и хедж-фонды потеряли в общей сложности 10 миллиардов долларов на коротких позициях на GME, многие розничные трейдеры обналичили сотни и тысячи долларов благодаря лидеру коротких продаж Киту Гиллу (псевдоним Reddit «DeepFuckingValue»), увеличившему стоимость своей позиции с 53 000 долларов. до 48 миллионов долларов в разгар безумия. GME была не единственной акцией, на которую нацелены попытки короткого сжатия. Сеть кинотеатров AMC (AMC), Bed Bath and Beyond (BBBY) и даже Silver стали мишенью для коротких продаж на r/WallStreetBets.

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

  1. Скачать данные о ценах на акции GME
  2. Собрать сообщения, связанные с GME, с r/WallStreetBets
  3. Проведите анализ настроений по этим сообщениям.
  4. Сравните дневные настроения с движением цены акций
  5. Найдите наиболее важные функции, влияющие на цену акций
  6. Если была корреляция, используйте ML для прогнозирования будущих цен на основе сообщений Reddit.

Данные «Парсинг»

Получение биржевых данных было самой простой частью. Мы только что скачали CSV-файл с Yahoo с указанными датами. Файл CSV дал нам цены открытия и закрытия, среднюю дневную цену и объем сделок за каждый день. Не было необходимости обращаться к Yahoo API, потому что файл CSV был хорошо отформатирован. Зачем нам работать больше, если в этом нет необходимости?

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

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

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

Для проведения анализа настроений мы использовали анализатор настроений VADER. Это был естественный выбор для этого проекта, потому что VADER уже мог обрабатывать смайлики и сленговые термины. Однако нам пришлось обновить «оценку» ВЕЙДЕРА для некоторых смайликов. VADER автоматически присваивает значение от -4 до 4 для слов и смайликов, которое показывает, насколько они позитивны или негативны. Например, слово «ненависть» будет близко к -4, а слово «любовь» будет близко к 4. Что касается эмодзи, VADER сначала преобразует их в слова, а затем анализирует. Если вы попытаетесь запустить эмодзи огня через VADER, он преобразует смайлик в слово «огонь», а затем присвоит оценку скорее отрицательную, чем положительную. Это небольшая проблема для наших целей, потому что r/WallStreetBets использует много смайликов и сленговых терминов, которые имеют другие оценки тональности, чем значения по умолчанию VADER.

Чтобы обновить значения общих смайликов, используемых в этом сообществе Reddit, мы просмотрели переводы смайликов VADER. Например, смайлик с ромбом был «драгоценным камнем», а смайлик с ракетой — «ракетой». Затем мы могли вручную обновить часто встречающиеся смайлики в сообществе, прежде чем запускать все наши сообщения через анализатор настроений.

def __init__(self, name):
 “””The constructor of the SqueezeNet class”””
 self.custom_emoji_scores = {
 ‘rocket’: 4.0,
 ‘gem stone’: 4.0,
 ‘raising hands’: 3.0,
 ‘bull’: 3.5,
 ‘bear’: -3.5,
 ‘toilet paper’: -4,
 ‘fire’: 3.0,
 ‘green’: 2,
 ‘red’: -2
 }

Еще одной проблемой, с которой мы столкнулись, были соображения времени. Фондовый рынок закрыт по выходным и федеральным праздникам, поэтому нам пришлось учитывать, на какие дни будет влиять каждое сообщение. Удобно, что каждый пост в наборе данных Kaggle был помечен эпохой. После написания функции, которая преобразует время эпохи в удобочитаемую дату (время UTC), мы решили, что сообщения в выходные и праздничные дни должны влиять на дату следующего рынка, а сообщения после закрытия рынка (21:00 UTC) также должны влиять на дату открытия следующего рынка. .

Функции

После предварительной обработки всех данных и объединения их в один красивый фрейм данных pandas мы теперь можем искать интересные корреляции в данных. Поскольку у нас есть мощь информатики и науки о данных, вместо построения множества точечных диаграмм для поиска корреляций мы сначала запустили регрессию случайного леса, чтобы определить наиболее важные функции в данных. Мы решили использовать регрессию случайного леса, потому что мы пытаемся предсказать непрерывную переменную, цену акций закрытия, на основе наших входных данных, которые были функциями Reddit. Используя функцию feature_importances_, мы обнаружили, что количество комментариев (0,44) и оценка, представляющая собой совокупность положительных и отрицательных голосов (0,27), были наиболее важными характеристиками при прогнозировании цены GameStop.

Корреляции

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

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

Просто взглянув на график, мы видим, что существует небольшая корреляция между составным настроением и дневной ценой закрытия, что дополнительно подтверждается коэффициентом корреляции (r), равным -0,012. Как насчет положительных и отрицательных эмоций? У одного из членов нашей группы была теория, что негативные настроения могут влиять на цену акций больше, чем позитивные, потому что люди более склонны к панической продаже акций, чем к эйфорическим покупкам.

Опять же, мы видим очень небольшую корреляцию между положительными и отрицательными настроениями с ценой закрытия GME. Обе функции имели абсолютное значение r менее 0,1, что свидетельствует об очень слабой корреляции.

Хорошо, а как насчет наиболее важных функций, таких как количество комментариев и оценка?

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

А как насчет временных соображений? Посмотрев на наши результаты в поражении, разочарованные нашими неубедительными выводами, мы решили, что время является фактором. Наш набор данных от Kaggle восходит к 2012 году, задолго до того, как произошло ралли GameStop. Корреляция между активностью Reddit и ценой GME, которая была бы новым явлением, теоретически могла бы произойти немного до и во время ралли GME в начале 2021 года. Итак, для следующей партии точечных диаграмм мы взяли данные только с июля 2020 года по февраль 2021 года ( На этом набор данных закончился). Мы также решили смотреть на ежедневные изменения цен вместо цен закрытия, чтобы увидеть, сможем ли мы лучше определить тренд.

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

Основываясь на наших выводах, ясно, что существует небольшая корреляция между нашими функциями и ежедневным движением цены. Но как насчет объема запасов? Приводит ли повышенная активность Reddit к r/WallStretBets к тому, что больше людей покупают и продают GME?

Еще раз взглянем на сообщения и цены на акции после июля 2020 года. Удивительно, но у нас пока самые сильные коэффициенты корреляции с составным настроением (0,5403) и числом_комментариев (-0,3879).

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

Назад к случайным лесам

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

Как наш случайный лес предсказывал цены закрытия? При обучении и тестировании на исторических данных модель имела точность 70,96%, среднеквадратичную ошибку (mse) 19,1 и среднеквадратичную ошибку (rmse) 4,37.

Взглянув на графики прогнозов, мы видим, что случайный лес довольно хорошо предсказал цены закрытия для GME на основе функций Reddit. Случайный лес смог предсказать цены и поместить их в правильный общий «кластер» точек на диаграммах рассеяния.

Ограничения и улучшения

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

Если бы у нас было больше времени, мы бы попытались проанализировать эту проблему, используя больше данных и больше функций. Поскольку короткое сжатие произошло в январе 2021 года, возможно, все данные до этого не имеют отношения к нашему вопросу. Было бы полезно просмотреть более свежие сообщения вплоть до сегодняшнего дня, мая 2023 года, и сравнить их с ценой акций GME, потому что с момента первоначального ралли было еще несколько ралли. Еще одна точка данных, которую мы могли бы сравнить, — это цены и объемы других акций, предназначенных для коротких продаж r/WallStreetBets, таких как Bed Bath and Beyond (BBBY) и фильмы AMC (AMC). Надеемся, что, собрав больше данных, мы сможем найти более значимые корреляции между объемом и ценой акций и функциями Reddit.

Выводы

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

Этот проект был сделан мной, Джеком Келли и Кираном О’Деллом. Если вы заинтересованы в том, чтобы воспроизвести проект или сделать еще один шаг вперед, вот ссылка на GitHub со всем нашим кодом. Мы надеемся, что этот проект вдохновит вас попробовать прогнозировать фондовый рынок! (Торгуйте и инвестируйте ответственно. Не играйте в азартные игры💎🙌🚀)