Перевод. Оригинал: Machine Learning Logistic Regression In Python: From Theory To Trading
В этом посте мы узнаем, как логистическая регрессия работает в машинном обучении и применим ее, чтобы предсказать движение цены акций в Python.
Любые задачи машинного обучения можно условно разделить на две категории:
- ожидаемый результат определен;
- ожидаемый результат не определен.
Первый случай называется обучением с учителем. Второй, где наборы данных состоят из входных данных без помеченных ответов, называется обучением без учителя. Существует также еще одна категория, называемая обучением с подкреплением.
Логистическая регрессия относится к категории обучения с учителем; она измеряет взаимосвязь между категориально-зависимой переменной и одной или несколькими независимыми переменными путем оценки вероятностей с использованием логистической/сигмоидной функции. Несмотря на название «логистическая регрессия», она не используется для решения проблемы регрессии, где задача заключается в прогнозировании реального значения. Это алгоритм классификации, который используется для прогнозирования двоичного результата (1/0, -1/1, True/False) для данного набора независимых переменных.
Логистическая регрессия немного похожа на линейную регрессию, мы можем говорить о ней как об обобщенной линейной модели. В линейной регрессии мы прогнозируем численный вывод «y» на основе взвешенной суммы входных переменных.
Целью линейной регрессии является оценка значений для коэффициентов модели c, w1, w2, w3 ... .wn и подгонки обучающих данных с минимальной квадратичной ошибкой и прогнозирования вывода y.
Логистическая регрессия делает то же самое, но с одним дополнением. Модель логистической регрессии вычисляет взвешенную сумму входных переменных, аналогичную линейной регрессии, но она вычисляет результат с помощью специальной нелинейной функции, логистической или сигмоидной функции для получения значения y. Здесь вывод двоичный или в виде 0/1 или -1/1.
Сигмоидальная/логистическая функция задается следующим уравнением.
y = 1 / 1+ e-x
Как вы можете видеть на графике, это S-образная кривая, которая приближается к 1, когда значение входной переменной увеличивается выше 0, и приближается к 0 при уменьшении входной переменной ниже 0. Значение сигмоидной функции равно 0,5 когда входная переменная равна 0.
Таким образом, если результат больше 0,5, мы можем классифицировать результат как 1 (или положительный), а если он меньше 0,5, мы можем классифицировать его как 0 (или отрицательный).
Теперь давайте рассмотрим задачу прогнозирования движения цены акций. Если цена закрытия завтрашнего дня выше сегодняшней цены закрытия, мы будем покупать акции (1), иначе мы ее будем продавать (-1). Если результат равен 0,7, то можно сказать, что существует вероятность 70%, что цена закрытия завтрашнего дня выше сегодняшней цены закрытия и мы классифицируем ее как 1.
Теперь у нас есть основное понимание логистической регрессии и сигмоидной функции. Мы узнаем, как реализовать логистическую регрессию в Python и предсказывать движение цены акций, используя вышеуказанное условие.
Импорт библиотек
Мы начнем с импорта необходимых библиотек.
# работа с даннымиimportnumpy as npimportpandas as pd# технические индикаторыimporttalib as ta# построение графиковimportmatplotlib.pyplot as plt# машинное обучениеfromsklearn.linear_modelimportLogisticRegressionfromsklearnimportmetricsfromsklearn.cross_validationimportcross_val_score# скачивание данныхfrompandas_datareaderimportdata as pdrimportfix_yahoo_finance as yfyf.pdr_override()
Импорт данных
Мы импортируем данные Nifty 50 с 1 января 2000 года по 1 января 2018 года. Данные импортируются с yahoo finance с помощью ‘pandas_datareader’.
df=pdr.get_data_yahoo('^NSEI','2000-01-01','2018-01-01')df=df.dropna()df=df.iloc[:,:4]df.head()
Задаем предикторы (независимые переменные)
Мы будем использовать в качестве предикторов 10-дневную скользящую среднюю, корреляцию, индекс относительной силы (RSI), разницу между ценой открытия вчера и сегодня, ценой закрытия вчерашнего дня и ценой открытия сегодня, значениями цен open, high, low и close.
df['S_10']=df['Close'].rolling(window=10).mean()df['Corr']=df['Close'].rolling(window=10).corr(df['S_10'])df['RSI']=ta.RSI(np.array(df['Close']), timeperiod=10)df['Open-Close']=df['Open']-df['Close'].shift(1)df['Open-Open']=df['Open']-df['Open'].shift(1)df=df.dropna()X=df.iloc[:,:9]
Задаем целевую (зависимую) переменную
Зависимая переменная такая же, как обсуждалось в приведенном выше примере. Если цена закрытия завтрашнего дня выше сегодняшней цены закрытия, мы будем покупать акции (1), иначе мы ее будем продавать (-1).
y=np.where (df['Close'].shift(-1) > df['Close'],1,-1)
Разделяем наш набор данных
Мы разделим набор данных на обучающий набор и тестовый набор. Мы будем использовать 70% наших данных для обучения, а остальные 20% - для тестирования. Для этого мы создадим переменную split, которая будет делить data frame в соотношении 70-30. «X_train» и «Y_train» - это обучающий набор данных. «X_test» и «Y_test» - это тестовый набор данных.
split=int(0.7*len(df))X_train, X_test, y_train, y_test=X[:split], X[split:], y[:split], y[split:]
Применение логистической регрессии
Мы создадим экземпляр модели логистической регрессии с использованием функции «LogisticRegression» и применим модель к обучающему набору данных с помощью функции «fit».
model=LogisticRegression()model=model.fit (X_train,y_train)
Оцениваем коэффициенты
pd.DataFrame(zip(X.columns, np.transpose(model.coef_)))
Вычисляем вероятности классов
Мы вычислим вероятности классов для тестового набора данных, используя функцию «pred_proba».
probability=model.predict_proba(X_test)printprobability
Прогнозируем метки классов
Затем мы будем прогнозировать метки классов, используя функцию predict, для тестового набора данных.
predicted=model.predict(X_test)
Если вы выведете переменную «predicted», вы увидите, что классификатор прогнозирует 1, когда вероятность во втором столбце переменной «probability» больше 0,5. Когда вероятность во втором столбце меньше 0,5, классификатор прогнозирует -1.
Оцениваем модель
Матрица ошибок
Матрица ошибок используется для описания эффективности модели классификации на тестовом наборе данных, для которых известны истинные значения. Мы вычислим матрицу ошибок, используя функцию confusion_matrix.
printmetrics.confusion_matrix(y_test, predicted)
Отчет о классификации
Это еще один метод оценки эффективности модели классификации.
printmetrics.classification_report(y_test, predicted)
f1-score сообщает вам точность классификатора при классификации точек данных в этом конкретном классе по сравнению со всеми другими классами. Она рассчитывается путем принятия гармонического среднего значения точности и полноты. support - это количество образцов истинного ответа, лежащих в этом классе.
Точность модели
Мы вычислим точность модели на тестовом наборе данных, используя функцию «score».
printmodel.score(X_test,y_test)0.528
Мы можем видеть, что точность составила 52%.
Кросс-валидация
Мы проверим точность модели с использованием 10-кратной перекрестной проверки. Для этого мы будем использовать функцию «cross_val_score», которую мы импортировали из библиотеки «sklearn.cross_validation».
cross_val=cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10)printcross_valprintcross_val.mean()
Точность по-прежнему составляет 52%, что означает, что модель работает нормально.
Создание торговой стратегии с использованием модели
Мы будем прогнозировать сигнал на покупку (1) или продажу (-1) и рассчитаем совокупный доход по Nifty 50 для тестового набора данных. Затем мы рассчитаем кумулятивную прибыть по стратегии на основе сигнала, предсказанного моделью в тестовом наборе данных. Мы также построим график совокупной прибыли.
df['Predicted_Signal']=model.predict(X)df['Nifty_returns']=np.log(df['Close']/df['Close'].shift(1))Cumulative_Nifty_returns=np.cumsum(df[split:]['Nifty_returns'])df['Startegy_returns']=df['Nifty_returns']*df['Predicted_Signal'].shift(1)Cumulative_Strategy_returns=np.cumsum(df[split:]['Startegy_returns'])plt.figure(figsize=(10,5))plt.plot(Cumulative_Nifty_returns, color='r',label='Nifty Returns')plt.plot(Cumulative_Strategy_returns, color='g', label='Strategy Returns')plt.legend()plt.show()
Заключение
Можно заметить, что модель логистической регрессии предсказывает классы с точностью приблизительно 52% и дает хорошие результаты. Теперь настала ваша очередь поиграть с кодом, изменив параметры и создав на его основе свою торговую стратегию.
Отказ от ответственности: все инвестиции и торговля на фондовом рынке связаны с риском. Любые решения о размещении средств на финансовых рынках, в том числе торговля акциями или опционами или другими финансовыми инструментами, являются личным решением, которое должно быть сделано только после тщательных исследований, включая личную оценку риска и финансовую оценку и привлечение профессиональной помощи в той мере, в какой вы считайте нужным. Торговые стратегии или связанная с ними информация, упомянутая в этой статье, предназначена только для информационных целей.
Обновление
Мы заметили, что некоторые пользователи сталкиваются с проблемами при загрузке рыночных данных с платформ Yahoo и Google Finance. Если вы ищете альтернативный источник рыночных данных, вы можете использовать Quandl для этого.













Комментариев нет:
Отправить комментарий