Прогнозирование финансовых временных рядов с помощью Keras / Tensorflow: пробовали три метода прогнозирования, три неудачных результата, что я делаю не так? - PullRequest
0 голосов
/ 24 октября 2018

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

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

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

Три реализации прогнозирования, которые я пробовал:

1) - Реализация скользящего окна.Входные данные сдвинуты назад на временные шаги (x-1, x-2 ...), целевые данные - текущий временной шаг (x).Данные, используемые для прогнозирования первого прогноза, представляют собой n строк тестовых данных, сдвинутых так же, как и входные данные.Для каждого последующего прогноза самый старый временной шаг удаляется, и прогноз добавляется в начало строки прогноза, сохраняя то же количество общих временных шагов, но прогрессируя во времени.

2) - Входные данныеравняется только x, целевые данные сдвигаются на 30 шагов вперед для прогнозирования (y + 1, y + 2 ... y + 30).Попытка спрогнозировать будущее, взяв первую выборку x в тестовых данных и предсказав с ее помощью 30 шагов в будущее.

3) - При сочетании обоих методов входные данные сдвигаются назад ив примере, показанном ниже, были использованы 101 временной шаг, включая текущий временной шаг (х-100, х-99 ... х).Целевые данные, аналогичные реализации 2, смещены на 30 временных шагов в будущее (y + 1, y + 2 ... y + 30).При этом я пытаюсь предсказать будущее, взяв 101 шаг из первых n строк тестовых данных и прогнозируя оттуда 30 шагов в будущее.

Для всех тестов я обрезал конец своегоНабор данных в произвольном количестве (последние ~ 10% от общего набора данных), разбить все до отсечки на обучение / проверку (80/20) и сохранить все после отсечки для целей тестирования и прогнозирования.

Что касается сетевых архитектур, я пробовал множество разных, от двунаправленного LSTM до многовариантного CNN / GRU, до волнового типа, подобного реализации CNN, и все они дают результаты прогнозирования, которые являются плохими в достаточно похожих.Я чувствую, что это либо проблема манипулирования данными, либо проблема в том, что я не понимаю, как работает model.predict () или вывод моей модели.

Архитектуры, которые я буду использовать для каждой нижеприведенной реализации:

1) причинное расширение CNN

2) два слоя LSTM

схемы архитектуры нейронной сети здесь: https://imgur.com/a/cY2RWNG

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

--- Первая реализация ---

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

Реализация 1 - Графики для CNN / LSTM: изображения 1-7 https://imgur.com/a/36DZCIf

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

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

Изображение 1 - скользящее окно, настроенное для этой реализации с использованием одной и двух функций и диапазона чисел для удобства просмотра

CNN:

(описание изображений 2 и 3 в альбоме)

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

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

Я действительно даже не знаю, что сказать об этом прогнозе, он очень плохой ...

LSTM:

(изображения 5 и 6 в альбоме)

Изображение 7 - Прогноз «скользящего окна»: https://i.imgur.com/Ywf6xvr.png

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

--- вторая реализация ---

реализация 2 - графики для обоих CNN / LSTM: изображения 1-7 https://imgur.com/a/3CAk1xc

Для этой попытки я сделал целевой прогноз много раз в будущем.В этой реализации модель принимает текущий временной шаг (x) функций и пытается предсказать цену закрытия по y + 1, y + 2, y + 3 и т. Д. Здесь существует только одно предсказание - последовательность временных шаговв будущее.

Те же соглашения о графике и сети, что и в реализации 1, применимы и к этому.

Изображение 1 - Настройка входных и целевых данных с использованиемдиапазон и только одна или две функции для удобства просмотра.

CNN:

(описание изображений 2 и 3 в альбоме)

Изображение 4 - Печатьвсе 30 предсказаний, сделанных из первого ряда элементов данных после обрезания ... это ужасно, почему запуск снова находится рядом с последней известной точкой данных?Я не понимаю, как он может предсказать, что y + 1 будет настолько далеко от цены закрытия x, когда в каждом случае его обучения y + 1 почти наверняка был чрезвычайно близок к x.

LSTM:

(изображения 5 и 6 в альбоме)

Изображение 7 - Все 30 прогнозов на будущее сделаны из первого ряда данных отсечки: опять-таки, оба повсюдуи предсказания начинаются далеко не от последней точки фактических данных, не зная, что еще добавить.

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

--- Третье внедрение --

Реализация 3 - Графики для CNN / LSTM: изображения 1-7 https://imgur.com/a/clcKFF8

Это была моя последняя идея для прогнозирования будущего, и по сути это комбинация первых двух.Для этой реализации я беру xn (x, x-1, x-2, x-3) и т. Д., Что аналогично первой реализации, и устанавливаю целевые данные равными y + 1, y + 2, y + 3, что аналогично второй реализации.Моей целью для прогнозирования с помощью этой стратегии была та же стратегия, что и для второй реализации, в которой я прогнозировал бы 30 дней в будущем, но вместо того, чтобы делать это с одним временным шагом функций, я бы делал это много раз в прошлом.Я надеялся, что эта реализация даст прогнозу достаточное количество вспомогательных данных для точного прогноза будущего

Изображение 1 - Входные данные или «x» и целевые данные или «y» реализация и настройка,Я снова использую диапазон чисел.В этом примере входные данные имеют 2 свойства, включая текущий временной шаг (x) и 4 временных шага, смещенных назад (x-1, x-2, x-3, x-4), а целевые данные имеют 5 временных шагов в будущее.(y + 1, y + 2, y + 3, y + 4, y + 5)

CNN:

(описание изображений 2 и 3 в альбоме)

Изображение 4 - 30 прогнозов на будущее с использованием 101 временного шага от x

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

LSTM:

(описание изображений 5 и 6 в альбоме)

Изображение 7 - 30 прогнозов на строку входных данных с 101 временным шагом.

На самом деле это имеет какое-то действие, я думаю, но оно повсюду, не начинается рядом с последней точкой фактических данных и явно не совсем точно.

закрывающие мысли

Я также пытался удалить целевую переменную (цену закрытия) из входных данных, но она, кажется, не сильно изменилась и прошлое nя бы подумал, что дни закрытия данных должны быть доступны для модели.

Первоначально я MinMax Scaled все мои данные на моей странице предварительной обработки и не инвертировал никакие данные.Результаты были в основном такими же плохими, как и в приведенных выше примерах.Для приведенных выше примеров я min max масштабировал наборы данных прогнозирования, проверки и тестирования отдельно, чтобы они находились в диапазоне 0,2–0,8.Для фактических прогнозов я переделал данные в обратном_трансформированном виде перед тем, как нанести их на график по фактической цене закрытия, которая никогда не изменялась.

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

Несколько других вещей, связанных с этим, с которыми я сталкивался / пробовал:

Я кратко экспериментировал сиспользуя модель с сохранением состояния, в которой я возвращаю reset_states () после каждого прогноза до некоторого умеренного успеха.

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

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

Любые советы / критика на все, что вы могли бы дать, будет принята с благодарностью, я действительно неуверен, как прогрессировать отсюда.Заранее спасибо!

1 Ответ

0 голосов
/ 27 мая 2019

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

Позже я отказался от LSTM, GBT и начал внедрять алгоритмы из statsmodels.tsa, ARIMA, SARIMA, я предлагаю вам тоже прочитать о них.Очень легко реализовать, не нужно беспокоиться о скользящем окне, перемещении данных на несколько временных меток назад, обо всем позаботится.Просто тренируйтесь, настраивайте параметры и прогнозируйте следующие временные метки.

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

model=statsmodels.api.tsa.SARIMAX(train_df,order=(1,0,1),seasonal_order=(1,1,0,24))
model = model.fit()

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

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