CoderCastrov logo
CoderCastrov
Парсер

Извлечение данных с онлайн-платформ для улучшения прогнозов временных рядов

Извлечение данных с онлайн-платформ для улучшения прогнозов временных рядов
просмотров
7 мин чтение
#Парсер

Практическая попытка предсказать цену биткоина с использованием Twitter, Google, Reddit и Wikipedia

Введение

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

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

Исходя из вышесказанного, я решил объединить концепции парсинга и прогнозирования с целью продемонстрировать, как легко извлекать данные из популярных онлайн-платформ и использовать эти данные для повышения точности прогнозов моделей. В контексте этой статьи мы будем парсить данные с Twitter, Google, Reddit и Wikipedia ([1], [3–6], [8]) и обучать улучшенную модель NeuralProphet ([2]) на Python, которая будет прогнозировать цену биткоина, используя извлеченные данные.

Важно отметить две вещи.

Во-первых, методы, которые будут показаны в этой статье, могут быть использованы с любым временным рядом. Биткоин используется только в качестве примера (учитывая его популярность в наши дни). Но не стесняйтесь и попробуйте реализовать этот учебник с чем-то, что вам интересно и вы хотите прогнозировать!

Во-вторых, я чувствую себя обязанным написать огромный отказ от ответственности здесь! Пожалуйста, рассматривайте эту статью как учебник по парсингу данных / прогнозированию временных рядов и ничего более! НЕ используйте этот подход в качестве руководства о том, где или как инвестировать ваши деньги! Сначала получите совет от человека с необходимыми знаниями!

Шаг 1: Парсинг данных

Типы данных, которые мы будем парсить:

  • количество твитов, содержащих термин "Bitcoin"
  • Google Trends по ключевому слову "Bitcoin"
  • количество новых постов на subreddit r/Bitcoin
  • количество просмотров страницы статьи "Bitcoin" на Wikipedia

Хотя анализ настроений твитов или постов на Reddit также может предоставить значительный источник информации ([3], [4]), я решил оставить этот пример простым и парсить только объем трафика. Несколько работ в литературе показывают, что просто количество взаимодействий на этих платформах является показателем увеличения или уменьшения значения индекса ([4], [5]).

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

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

  • Для Twitter мы используем библиотеку snscrape_ _и конкретно ее модуль twitter. То, что меня поразило в этой библиотеке, это возможность парсить Twitter без необходимости использовать официальное API Twitter и явно обрабатывать все ограничения скорости, которые оно применяет.
  • Для Google Trends мы используем библиотеку pytrends_ _и конкретно ее модуль dailydata.
  • Для Wikipedia мы используем библиотеку pageviewapi_ _.
  • Для Reddit мы используем библиотеку requests_ _для получения данных из Pushshift API.

Как аргументы запроса, так и структуры ответа могут немного отличаться от библиотеки к библиотеке, но все они интуитивно понятны и легко понять после быстрого ознакомления с их документацией. Единственное, на что мы можем обратить внимание, это то, что Pushshift API Reddit возвращает максимум 100 постов за запрос, поэтому мы должны подсчитывать посты в день пакетами по 100.

Определив все наши функции, мы просто вызываем их с нужными аргументами, делаем кофе (или два) и ждем их завершения.

Для этого примера мы спарсили ежедневные данные с 01/10/2013 по 15/12/2020. И, шутки в сторону, эти функции, особенно функция для Twitter, занимают много времени для завершения, учитывая объем данных, с которыми они должны работать. Однако, если вы хотите поиграть с готовым набором данных, вы всегда можете найти его в моем репозитории на GitHub здесь.

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

Шаг 2: Исследование данных

Отлично. Мы успешно собрали все наши данные. Теперь пришло время немного исследовать их, чтобы получить первые представления о том, чего ожидать.

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

Кросс-корреляция между столбцами (изображение автора)

Хотя корреляция между двумя временными рядами показывает наличие некоторой связи между ними, это не обязательно означает причинно-следственную связь. Нам также нужна метрика, которая может сказать нам, если изменения в одном временном ряду вызывают изменения в другом. Этой метрикой является p-значение теста Грейнджера, которое информирует нас о вероятности того, что изменения в двух коррелированных временных рядах происходят независимо друг от друга. Учитывая результаты обоих вышеуказанных тестов, мы решили исключить данные из Wikipedia и Reddit, так как они имели низкую корреляцию с нашей целевой переменной и могли бы больше запутать нашу модель, чем улучшить ее.

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

Шаг 3: Разработка простой модели

Некоторые из вас могут уже быть знакомы с Facebook Prophet [7] для прогнозирования временных рядов. NeuralProphet - это недавно выпущенное расширение для Prophet, которое улучшает некоторые вещи на бэкэнде и также реализует авторегрессию. Если вас интересует более подробная информация об этом многообещающем пакете, перейдите на страницу документации.

Для наших экспериментов мы будем тестировать способность модели прогнозировать окна продолжительностью 14 дней с 15/9/2020 по 15/12/2020. На каждой итерации мы будем обучать модель на всех данных до определенной даты, а затем делать прогноз на 14 дней вперед от этой даты. Авторегрессионная часть модели будет включать 14 лагов. Вдохновившись этой статьей, мы обучим нашу модель с отключенной daily_seasonality и с установленным seasonality_mode в "multiplicative".

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

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

График подгонки к обучающим данным График подгонки к обучающим данным

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

Прогнозы простой модели

Не плохо. Модель сделала довольно точные прогнозы, но они кажутся немного "устаревшими". Будет интересно увидеть, улучшают ли добавленные данные, полученные из онлайн-платформ, возможности модели.

Шаг 4: Улучшение нашей модели

NeuralProphet позволяет нам добавлять в модель внешние регрессоры с помощью простой команды. Эти регрессоры могут быть как отставшими во времени, так и будущими. В нашем случае мы предполагаем, что онлайн-трафик, связанный с биткоином, предшествует потенциальным изменениям в цене биткоина, поэтому мы будем добавлять наши переменные в качестве отставших регрессоров. Хотя это не всегда верно, и проведено много исследований на эту тему ([8]), это будет достаточно, чтобы продемонстрировать концепции, которые ставит перед собой этот статья.

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

Все остальные параметры остаются неизменными. Давайте переоценим.

Прогнозы модели с внешними регрессорами (изображение автора)

Добавив скрапированные данные, мы достигли уменьшения MAPE на 0,38%, и мы также видим, что наши прогнозы следуют за фактическими значениями гораздо более "динамично". Хотя уменьшение ошибки не является значительным, мы не должны забывать, что в нашем примере мы просто добавили два регрессора. Можно только представить потенциал этой модели, если бы было найдено и добавлено больше временных рядов, сильно коррелирующих с целевой переменной.



Заключение

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


Ссылки

[1] Phillips, R. C. and Gorse, D., Cryptocurrency price drivers: Wavelet coherence analysis revisited (2018), PLOS ONE[2] Neural Prophet Documentation Page, http://neuralprophet.com/[3] Bukovina, J. and Marticek, M., Sentiment and Bitcoin Volatility (2016), MENDELU Working Papers in Business and Economics 2016–58, Mendel University in Brno, Faculty of Business and Economics.[4] Abraham, J., Higdon, D., Nelson, J. and Ibarra, J., Cryptocurrency Price Prediction Using Tweet Volumes and Sentiment Analysis (2018), SMU Data Science Review[5] Shen, D., Urquhart, A., and Wang, P., Does twitter predict Bitcoin? (2019), Economics Letters[6] Kristoufek, L., BitCoin meets Google Trends and Wikipedia: Quantifying the relationship between phenomena of the Internet era (2013), Scientific Reports[7] Facebook’s Prophet Documentation Page, https://facebook.github.io/prophet/[8] Li, X. and Wang, C. A., The technology and economic determinants of cryptocurrency exchange rates: The case of Bitcoin (2017), Decision Support Systems