Руководство для начинающих по анализу и визуализации цен на акции с помощью Pandas, sklearn и Keras.

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

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

Набор данных

Используя функцию веб-чтения pandas и Yahoo Finance API, мы извлечем данные об акциях.

import pandas as pd
import datetime
import pandas_datareader.data as web
from pandas import Series, DataFrame
start = datetime.datetime(2001, 1, 1)
end = datetime.datetime(2019, 9, 11)
df = web.DataReader("RELIANCE.NS", 'yahoo', start, end)
df.head()

Этот код будет извлекать данные с января 2001 года по сентябрь 2019 года из Yahoo Finance. Вы можете настроить код для извлечения данных из разных меток времени.

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

df['HighLow_PCT']= (df['High'] - df['Low']) / df['Close'] * 100
df['PCT_CHANGE'] = (df['Close'] - df['Open']) / df['Open'] * 100

Как использовать эти данные для прогнозов?

Итак, как мы знаем, нам нужны данные для обучения с меткой для обучения нашей модели. Но что произойдет, если мы будем использовать эти максимумы, минимумы, цены открытия и закрытия в качестве обучения и хотим прогнозировать «Скор. Закрытие» на каждый день. Если мы будем использовать эти данные для обучения, мы не сможем предсказать модель для будущих данных, поскольку у нас нет ни одного из этих значений для будущей временной метки.

Так как же решить эту проблему?

Мы можем рассматривать эту проблему как проблему временных рядов, и наличие только одной функции «Adj Close» будет использоваться для обучения модели и прогнозирования модели.

window_size = 32 #
num_samples = len(df) - window_size
indices = np.arange(num_samples).astype(np.int)[:,None] + np.arange(window_size + 1).astype(np.int)
data = df['Adj Close'].values[indices]

Мы подготавливаем данные таким образом, чтобы у нас было 32-дневное окно и мы прогнозировали цену акции на следующий день.

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

1) Хребтовая регрессия.

Ridge регрессия добавляет штраф L2 к обычным наименьшим квадратам, который предотвращает переобучение модели.

Для простоты мы не настраиваем гиперпараметры. Ниже простые коды создают регрессор гребня для набора данных.

ridge_model = Ridge()
ridge_model.fit(X_train, y_train)
# Infer
y_pred_ridge = ridge_model.predict(X_test)

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

2) Деревья повышения градиента

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

from sklearn.ensemble import RandomForestRegressor
rf_model = RandomForestRegressor()
rf_model.fit(X_train,y_train)
y_pred_rf = rf_model.predict(X_test)

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

3) Регрессор случайного леса

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

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

4) Нейронная сеть для регрессии

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

from keras import Sequential
from keras.layers import Dense,Dropout
def build_regressor():
    regressor = Sequential()
    regressor.add(Dense(units=128, input_dim=32))
    regressor.add(Dense(units=64))
    regressor.add(Dense(units=32))
    regressor.add(Dense(units=16))
    regressor.add(Dense(units=8))
    regressor.add(Dense(units=1))
    regressor.compile(optimizer='adam', loss='mean_squared_error',)
    return regressor
from keras.wrappers.scikit_learn import KerasRegressor
regressor = KerasRegressor(build_fn=build_regressor, batch_size=1024,epochs=1000)

Мы использовали оболочку Sklearn Keras, так как Keras нельзя использовать напрямую в качестве регрессора. График ниже для фактической цены и прогнозируемой цены показывает, что наша модель может прогнозировать тенденцию изменения цены.

Код для этой статьи можно найти здесь.

Выводы

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

Если вы хотите связаться, свяжитесь со мной в моем LinkedIn

Спасибо, что прочитали пост.