Можем ли мы на самом деле предсказать цены на акции с помощью машинного обучения?

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

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

Но возникает вопрос: почему ведущие фирмы, такие как Morgan Stanley и Citigroup, наняли количественного аналитика для построения прогнозных моделей?

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

Мы собираемся создать модель глубокого обучения для прогнозирования цен на акции

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

Цель нашей модели

Наша цель - предсказать цену закрытия для любых данных.

В нашей обучающей модели будет использоваться дневная цена закрытия S&P 500 с января 2002 г. по август 2016 г.. Это ряд точек данных, проиндексированных во временном порядке, или временные ряды. .

Загрузка данных

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

Будем ли мы использовать это уравнение для нормализации каждого значения, чтобы отразить процентные изменения от начальной точки. Мы разделим каждую цену (Pi) на начальную цену (P0) и вычтем 1 .

Когда наша модель позже сделает прогноз, данные будут нормализованы с использованием этой формулы, чтобы получить реальное число.

Нейронные сети

Нейронная сеть прямого распространения

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

В этой сети информация перемещается только в одном направлении вперед, от входных узлов через скрытые узлы (если есть) и к выходным узлам. В сети нет циклов или петель.

Цель сети с прямой связью - аппроксимировать некоторую функцию f *.

Например, для классификатора y = f * (x) сопоставляет вход x с категорией y. Сеть с прямой связью определяет отображение y = f (x; θ) и изучает значение параметров θ .

Эти сети в основном используются для распознавания образов и могут быть проиллюстрированы следующим образом:

И наоборот, для успешной обработки последовательных данных вам необходимо использовать рекуррентную (обратную) нейронную сеть.

Он может "запоминать" части входных данных и использовать их для точных прогнозов. Эти сети лежат в основе распознавания речи, перевода и многого другого.

Построение модели сираджа

siraj Чтобы построить нашу модель, мы сначала инициализируем ее как последовательную, так как это будет линейный стек слоев, а затем мы добавим наш первый слой, который является слоем LSTM.

Сети с долгосрочной краткосрочной памятью

Люди не каждую секунду начинают думать с нуля.

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

Традиционные нейронные сети не могут этого сделать, и это кажется серьезным недостатком.

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

siraj Нейронные сети с прямой связью принимают вектор фиксированного размера в качестве входных данных, например изображение, o мы не могли бы использовать его, чтобы сказать: предсказать следующий кадр в фильме, потому что для этого потребовалась бы последовательность факторов изображения в качестве входных данных, а не только один. Поскольку вероятность того, что произойдет определенное событие, будет зависеть от того, что происходило в каждом кадре перед этим, нам нужен способ, позволяющий сохранить информацию, и поэтому мы используем Рекуррентные нейронные сети.

Сирадж В глубоком обучении Рекуррентные нейронные сети (RNN) - это семейство нейронных сетей, которые отлично обучаются на основе последовательных данных.

Это сети с петлями внутри, позволяющими информации сохраняться.

Люди во многом основывают свое понимание на контексте. Рассмотрим следующую последовательность: Париж - самый большой город ______. Пустое поле легко заполнить Франция. Это означает, что есть информация о последнем слове, закодированная в предыдущих элементах последовательности.

Рекуррентную нейронную сеть можно рассматривать как несколько копий одной и той же сети, каждая из которых передает сообщение своему преемнику.

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

Посмотрим, что будет, если развернуть цикл:

Рекуррентные сети могут принимать последовательности векторов в качестве входных данных.

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

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

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

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

Обычно нейроны представляют собой единицы, которые применяют функцию активации f (обычно tanh или sigmoid) к линейной комбинации своих входов в L a TM (

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

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

Проблема долговременных зависимостей

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

Если бы RNN могли это сделать, они были бы чрезвычайно полезны. Но могут ли они? По-разному.

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

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

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

Но есть также случаи, когда нам нужно больше контекста. Попробуйте угадать последнее слово в тексте: «Я вырос в Италии… Я бегло говорю на итальянском».

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

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

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

К счастью, в сетях с долгосрочной краткосрочной памятью этой проблемы нет!

Сети с долгосрочной краткосрочной памятью

LSTM специально разработаны, чтобы избежать проблемы долгосрочной зависимости.

Класс RNN, нашедший практическое применение, - это Long Short Term Memory ( обычно называемый просто «LSTM» ). Это особый вид рекуррентной нейронной сети, которая работает для многих задач, намного лучше стандартной версии.

Почти все впечатляющие результаты, основанные на рекуррентных нейронных сетях, достигаются с помощью Long Short Term Memory N etworks.

Сети с долгосрочной краткосрочной памятью - это особый вид RNN, способный изучать долгосрочные зависимости. Их представила Hochreiter & Schmidhuber (1997). Они очень хорошо работают с широким кругом задач и в настоящее время широко используются.

Все рекуррентные нейронные сети представляют собой цепочку повторяющихся модулей нейронной сети.

В стандартных RNN этот повторяющийся модуль будет иметь очень простую структуру, такую ​​как один слой tanh.

Возвращаясь к коду для нашего слоя LSTM, мы установим наше входное измерение на 1 и скажем, что нам нужно 50 единиц в этом слое, установив для возвращаемых последовательностей значение true

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

Мы добавим 20% отсева к этому слою, а затем инициализируем наш второй слой как еще один LSTM с 100 единиц, установленным для возврата последовательности в значение false. на нем, поскольку его вывод подается только на следующий уровень в конце последовательности, он не помещал прогноз для последовательности вместо вектора прогнозирования для всей входной последовательности, мы будем использовать линейную плотную слой, чтобы объединить данные из этого вектора прогноза в одно значение

Компиляция ошибки

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

Обучение модели и построение прогнозов

Мы обучим нашу модель соответствию функции (model.fit), затем мы сможем протестировать ее, чтобы увидеть, что она предсказывает для следующих 50 шагов в нескольких точках нашего графика и визуализирует его с помощью этой сюжетной линии

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

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

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

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

Погрузитесь глубже:

Как легко прогнозировать цены на акции - Введение в глубокое обучение № 7, Сирадж Раваль

Документация Рекуррентная нейронная сеть





GitHub Код