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

Этот проект по науке о данных направлен на использование рыночной информации, как аналитической, так и технической, для прогнозирования стохастических колебаний цен на золото за определенный период. Аналитическая информация собирается с использованием финансовых новостей, относящихся к золоту или товарным рынкам. Технические характеристики - это исторические цены на несколько активов, включая Standard & Poor 500, индекс Доу-Джонса, сырую нефть и некоторые другие.

Я получаю новости, связанные с золотом, от нескольких крупных поставщиков новостей - Bloomberg Business, Wall Street Journal, Reuters, Financial Times, Yahoo Finance - с помощью API реестра событий. Поскольку в Event Registry архивируются новости с 2014 года, я выбираю финансовые данные за тот же период.

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

Исследование данных

Каждому проекту в области науки о данных нужны данные. Какие данные я собрал?

  • 1900+ новостных статей с января 2014 г. по август 2019 г.
  • 1400+ ценовых пунктов для каждого из шести классов активов, выбранных на тот же период

Чтобы подготовиться к предварительной обработке, я переношу статьи из формата JSON во фрейм данных Pandas. Затем для своей цели я рассчитываю колебания цены на золото между одним торговым днем. Я объединяю два фрейма данных, чтобы выровнять новости с ценами.

Анализ данных

Обрабатывая два типа данных, я обнаружил несколько интересных моментов.

Из облака слов всех новостей я делаю три наблюдения.

  • Все дело в том, кто что говорит.
  • Центральный банк - хозяин.
  • «Невидимая рука»: рыночные силы не менее важны.

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

Вышесказанное - мои наблюдения, сделанные человеком. Что тогда может сказать нам машина?

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

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

  • Новости: перед лемматизацией я удаляю числа, знаки препинания, пробелы в концах и стоп-слова, а все тексты переводю в нижний регистр. Взглянув на длину всех документов, я решил заполнить весь корпус нулями до единой длины в 24100 слов. Это сокращение выбрано, поскольку только пять из 1900 документов не имеют этой длины.
  • Цены на активы: когда я объединяю два фрейма данных, новости в неторговые дни не имеют соответствующих цен. Поэтому я заполняю наноячейки ценой предыдущего торгового дня.
  • Цель: основываясь на колебаниях в течение одного торгового дня, я классифицирую изменения в пределах от 1% до «оставаться», от 1% до «вверх» и ниже 1% - для «вниз». Для будущих работ я могу сузить полосу пропускания до 0,5%, чтобы создать более сбалансированные классы.

Модели глубокого обучения

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

Еще несколько шагов перед обучением моделей: стандартное масштабирование финансовых данных, одно горячее кодирование целей, токенизация текстов, подготовка матрицы встраивания с помощью Stanford GloVe.6B.100d и, наконец, обучение, проверка, разделение тестовых данных.

Структура нейронной сети с несколькими входами показана ниже. Я сравниваю производительность сверточной нейронной сети (CNN) и последовательной рекуррентной нейронной сети (кодировщик-декодер RNN) для ввода текста при сохранении структуры модели LSTM для финансовых цен временных рядов.

Модельные выступления:

Для обучения модели CNN требуется всего 20 секунд в эпоху, что в 20 раз меньше, чем для модели RNN. Более того, точность модели RNN и плато результатов F1 быстро после первой эпохи, что приводит к плохой производительности классификации на тестовых данных, поскольку она классифицирует все по классу большинства.

Ниже приведена нормализованная матрица путаницы модели CNN на тестовых данных.

Мое путешествие

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

Источники: