По крайней мере, для LSTM я использую в этой статье.

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

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

В этой статье я собираюсь использовать модель LSTM для прогнозирования будущей цены SPY, ETF индекса S&P 500. Я также попытаюсь оценить, может ли этот прогноз генерировать торгуемые сигналы для получения прибыли.

Код

В этом разделе я объясню данные и код, которые я использую. Я использовал Python и VS Code для реализации своего анализа. Я все очень подробно объясняю. Не стесняйтесь пропустить эту часть, если не хотите возиться с кодированием.

Здесь Github.

Вот библиотеки, которые я использовал:

Сначала загрузите дневные данные и сохраните цену закрытия каждого дня:

Поскольку я пытаюсь предсказать индекс, я бы включил по крайней мере 1 полный экономический цикл. SPY был впервые представлен в 1990 году, что позволило ему пережить 2 периода (пузырь доткомов и финансовый кризис 08). 2000 год - это начало пузыря доткомов. Если вы хотите попробовать это сами, вы можете начать с самого начала SPY.

Эти данные содержат 5221 строку, что означает 5221 торговый день и 1 столбец, который представляет собой цену закрытия.

Во-вторых, я разделил данные на набор для обучения и набор для тестирования.

При выборе обучающей выборки я использую первые 80% всей выборки. Линия

training_data_len = math.ceil (len (набор данных) * 0,8)

сообщает нам наименьшее целое число, которое составляет не менее 80% длины наших данных (всего 5221 строка). 0,8 х 5221 = 4 176,8. Наименьшее целое число, которое не меньше 4 176,8, равно 4 177, поэтому это выражение дает длину обучающих данных - 4 177. Таким образом, от наблюдения номер 4178 до конца, 5,221 будет нашим набором для тестирования.

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

Этот шаг также включает цикл при построении переменных x и y в наборе обучающих данных. Обоснование кода следующее: для каждой цены закрытия в определенную дату я хочу использовать цены закрытия за предыдущие 60 дней, чтобы предсказать ее. Если данные организованы в хроническом порядке и если pstep = 0, первые 60 наблюдений должны предсказывать 61-е наблюдение, со 2-го по 61-е наблюдения должны предсказывать 62-е наблюдение и так далее. Индекс i должен идти от 60 до конца обучающих данных. В каждом столбце должно быть 60 строк, и каждая ячейка имеет 1 значение, которое является ценой закрытия.

Затем нам нужно изменить форму данных, поскольку LSTM ожидает, что данные будут трехмерными - количество выборок по количеству временных шагов по количеству функций. Количество временных шагов - 60, а количество функций - 1. Количество выборок - это, в основном, количество повторов, которое мы можем сделать, чтобы сделать прогнозы.

Затем мне нужно построить модель, скомпилировать модель и оценить параметры (соответствовать модели). Количество выбранных мной нейронов тривиально. Результат качественно такой же, как для 10 или 100 нейронов. Я вообще-то здесь переборщил. Если я переборщу, то результаты будут очень специфичными для каждого образца.

Визуализация результатов

Итак, я рисую временной ряд прогнозируемого и реализованного значения на этом графике. Я использую pstep = 15, что означает, что я прогнозирую цену на 15 дней позже, используя 60 дней раньше.

Я считаю, что это видно в большинстве статей о LSTM. Если вы увеличите период проверки, вы увидите, что модель завышает оценки в одни периоды и недооценивает другие. Это делает модель «в среднем» предсказывающей штраф в будущем из-за функции потерь среднеквадратичной ошибки.

На следующем рисунке я изображаю фактическую цену через 15 дней и прогнозируемую цену через 15 дней вместе с текущей ценой закрытия. Смотрю первые 100 наб.

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

Вердикт

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