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

Для прогнозирования будущей цены акций используется специальный тип нейронной сети, называемый рекуррентной нейронной сетью (RNN). Этот тип сети отличается от обычной CNN тем, что он структурирует узлы во временную последовательность.

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

Приведенный выше код запрашивает API-интерфейсы Ameritrade и возвращает данные о ценах на акции за 10 лет, в данном примере для American Airlines. После построения данные должны выглядеть примерно так:

Затем данные свечи преобразуются в фрейм данных Pandas, и добавляется новый столбец для цены закрытия предыдущих дней. Затем это сохраняется в файл CSV.

Затем файл можно загрузить отдельно, чтобы начать обработку прогноза.

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

Для этого мы просто масштабируем столбцы цены закрытия, объема и цены закрытия предыдущих дней.

Теперь мы разделим данные на наборы данных для обучения и тестирования.

Важно отметить, что данные разбиваются в заданной точке временного ряда. В этом случае мы разделяем его на отметке 80%, что означает, что последние 20% временного ряда будут использоваться для проверки прогнозов позже.

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

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

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

Теперь, когда модель построена, мы можем подогнать ее к данным. Первоначально мы будем использовать скорость обучения 0,0001 за 50 эпох и 20 пакетов.

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

Фрагмент кода, приведенный ниже, загружает ранее оконные обучающие данные и генерирует новый прогноз.

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

Если теперь мы сгенерируем прогноз на основе зарезервированных тестовых данных (те 20%, которые мы выделили в начале), можно сгенерировать более реалистичный прогноз.

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

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

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

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

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

Это завершает решение!