Перевод. Оригинал: 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 и предсказывать движение цены акций, используя вышеуказанное условие.
Импорт библиотек
Мы начнем с импорта необходимых библиотек.
# работа с данными
import
numpy as np
import
pandas as pd
# технические индикаторы
import
talib as ta
# построение графиков
import
matplotlib.pyplot as plt
# машинное обучение
from
sklearn.linear_model
import
LogisticRegression
from
sklearn
import
metrics
from
sklearn.cross_validation
import
cross_val_score
# скачивание данных
from
pandas_datareader
import
data as pdr
import
fix_yahoo_finance as yf
yf.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)
print
probability
Прогнозируем метки классов
Затем мы будем прогнозировать метки классов, используя функцию predict, для тестового набора данных.
predicted
=
model.predict(X_test)
Если вы выведете переменную «predicted», вы увидите, что классификатор прогнозирует 1, когда вероятность во втором столбце переменной «probability» больше 0,5. Когда вероятность во втором столбце меньше 0,5, классификатор прогнозирует -1.
Оцениваем модель
Матрица ошибок
Матрица ошибок используется для описания эффективности модели классификации на тестовом наборе данных, для которых известны истинные значения. Мы вычислим матрицу ошибок, используя функцию confusion_matrix.
print
metrics.confusion_matrix(y_test, predicted)
Отчет о классификации
Это еще один метод оценки эффективности модели классификации.
print
metrics.classification_report(y_test, predicted)
f1-score сообщает вам точность классификатора при классификации точек данных в этом конкретном классе по сравнению со всеми другими классами. Она рассчитывается путем принятия гармонического среднего значения точности и полноты. support - это количество образцов истинного ответа, лежащих в этом классе.
Точность модели
Мы вычислим точность модели на тестовом наборе данных, используя функцию «score».
print
model.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
)
print
cross_val
print
cross_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 для этого.
Комментариев нет:
Отправить комментарий