Руководство для начинающих по анализу и визуализации цен на акции с помощью 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 нельзя использовать напрямую в качестве регрессора. График ниже для фактической цены и прогнозируемой цены показывает, что наша модель может прогнозировать тенденцию изменения цены.
Код для этой статьи можно найти здесь.
Выводы
- Мы можем попробовать LSTM вместо полностью подключенной нейронной сети, поскольку LSTM лучше работает с данными временных рядов.
- Мы можем выполнить настройку гиперпараметров для всех моделей для получения лучших результатов.
- Мы можем провести анализ настроений и добавить его в качестве функции прогнозирования цены.
Если вы хотите связаться, свяжитесь со мной в моем LinkedIn
Спасибо, что прочитали пост.