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

суббота, 11 января 2020 г.

Стратегия трейдинга S&P500 с использованием алгоритма классификации в Python

Перевод. Оригинал: Machine Learning Classification Strategy In Python

В этом посте мы шаг за шагом реализуем алгоритм классификации машинного обучения на S&P500 с использованием классификатора опорных векторов (SVC). SVC - это алгоритм классификации с учителем.  Алгоритму классификации предоставляется набор обучающих данных, которые относится к одной из известных категорий. Например, категориями могут быть либо покупка, либо продажа акций. Алгоритм классификации строит модель на основе обучающих данных, а затем классифицирует тестовые данные в одну из категорий.

Теперь давайте реализуем стратегию классификации машинного обучения в Python.

Шаг 1: Импорт библиотек

На этом этапе мы импортируем все необходимые библиотеки, которые понадобятся для создания стратегии.

  • # Алгоритмы классификации
  • from sklearn.svm import SVC
  • from sklearn.metrics import scorer
  • from sklearn.metrics import accuracy_score
  •  
  • # Для работы с данными
  • import pandas as pd
  • import numpy as np
  •  
  • # Для визуализации
  • import matplotlib.pyplot as plt
  • import seaborn
  •  
  • # Для считывания данных
  • from pandas_datareader import data as pdr

Шаг 2: Получение данных

Мы будем загружать данные S&P500 из Google Finance с помощью pandas_datareader.
После этого мы отбросим отсутствующие значения из данных и построим график цен закрытия S&P500.

  • Df = pdr.get_data_yahoo('SPY', start="2012-01-01", end="2017-10-01")       
  • Df= Df.dropna()
  • Df.Close.plot(figsize=(10,5))
  • plt.ylabel("S&P500 Price")
  • plt.show()



Шаг 3: Определение целевой переменной

Целевая переменная - это переменная, которую прогнозирует алгоритм классификации. В этом примере целевой переменной является то, будет ли цена S&P500 закрываться вверх или вниз на следующий торговый день.

Сначала мы определим фактический торговый сигнал, используя следующую логику - если цена закрытия следующего торгового дня больше цены закрытия сегодняшнего дня, то мы будем покупать индекс S&P500, в противном случае мы будем продавать индекс S&P500. Мы будем хранить +1 для сигнала на покупку и -1 для сигнала на продажу.

= np.where(Df['Close'].shift(-1) > Df['Close'],1,-1)

Шаг 4: Создание переменных предикторов

X - это набор данных, который содержит переменные предикторы, которые используются для прогнозирования целевой переменной, 'y'. X состоит из переменных, таких как «Open - Close» и «High - Low». Их можно понимать как индикаторы, на основе которых алгоритм будет прогнозировать цену.

  • Df['Open-Close'= Df.Open - Df.Close
  • Df['High-Low'= Df.High - Df.Low
  • X=Df[['Open-Close','High-Low']]

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

Шаг 5: Разделение набора данных на обучающую и тестовую выборки

На этом этапе мы разделим данные на обучающую и тестовую выборки.

Во-первых, 80% данных используется для обучения, а остальные данные для тестирования.

X_train и y_train - обучающая выборка
X_test и y_test - тестовая выборка

  • split_percentage = 0.8
  • split = int(split_percentage*len(Df))
  •  
  • # обучающая выборка
  • X_train = X[:split]
  • y_train = y[:split]
  •  
  • # тестовая выборка
  • X_test = X[split:]
  • y_test = y[split:]

Шаг 6: Создание модели классификации с использованием обучающей выборки

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

cls = SVC().fit(X_train, y_train)

Шаг 7: Точность модели классификации

Мы вычислим точность модели классификации для обучающей и тестовой выборок, сравнив фактические значения торгового сигнала с прогнозируемыми значениями. Функция precision_score() будет использоваться для вычисления точности.

Синтаксис: precision_score (target_actual_value, target_predicted_value)

target_actual_value: правильные значения сигнала
target_predicted_value: прогнозируемые значения сигнала

  • accuracy_train = accuracy_score(y_train, cls.predict(X_train))
  • accuracy_test = accuracy_score(y_test, cls.predict(X_test))
  • print('\nTrain Accuracy:{: .2f}%'.format(accuracy_train*100))
  • print('Test Accuracy:{: .2f}%'.format(accuracy_test*100))


Train Accuracy: 55.45%
Test Accuracy: 53.10%

Точность 50% + будет свидетельствовать о том, что классификационная модель эффективна.

Шаг 8: Прогноз

Мы прогнозируем сигнал (покупка или продажа) для тестовой выборки, используя функцию cls.predict(). Затем мы рассчитаем прибыли стратегии на основе сигнала, предсказанного моделью в наборе тестовых данных. Мы сохраним его в столбце «Strategy_Return», а затем построим график совокупной прибыли стратегии.

  • Df['Predicted_Signal'= cls.predict(X)
  • Df['Return'= np.log(Df.Close.shift(-1/ Df.Close)*100
  • Df['Strategy_Return'= Df.Return * Df.Predicted_Signal
  • Df.Strategy_Return.iloc[split:].cumsum().plot(figsize=(10,5))
  • plt.ylabel("Strategy Returns (%)")
  • plt.show()



Как видно из графика, стратегия классификации обеспечивает прибыль около 15% на тестовой выборке.

Обновление

Мы заметили, что некоторые пользователи сталкиваются с проблемами при загрузке рыночных данных с платформ Yahoo и Google Finance. Если вы ищете альтернативный источник рыночных данных, вы можете использовать Quandl.

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

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