Члены команды

Авторы: Джеймс Фостер, Алекс Лю и Друв Байс

Вдохновение

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

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

Цель и установка

В этом проекте была предпринята попытка предсказать акции двумя способами: «будет ли завтрашняя цена расти или падать?» и «Какова будет цена?»

На первый вопрос будет дан ответ с использованием модели бинарной классификации. На второй вопрос будет дан ответ с использованием рекуррентной нейронной сети с долговременной кратковременной памятью (LSTM). Оба из них будут обсуждаться более подробно в соответствующих разделах этого поста.

Данные

Данные были собраны с помощью Yahoo Finance. Обучение и прогнозы были сделаны на основе истории цен на акции Microsoft, предоставляя данные с 1986 по 2022 год.

Наряду со стоимостью акций на момент закрытия каждого торгового дня Yahoo Finance также предоставляет данные о дневной цене при открытии, дневном максимуме, дневном минимуме и объеме акций, которые были проданы в тот день.

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

Будет ли завтрашняя цена расти или падать?

Предсказать, будет ли что-то расти или падать, можно с помощью модели бинарной классификации, потому что наши цели — либо 1 (рост), либо 0 (снижение). Для моделей бинарной классификации существует множество вариантов, поэтому были предприняты три попытки: классификатор XGBoost, классификатор CatBoost и классификатор RandomForest.

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

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

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

def backtest(data, model, predictors, step, start):
    predictions = []
    # Loop over the dataset in increments
    for i in range(start, data.shape[0], step):
        # Split into train and test sets
        train = data.iloc[0:i].copy()
        test = data.iloc[i:(i+step)].copy()

        # Fit the model
        model.fit(train[predictors], train["Target"])

        # Make predictions
        preds = model.predict_proba(test[predictors])[:,1]
        preds = pd.Series(preds, index=test.index)
        preds[preds > .6] = 1
        preds[preds<=.6] = 0

        # Combine predictions and test values
        combined = pd.concat({"Target": test["Target"],"Predictions": preds}, axis=1)

        predictions.append(combined)

    return pd.concat(predictions)

Классификатор XGBoost

При первом обучении этой модели без какой-либо разработки функций или тестирования на исторических данных классификатор XGBoost имел показатель точности 50,60%. По сути подбрасывание монеты. При тестировании на исторических данных этот показатель увеличился до 52,53 %, но когда обучение включало всю разработку функций, показатель точности увеличился всего на 0,08 % до 52,61 %. Вряд ли улучшение вообще.

Классификатор CatBoost

При первом тестировании этой модели без какой-либо разработки функций или тестирования на исторических данных модель классификатора CatBoost имела показатель точности 47,14%. Хуже, чем подбрасывание монетки! При тестировании на истории этот показатель увеличился до 51,23%. Когда обучение включало в себя всю разработку функций, оценка увеличилась до 53,77%, что в конечном итоге превзошло модель XGBoost.

Классификатор RandomForest

При первом тестировании этой модели без какой-либо разработки функций или обратного тестирования модель классификатора RandomForest имела показатель точности 50,76%. Как и XGBoost, по сути, подбрасывание монеты. При тестировании на истории это фактически уменьшилось до 50,20%. Однако, когда обучение включало всю разработку признаков, показатель увеличился до 59,92%, превзойдя другие модели бинарной классификации.

Выше приведен график, сравнивающий лучший результат каждой модели друг с другом при каждом расчете показателя точности. Из результатов мы видим, что модель RandomForest показала наилучшую точность, когда речь шла о прогнозировании роста или падения акций Microsoft на следующий день, с результатом ~ 60%. Ниже показаны бинарные прогнозы модели RandomForest для акций Microsoft за последние два месяца.

Были предприняты попытки еще больше повысить точность классификатора RandomForest за счет настройки гиперпараметров с помощью RandomizedSearchCV, но, как ни странно, это снизило показатель точности модели.

Какова будет цена?

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

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

LSTM чувствительны к масштабу и форме входных данных. Таким образом, обучающие данные были перемасштабированы в диапазоне от 0 до 1. Кроме того, входные данные должны иметь определенную форму: [выборки, временные шаги, признаки]. Данные, загруженные из Yahoo Finance, были представлены в виде: [примеры, характеристики]. Чтобы преобразовать данные, для удовлетворения требований использовался метод reshape() numpy.

Наконец, для создания LSTM мы начали с последовательной модели keras и добавили два скрытых слоя с 50 нейронами LSTM и плотный слой с одним выходом. Было выполнено разделение обучения/тестирования 80/20, и LSTM был обучен на значениях цен акций закрытия. Это привело к убытку в размере 1,8273e-05, а когда была поставлена ​​задача спрогнозировать цену акций Microsoft за последние 6,5 лет на основе предшествующих 60 дней, точность модели составила 92,81%.

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

Теперь вы можете подумать: «Точность предсказания акций составляет 92%? Похоже на печатающую монету. Ну, есть два предостережения, которые привели к такому высокому показателю точности. Во-первых, набор данных, используемый для прогнозирования цены акций, имеет ограниченные возможности. Никакие новые законы не используются для прогнозирования цены, не рассматриваются изменения в руководстве, а финансовое состояние компании используется в качестве исходных данных для обучения LSTM. Благодаря этому мы можем точно предсказать исторические цены акций на момент закрытия, исходя из предположения, что основным предиктором будущей цены акции является ее предыдущая цена. Однако в реальных приложениях каждый день становится гораздо более непредсказуемым из-за бесконечного количества внешних воздействий на цену акций.

Другое предостережение заключается в том, что акции, особенно крупные, такие как MSFT, имеют средний дневной диапазон около 2%. Это означает, что они будут двигаться только примерно на 2% от их предыдущей цены закрытия. Это означает, что когда LSTM использует данные за последние 60 дней для определения тренда в цене акций и использует их для прогнозирования цены закрытия на следующий день, в большинстве дней цена не колеблется выше 2%, и, следовательно, модель очень точная. В некоторые дни могут быть большие колебания, и модель будет менее точной, что мы можем видеть на приведенном выше графике примерно во время удара COVID-19, и Microsoft начала наблюдать огромные изменения в ежедневной цене акций, которые наша модель с трудом предсказывал.

Заключение

Целью этого проекта было создание моделей машинного обучения, которые могли бы предсказывать акции одним из двух способов: ответить на вопрос «будет ли завтрашняя цена расти или падать?» или «Какова будет цена?» Чтобы ответить на первый вопрос, оказалось, что бинарная классификация RandomForest имеет самую высокую точность из трех различных задач бинарной классификации. Однако наилучшая достигнутая точность составила всего 59,99%. Между тем, чтобы ответить на второй вопрос, была построена рекуррентная нейронная сеть LSTM, которая могла предсказать значение исторической цены закрытия Microsoft с точностью 92,81%, но с некоторыми серьезными оговорками. Используя гораздо больший набор данных и обучение на более волатильных акциях, эта модель могла бы точно прогнозировать акции в режиме реального времени, но на данный момент она находит свой успех в вакууме.