рекомендации

пятница, 10 мая 2019 г.

Логистическая регрессия в Python: от теории до трейдинга


В этом посте мы узнаем, как логистическая регрессия работает в машинном обучении и применим ее, чтобы предсказать движение цены акций в 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()

Выведем первые пять строк столбцов ‘Open’, ‘High’, ‘Low’, ‘Close’.


Задаем предикторы (независимые переменные)

Мы будем использовать в качестве предикторов 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()
  • = df.iloc[:,:9]

Задаем целевую (зависимую) переменную

Зависимая переменная такая же, как обсуждалось в приведенном выше примере. Если цена закрытия завтрашнего дня выше сегодняшней цены закрытия, мы будем покупать акции (1), иначе мы ее будем продавать (-1).

  • = 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 для этого.

Комментариев нет:

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