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

вторник, 2 октября 2018 г.

Использование нейронной сети для моделирования движения индекса S&P 500

Искусственные нейронные сети - это очень мощные и популярные алгоритмы машинного обучения, которые имитируют работу головного мозга при поиске паттернов в ваших данных. Хотя они могут быть очень сложными и требуют подгонки большого числа параметров, они могут быть очень эффективными. В этой статье мы дадим базовое введение в работу нейронных сетей, обсудим, как настраивать их параметры, и построим простую нейронную сеть для моделирования индекса S&P 500. В следующей части мы рассмотрим, как применить нашу модель к трейдингу. 
  
Что такое искусственная нейронная сеть? 

 
  
Искусственная нейронная сеть (ИНС) - представляет собой сеть соединенных между собой "нейронов". Эти нейроны взаимодействуют друг с другом с помощью большого количества взвешенных соединений. При повышении уровня входного сигнала до определенного уровня, задаваемого функцией активации, происходит активация нейрона. При активации он передает сигнал следующему уровню нейронов, при этом сила сигнала определяется весом каждого соединения. 
ИНС делают прогнозы, пропуская входной сигнал (в нашем случае индикаторы) через сеть нейронов, при этом нейроны срабатывают в зависимости от веса входящих сигналов. Конечный выходной сигнал определяется силой сигналов, поступающих из предыдущего слоя нейронов. Хотя такие сети имеют возможность смоделировать любой произвольно сложный набор данных, остается много вопросов о том, как должна строиться сеть. Вы должны определить количество слоев нейронов (называемых «скрытыми слоями»), количество нейронов в каждом слое, как активируется нейрон и как весы между нейронами меняются или обучаются со временем веса между нейронами. 
  
Определение параметров сети 
  
Одним из наиболее важных решений при использовании ИНС является определение архитектуры сети, количество скрытых слоев и количество нейронов в каждом слое. Первый или входной уровень задается вашим количеством входных сигналов, а конечный или выходной уровень определяется количеством выходных сигналов (в нашем случае мы просто хотим предсказать одну переменную, направление движения цены). Это оставляет вопросы о том, сколько скрытых слоев мне нужно и сколько нейронов я должен включить в каждый слой? Если у вас слишком мало скрытых слоев, вы не сможете моделировать сложные паттерны в своих данных, а если много, вы не сможете хорошо обобщать новые данные. Два скрытых слоя обычно обеспечивают достаточную гибкость для моделирования даже очень сложных наборов данных. 
  
Хорошее эмпирическое правило для определения количества нейронов в каждом скрытом слое состоит в том, что оно должен располагаться где-то между количеством входных и выходных сигналов. Однако наилучшие результаты часто обнаруживаются методом проб и ошибок, когда вы выбираете архитектуру древа с наименьшей ошибкой перекрестной проверки над вашими данными. 
  
В нашем примере мы будем использовать нейронную сеть из двух скрытых слоев с тремя нейронами в каждом. 
  
Теперь, когда у нас есть архитектура нашей сети, нам нужно выяснить, когда должен активироваться нейрон. В этом примере мы будем использовать функцию активации логистической сигмоиды, очень популярный метод, который позволяет нам моделировать нелинейные данные и ограничивать диапазон сигналов от 0 до 1. 
  
Последний шаг - выяснить, как мы будем определять веса между нейронами. Распространенным методом является «обратное распространение ошибок». Нейронная сеть пытается минимизировать квадратичное отклонение прогнозируемого значения от фактического для каждой точки данных. Ошибка сводится к минимуму с помощью градиентного спуска, который можно рассматривать как шаг в направлении веса, который уменьшает ошибку (размер этого шага известен как «скорость обучения»). Обратное распространение ошибок работает в обратном направлении от выходного уровня и корректирует веса между каждым нейроном по скорости обучения, пока не достигнет локального минимума ошибки или критериев остановки. 
  
Мы будем использовать алгоритм обратного распространения ошибок со скоростью обучения 0,001. 
  
Существует много более сложных параметров и методов построения ИНС; однако, это основные, о которых вам нужно знать, прежде чем двигаться вперед. Лучшие результаты обычно обнаруживаются путем оценки параметров по вашему конкретному набору данных. 
  
Теперь, когда мы знакомы с основными понятиями, давайте построим нашу нейронную сеть! 
  
Построение сети 
  
При использовании ИНС, особенно с функцией активации логической сигмоиды, важно помнить о том, что вам необходимо нормализовать данные между 0 и 1. 
  
Сначала установим библиотеки, необходимые для построения наших наборов данных. 

#Дает нам доступ к котировкам и индикаторам  
install.packages("quantmod") 
library("quantmod") 
# Содержит алгоритмы ИНС  
install.packages("neuralnet") 
library("neuralnet") 

#Задаем диапазон дат  
startDate<- span="">as.Date('2009-01-01') 
endDate<- span="">as.Date('2014-01-01') 

Получам OHLCV-данные S&P 500 с Yahoo Finance  
getSymbols("^GSPC",src="yahoo",from=startDate,to=endDate) 
[1] "GSPC" 

# Рассчитываем 3-периодный RSI   
> RSI3<-rsi span="">Op(GSPC),n=3)   

# Находим разницу между ценой открытия и 5-периодным EMA  
> EMA5<-ema span="">Op(GSPC),n=5)  
EMAcross<- span="">Op(GSPC)-EMA5 

# Получаем сингальную линию MACD  
> MACD<-macd span="">Op(GSPC),fast = 12, slow = 26, signal = 9)  
MACDsignal<- span="">MACD[,2] 

# Мы будем использовать полосу Боллинджера %B, которая определяет цену  
# относительно верхней и нижней границ полосы Боллинджера.    
> BB<- span="">BBands(Op(GSPC),n=20,sd=2)  
BBp<- span="">BB[,4] 
  
# Для этого примера мы будем прогнозировать численное изменение цены  
Price<- span="">Cl(GSPC)-Op(GSPC) 

# Создаем наш датасет и удаляем данные, в которых рассчитываются   
# значения индикатора   
DataSet<- span="">data.frame(RSI3,EMAcross,MACDsignal,BBp,Price)  
DataSet<- span="">DataSet[-c(1:33),]  

# Даем названия столбцам   
>colnames(DataSet)<-c cross="" ollingerb="" rice="" signal="" span=""> 

Затем нормализуем наши данные. 

# Мы нормализуем данные, чтобы их значения находились в диапазоне от 0 до 1 > Normalized <- span="">function(x) {(x-min(x))/(max(x)-min(x))}  
NormalizedData<- span="">as.data.frame(lapply(DataSet,Normalized)) 

Создаем обучающую и тестовую выборки: 
  
TrainingSet<- span="">NormalizedData[1:816,]  
TestSet<- span="">NormalizedData[817:1225 ,] 
  
Теперь давайте уже построим нашу искусственную нейронную сеть 

# Мы используем наши индикаторы для прогнозирования цены в обучающей  
# выборке с использованием алгоритма обратного распространения  
# ошибки и при скорости обучения 0,001  
> nn1 <- nbsp="" span="">neuralnet(Price ~ RSI3 + EMAcross + MACDsignal + BollingerB, data = TrainingSethidden = c(3,3), learningrate=.001,algorithm="backprop") 

Давайте посмотрим, как выглядит наша нейронная сеть. 
  
plot(nn1) 

 
  
Примечание: нейроны смещения (синего цвета) для каждого слоя дают нам гораздо большую гибкость в паттернах, которые мы можем зафиксировать, позволяя нам изменять функцию активации различными способами. Здесь вы можете получить дополнительную информацию о нейронах смещения. 
  
В следующей статье мы интерпретируем результаты работы сети и увидим, как мы можем использовать ее в трейдинге. 

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

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