Ссылка на Github: https://github.com/stoictrader/LSTM_categorical

Причина этого поста - интересное обсуждение, которое я провел в твиттере относительно сверточной нейронной сети (CNN) для прогнозирования рынка https://twitter.com/BeingHorizontal/status/1205388149767077888?s=20

«Подача изображений шаблонов акций на CNN и предсказание рынка точно так же, как CNN предсказывает кошек и собак. Я только что просмотрел код, в котором кто-то пытался это сделать. Ваши мысли о подходе? »

Теперь давайте посмотрим на этот гипотетический сценарий.

Представьте себе данные, которые позволяют прогнозировать заранее. Он не будет иметь корреляции с предсказаниями на временном шаге (t + 1), но будет иметь определенную корреляцию с предсказаниями в будущем (здесь t + 10). Другими словами, если данные старше 10 периодов, они предсказывают только 1 период вперед. Мы называем это контекстом.

Вот наш пользовательский временной ряд выглядит так

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

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

Я оставил выбросы равными нулю для простоты, что означает, что модель будет предсказывать варианты 0,1 и 3,4. Так выглядит сериал.

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

Теперь представьте, что нам нужно использовать для этого сверточную нейронную сеть (CNN). Очевидно, он не может отличить ч / б бычий и крайне бычий сценарии, поскольку CNN не умеет оценивать масштабы. Изображения для однозначной положительной последовательности будут выглядеть точно так же, как изображения для двузначных + ve последовательностей, то же самое для медвежьих моделей.

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

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

Раньше я проводил несколько экспериментов со случайным лесом (RF), используя аналогичные временные ряды. Первая проблема заключается в том, что RF будет использовать большой кусок обучающих данных, чтобы разделить его на ветви на основе цели в t + 1, которые, как мы знаем, являются случайными, они связаны только с временным шагом t + 11. Теоретически мы можем вводить данные в период t - 10, но этот подход не является надежным. Это потому, что в этом примере нам известен определенный промежуток времени. В среде реального времени мы никогда не знаем, сколько контекста необходимо для точных прогнозов, это может быть t-10 или t-30.

Модель глубокого обучения на основе LSTM будет идеальным выбором для решения такой проблемы.

Я использовал 15 временных шагов в LSTM (последовательностях). 15 строк будут использоваться в качестве контекста для прогнозирования цели в t + 1. Из этих 15 строк только несколько строк будут иметь полезную связь с целевой переменной. На этом снимке экрана ячейки в столбце «входы» и «цели», которые имеют прямую корреляцию, обозначены одним цветом. По мере того, как мы сдвигаем окно вниз на 1, как показано на этом рисунке, количество строк, которые имели полезную связь с целью, будет уменьшаться на 1 и так далее.

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

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

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

Так выглядит сеть LSTM.

Результаты: точность почти 98% и почти идеальная сходимость.

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

На этом пока все, adios amigos.