Авторы проекта: Марк Баббе, Кори Нгуен, Вон Ли и Хэнни Нуилати

Источник: https://www.huffingtonpost.com/entry/the-future-of-machine-learning-in-finance_us_58d55c99e4b06c3d3d3e6d42

Введение

Машинное обучение и нейронные сети продолжают революционизировать отрасли по всему миру, и финансовая отрасль не исключение. В нашем классном проекте мы решили реализовать нейронную сеть в надежде понять, как информация в формах SEC 8-K может быть использована для прогнозирования общего движения S&P 500. На самом деле успех такой модели в реальном мире и его приложения будут зависеть от инфраструктуры, наборов данных и времени обработки / действия. Тем не менее, мы обнаружили, что общедоступные формы 8-K могут дать ценную информацию при определении общего движения рынков.

Нас вдохновила статья Huffington News под названием Будущее машинного обучения в финансах, а также сообщение в блоге на Medium от коллеги по анализу данных. Мы благодарим Юсефа Актана за его пост в блоге, который стал полезной отправной точкой.

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

Что касается сбора данных, нам посчастливилось иметь доступ к работе Аткана над его Github, что позволило нам развить его тяжелую работу. Итак, с самого начала у нас был доступ к парсеру и записной книжке Jupyter для предварительной обработки данных. Взяв это за отправную точку, мы начали модифицировать код, чтобы посмотреть, можем ли мы улучшить обработку этапа предварительной обработки данных при устранении любых ошибок, которые непреднамеренно возникают при переходе сценариев программирования из рук в руки. Например, мы быстро столкнулись с проблемами со скребком, предназначенным для извлечения 8-тысячных документов из базы данных SEC Edgar. Добавление таймера к функции requests.get не решило бы проблему, поскольку проблема не заключалась в доступе к документам. Мы связали причину, скорее всего, с тем, как текстовые данные хранились в базе данных SEC Edgar, что оказалось довольно интересным напоминанием о том, как источники данных могут изменяться довольно быстро. Мы решили проблему, просто поместив стандартный класс таймера и функцию в парсер, поскольку проблема не могла быть изолирована до одной точки. После этого мы смогли беспрепятственно извлекать текстовые данные.

Мы столкнулись с аналогичной проблемой с источниками данных, когда дело дошло до получения ежедневных цен на акции. Сначала мы пытались получить данные из Alpha Vantage через их задокументированный API, используя наш собственный ключ API, но Alpha Vantage ограничила объем данных, которые мы могли запрашивать в день, требуя премиум-членства, чтобы делать больше. Вместо этого мы обратились к Quandl, еще одному источнику экономических и финансовых данных, чтобы использовать их набор данных Wiki. Следует отметить, что люди начали переходить от Quandl к Alpha Vantage после того, как набор данных Wiki был прекращен в апреле 2018 года. С некоторой долей иронии мы в конечном итоге перешли от Alpha Vantage к набору данных Quandl Wiki, поскольку нам нужны были данные только до апреля. 2018, чтобы сравнить наш подход с исходным разработчиком.

В конечном итоге мы получили примерно 19 000 документов, что немного меньше того, с чего Аткан должен был начать, поскольку скребок должен был пропустить несколько сотен документов. На тот момент набор данных имел размер около 3 гигабайт, а в некоторых документах было много слов. Фактически, несмотря на наш таймер, горстка документов содержала около трех миллионов слов. Для нас стало очевидно, что полученные нами данные не являются чистыми и их необходимо преобразовать в необходимые компоненты. Эта часть оказалась сложной, но решение оказалось довольно простым. В оригинале полученные текстовые документы содержали такую ​​информацию, как инвентарный номер и т. Д., Что нам не помогло. Однако в конце этих частей было поле под названием «Отметьте соответствующий квадрат». Используя регулярные выражения, мы смогли удалить весь текст, предшествующий этой фразе. Тем не менее, наши текстовые данные по-прежнему содержат посторонние данные. Чтобы найти наиболее релевантную информацию, нам пришлось заглянуть на вторую страницу, где мы определили повторяющийся шаблон в документах, где слово «Вкл.» Обычно использовалось перед началом фактической информации, разглашаемой рассматриваемой корпорацией.

Используя регулярное выражение, мы начали искать именно это слово в документе, что позволило нам получить более качественные данные. Однако ценой за это стало уменьшение количества документов, которые мы могли использовать. После предварительной обработки данных у Аткана было 17000, а у нас - 11000. С другой стороны, размер нашего файла был уменьшен до 22 мегабайт после того, как мы обработали документы с чрезмерным количеством слов. Но самое главное, что в итоге мы получили более совершенный набор документов, сведенный до необходимых частей.

Краткое содержание оригинального текстового документа Аткана:

Краткое содержание текстового документа нашей команды:

В конце этапа предварительной обработки данных мы получили состав данных, который отличался от Atkan. Например, мы использовали разницу между скорректированной ценой открытия и скорректированной ценой закрытия, чтобы получить нормализованное изменение цены для каждой акции, в то время как Аткан использовал разницу между нормальной ценой открытия и скорректированной ценой закрытия, чтобы собрать свое нормализованное изменение цены, которое могло бы объяснить разница. Для прозрачности мы должны отметить, что набор данных Wiki может отличаться по способу расчета скорректированных цен на акции из Alpha Vantage. С другой стороны, мы не должны видеть разницы, когда дело доходит до расчета разницы в индексной цене со стороны Аткана или нашей, поскольку скорректированные и нормальные цены одинаковы для GSPC и VIX. Они представляют собой индексные цены, поэтому в них не нужно учитывать дивиденды, дробление акций и т. Д. Таким образом, использование скорректированных или нормальных цен не имеет значения при расчете изменения цены для индекса, поэтому мы чувствовали себя комфортно, используя скорректированные цены при обнаружении изменения цен на акции. Кроме того, мы также немного изменили код, используемый для получения указанных изменений цен, которые, возможно, также сыграли свою роль.

Все это вместе привело к тому, что мы получили разные числа с точки зрения трех классов, которые у нас есть: «вверх», «оставаться» и «вниз». Повышение - это обычно любое увеличение более чем на 1%, задержка - любое значение от 1% до -1%, а снижение - это все, что составляет снижение более чем на 1%. Большая часть наших данных составила бы то, что мы классифицировали как «остаточные» на уровне около 66%, в то время как в конечном итоге мы равномерно разделились вверх и вниз для остальных 33%. Аткан, с другой стороны, имел около 58% в «верхнем» классе, 18% в «нижнем» классе и около 24% в «остаемом» классе. В отличие от Аткана, мы не использовали исторические тенденции цен для нашей обработки, хотя мы собрали их для возможного будущего проекта. Наконец, мы решили использовать передискретизацию, как и наш предшественник, чтобы справиться с проблемой дисбаланса классов, с которой мы столкнулись, что значительно повысило бы точность нашей модели.

Выше показано распределение сигналов необработанных данных. Обратите внимание, что распределение отличается от распределения Актана из-за разницы в его вычислении.

BERT

Из всех вариантов, доступных нам в этом анализе, мы хотели использовать модель BERT (двунаправленные представления кодировщика от трансформаторов). BERT - это последняя предварительно обученная языковая модель, представленная исследователями Google AI Language только в прошлом году (опубликованная в этой статье). Основное преимущество использования этой модели заключается в том, что мы фиксируем контекст в документе. В статье Актана вместо этого он использовал вложения из Stanford’s GloVe (глобальные векторы для представления слов), но мы заметили недостаток, заключающийся в том, что он фактически не принимает во внимание контекст из SEC Forms 8-K. Мы чувствовали, что, поступая так, наша модель может лучше понять значение этих документов и прийти к заключению, которое имеет лучшую предсказательную силу.

До BERT у моделей были проблемы со сбором контекстной информации слова, потому что они могли анализировать только слова, предшествующие ему. Они известны как направленные модели, потому что они считывают вводимый текст последовательно. Однако с помощью BERT мы можем преодолеть это препятствие с помощью двух ключевых методов: моделирования маскированного языка (MLM) и прогнозирования следующего предложения (NSP).

Стратегии обучения

Причина, по которой модели в прошлом никогда не могли использовать двунаправленные методы, заключается в том, что предсказываемое слово, по сути, должно было уже знать, что такое само по себе, когда оно вводится в первый уровень. Условие для предыдущего и следующего слова было просто невозможно до моделирования маскированного языка. В MLM 15% слов в каждой последовательности замаскированы, и модель пытается предсказать их на основе контекста других немаскированных слов. Таким образом, модель может использовать обе стороны слова (двунаправленные) в качестве контекста для контекста анализируемого слова. Пример этого показан ниже:

Источник: https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html

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

Источник: https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html

Следует иметь в виду, что оба этих метода (MLM и NSP) обучаются одновременно в BERT с общей целью минимизации потерь. Кроме того, эти методы стали возможными благодаря модулям тензорной обработки (TPU), которые, по сути, обеспечивают максимальную производительность с возможностью быстрой отладки и редактирования моделей. Если вам интересно, вы можете прочитать здесь.

Реализация BERT

BERT уже имеет специальный токенизатор для предварительной обработки текста. Во-первых, нам нужно указать максимальную длину последовательности наших данных для ввода в модель. Из-за наших текущих аппаратных ограничений мы не рискнули и разрешили только максимальную длину последовательности 128. Это означает, что наша модель будет видеть только первую сотню или около того слов в тексте. Это сделало предварительную обработку критически важной и объясняет, почему мы предпочли бы сократить наши данные почти на 50%, вместо того, чтобы оставлять бесполезный текст. Кроме того, мы потеряем еще несколько слов, поскольку токенизатор BERT добавляет токены CLS в начало пары предложений, а токены SEP добавляются в конце как первой, так и второй последовательности.

Как только данные проходят через модель, у нас есть возможность извлечь объединенный вывод или вывод последовательности. Для такой задачи классификации, как наша (вверх, вниз или остаться), мы запросили объединенный вывод, который является только вектором вывода токена CLS. С этим выходным вектором добавляется дополнительный слой, чтобы уточнить, как мы хотим тренироваться. Этот процесс известен как «тонкая настройка», и в нашем случае мы добавили полностью связанный плотный слой.

Результаты

В отличие от исходного проекта, мы не разделяли наши обучающие данные и тестовые данные случайной выборкой, скорее, мы хотели избежать использования информации из «будущего», так сказать, и избежать потенциального искажения наших результатов. Чтобы лучше представить реальный мир, мы разделили наши тестовые данные и обучающие данные по времени с разделением 90/10, где тестовые данные брали самые последние данные, а обучающие данные - все остальное.

После подгонки нашей модели однослойного MLP BERT + к обработанным текстовым данным, наша модель дала потерю 0,448 и погрешность вне выборки 60,39%. Это впечатляет, так как он превосходит однослойный MLP Aktan GloVe + (точность которого на тестовом наборе данных составила около 45%). Однако результат неутешительный, поскольку базовый уровень точности наших данных тестирования составляет 63%, чего можно достичь, пометив все данные как «остаться».

Дисбаланс классов оказался основной проблемой, с которой мы столкнулись на этом этапе, поэтому мы использовали передискретизацию. В исходном наборе обучающих данных мы повторно дискретизировали данные с заменой, чтобы создать новый сбалансированный обучающий набор с тем же количеством строк, помеченных как «вверх», «вниз» или «оставаться». С этими повторно дискретизированными данными мы повторно обучили однослойную модель MLP BERT + с обработанными текстовыми данными. На последнем этапе обучения модель вызвала потерю 1,18, но точность вне выборки составила 71%.

Этот результат является значительным улучшением по сравнению с нашей предыдущей моделью. Это также превышает базовую точность теста в 66%, которую можно получить, выбрав только «пребывание» для набора тестовых данных. Кроме того, наша модель превзошла все модели, описанные в нашем блоге Aktan, всего за один час обучения в среде выполнения Google Colaboratory GPU.

Состав наших тестовых данных:

Эти результаты удивительны, поскольку мы не ожидали, что превзойдут исходные модели блога. Мы рассматриваем этот результат как свидетельство эффективности модели Google BERT для обработки контекстного языка. Поскольку BERT учитывает контекст токенов, он может хранить больше информации, относящейся к фондовому рынку, в каждое из своих встраиваний слов. Это единственное отклонение от использования встраивания слов GloVe позволило нам получить лучшие результаты от нашей модели и подчеркивает идею о том, что контекст является ключевым в обработке естественного языка. Из моделей Aktan мы уже знали, что тексты SEC Form 8-K были полезны для прогнозирования S&P 500, и наш проект поддерживает эту идею.

Мы ожидаем, что сможем улучшить эту модель, используя некоторые идеи, которые мы не перенесли из оригинального блога Aktan. Например, модель Актана принимает в качестве входных данных текст формы 8-K SEC, а также некоторые финансовые данные. Как только мы извлечем вектор токена CLS из BERT, мы сможем передать его через сеть с другими векторами финансовых данных, пытаясь улучшить нашу точность вне выборки. Другая идея - использовать RNN, в частности LSTM, на векторах последовательностей токенов, которые мы не извлекали из BERT, чтобы посмотреть, может ли это улучшить нашу точность вне выборки. Этот подход также позволит нам посмотреть на различные веса в сети, поскольку они относятся к определенным выборкам данных, и точно определить, какие токены являются наиболее важными в тексте формы 8-K.

В заключение, мы пришли к выводу, что этот проект был успешным. Хотя улучшение всего на 5% лучше, чем базовый уровень, есть свидетельства того, что наша сеть использует текст для правильного прогнозирования некоторых подъемов и падений в пределах S&P 500. Наши улучшения по сравнению с моделью Aktan, несмотря на использование аналогичных данных, также подчеркивают эффективность BERT over GloVe для обработки текстовых данных в настоящее время. Наконец, код этого проекта можно найти здесь (https://github.com/markbabbe/BERT-Stock-Prediction-Using-NLP).

И чтобы ответить на животрепещущий вопрос, волнующий всех, да. Да, мы слышали. Это BERT, собственно, и есть слово.