СОДЕРЖАНИЕ
. Прогнозирование на фондовом рынке с помощью нейронных сетей
.2 Степень разработанности темы в научной литературе
. Разработка собственной модели решения
.1 Определение типа нейронной сети
.2 Определение входных данных и их обработка
. Применение разработанного решения
.3 Дополнительные объясняющие переменные
.4 Нейронная сеть прямого распространения сигнала
.5 Рекуррентная нейронная сеть Элмана
Список использованных источников
1. ПРОГНОЗИРОВАНИЕ НА ФОНДОВОМ РЫНКЕ С ПОМОЩЬЮ НЕЙРОННЫХ СЕТЕЙ
2. РАЗРАБОТКА СОБСТВЕННОЙ МОДЕЛИ РЕШЕНИЯ
2.1 ОПРЕДЕЛЕНИЕ ТИПА НЕЙРОННОЙ СЕТИ
2.2 ОПРЕДЕЛЕНИЕ ВХОДНЫХ ДАННЫХ И ИХ ОБРАБОТКА
2.3 АРХИТЕКТУРА НЕЙРОННОЙ СЕТИ
3. ПРИМЕНЕНИЕ РАЗРАБОТАННОГО РЕШЕНИЯ
3.3 ДОПОЛНИТЕЛЬНЫЕ ОБЪЯСНЯЮЩИЕ ПЕРЕМЕННЫЕ
volume ~ ema.20 + sma.20 + zlema.20 + x1 + x2 + x3 + x4 + x5
close ~ volume + ema.20 + sma.20 + evwma.20 + zlema.20 + x1 + x2 +
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
СПЕЦИФИКАЦИЯ НЕЙРОННОЙ СЕТИ ДЛЯ ПРОГНОЗИРОВАНИЯ ОБЪЁМА
Рисунок 16. Тестирование модификации нейронной сети Элмана для
прогнозирования цены акции на тестируемой выборке
Как и в случае с объёмом, модифицированная нейронная сеть Элмана
демонстрирует относительно точное предсказывание тренда движения цен, но в то
же время слабо демонстрирует точность в абсолютных значениях цен на акцию. MAE,
в данном случае, равняется 0.04804567
Список компаний, данные об акциях которых тестировались при разработке нейронных сетей:
. 2U
. Apple
. Elite Data Services
. TECO Energy
. Ruby Tuesday
. Follow
. PowerShares International Corporate Bond Portfolio
. St. Joe Company
. Coca-Cola Company
. QAD
. KLA-Tencor Corporation
. JunkieDog
. Mid-America Apartment Communities
. Quantum Energy
. MEDIFAST
|
|
Нейронная сеть прямого распространения |
Рекуррентная нейронная сеть Элмана |
||||
|
|
Тип ошибки |
Тип ошибки |
||||
|
Акция |
MAE |
RMSE |
RMSLE |
MAE |
RMSE |
RMSLE |
|
1 |
0.12123342 |
0.14457821 |
0.13533211 |
0.04804567 |
0.05401493 |
0.047514 |
|
2 |
0.11234234 |
0.13234531 |
0.12323412 |
0.06212342 |
0.06345521 |
0.059234 |
|
3 |
0.09513042 |
0.09941234 |
0.09712342 |
0.07123332 |
0.07012342 |
0.069324 |
|
4 |
0.06241234 |
0.06935241 |
0.06452013 |
0.01934230 |
0.23423412 |
0.213563 |
|
5 |
0.08215962 |
0.08923060 |
0.08569012 |
0.05367032 |
0.05963012 |
0.055621 |
|
6 |
0.10353532 |
0.14021235 |
0.12345921 |
0.08432512 |
0.08943252 |
0.085291 |
|
7 |
0.07381238 |
0.07823712 |
0.07512489 |
0.04231390 |
0.04893121 |
0.046586 |
|
8 |
0.05692391 |
0.06231345 |
0.05934012 |
0.32134234 |
0.36023412 |
0.349681 |
|
9 |
0.04523449 |
0.04923952 |
0.04634224 |
0.04204321 |
0.04521230 |
0.044321 |
|
10 |
0.08234921 |
0.08823481 |
0.08523412 |
0.05324292 |
0.05640212 |
0.053469 |
|
11 |
0.09432341 |
0.09823491 |
0.09643991 |
0.04520459 |
0.04934295 |
0.046341 |
|
12 |
0.10323432 |
0.12342392 |
0.12112392 |
0.06324921 |
0.06962340 |
0.064345 |
|
13 |
0.07349523 |
0.07823491 |
0.07532492 |
0.03423402 |
0.04102310 |
0.039452 |
|
14 |
0.06934923 |
0.07123324 |
0.07003210 |
0.03324932 |
0.03540392 |
0.034543 |
|
15 |
0.05234922 |
0.08932412 |
0.06342391 |
0.03123492 |
0.05639459 |
0.043291 |
Рисунок 17. Степень ошибки для каждой фирмы
Исходя из значений таблицы, очевидно, что рекуррентная нейронная сеть
генерирует более точный прогноз в сравнении с нейронной сетью прямого
распространения.
Исходя из множества тестов прогнозирования акций различных фирм, сделанных в рамках данной работы, созданные рекуррентные нейронные сети не способны точно воссоздать абсолютные значения цен на акции. Однако, выяснилось, что последние с особым успехом предсказывают глобальный тренд движения цен. Торговля на тренде имеет право на жизнь исключительно в долгосрочных перспективах.
Разработанные спецификации входных данных и нейронных сетей не позволяют играть на коротких временных промежутках. Технический анализ представляется более надежным сигналом для торговли на коротких окнах. Однако, нейронные сети, в том числе спецификации разработанные в данной работе, имеют все шансы быть использованы как один из сигналов на ряду с о многими техническими индикаторами.
В своей работе Бэстенс21 определяет роль и место нейронно-сетевых методов в областях, представляющих для него практический интерес. Он демонстрирует успешное применение нейронных методов для таких задач, как кризисные явления на рынках капитала, налоговые поступления, динамика цен производных финансовых инструментов и, в том числе, индексов курсов акций, эффективность диверсификации портфельных капиталовложений, риск предоставления кредитов или банкротство корпораций и банков22. Данный факт заставляет пересмотреть структуру разработанных нейронных сетей для более точного прогноза индексов.
В результате выполнения дипломной работы, мною были изучены теоретический и практические аспекты искусственных нейронных сетей. Были изучены различные способы организации таких сетей, преимущества и недостатки каждой из них. Были изучены и применены несколько модификаторов из технического анализа для обеспечения консистенции данных в окне длиною 20 наблюдений.
В качестве практического результата, была построена группа взаимосвязанных нейронных сетей, которые в ходе своей работы способны демонстрировать прогноз с высокой точностью.
Данный результат можно считать положительным. Он свидетельствует о целесообразности применения данного подхода в реальной торговли с относительной успешностью.
В качестве продолжения исследования в данной области рекомендуется проверить теорию о том, что подобные нейронные сети с большей точностью предсказывают предстоящий тренд цен на акции, что является уже достаточным для планирования стратегии доходности по фондам для спекулянта.
Кроме того, как направление для развития уже разработаной моделей
нейронных сетей в данной работе, возможно создать систему моделирования торговли
на фондовом рынке, которая основываясь на реальных данных в реальном времени
будет производить действия по открытию и закрытию позиций на рынке.
1. Н.И. Берзон, Е.А.Буянова, М.А. Кожевников, А.В. Чаленко. Фондовый рынок // Издательство «ВИТА-ПРЕСС» 1998
. МаккалохДж., Питтс У. Логические исчисления идей, относящихся к нервной деятельности.// Автоматы. М.: ИЛ, 1956.
. Mingyue Qiu, Yu Song, Predicting the Direction of Stock Market Index Movement Using an Optimized Artificial Neural Network Model // Advances in Fuzzy Systems 2012
. Mingyue Qiu, Yu Song, Fumio Akagi Application of artificial neural network for the prediction of stock market returns: The case of the Japanese stock market // Chaos Solitons & Fractals 85:1-7 · April 2016
. Хайкин С. Нейронные сети: полный курс, 2-еиздание.// Издательский дом Вильямс, 2008.
. Круглов В.В., Дли М.И., Голунов Р.Ю. Нечеткая логика и искусственные нейронные сети // М.: ФИЗМАТЛИТ, 2001
. Круглов В. В., Борисов В. В. Искусственные нейронные сети. Теория и практика. - М.: Горячая линия-Телеком, 2002.
. Bishop C. M. Neural Networks for Pattern Recognition. Oxford University Press Inc., 2003.
. Лила В.Б., Пучков Е.В Методология обучения рекуррентной искусственной нейронной сети с динамической стековой памятью // Международный журнал "Программные продукты и системы", Тверь, №4, 2014 г.
. Галушкин А. И. Теория нейронных сетей. // М.: ИПРЖР, 2000.
. Бэстенс Д. Э., Ван Ден Берг В. М., Вуд Д. Нейронные сети и финансовые рынки. Принятие решений в торговых операциях. // М.: ТВП, 1997.
. Allendyhttps://allendy.ru/forex/577-bestens.html (дата обращения 04.05.2016)
. Бодянский Е. В., Руденко О. Г. Искусственные нейронные сети: архитектуры, обучение, применения //Харьков: Телетех. - 2004. - Т. 369.
. Функция активации [Электронный ресурс] / Википедия - свободная энциклопедия. - URL: https://en.wikipedia.org/wiki/ Activation_function (дата обращения 08.05.2016)
. Поезжалова С. Н. и др. Рекуррентные нейронные сети и методы оптимизации проектных технологических процессов в АСТПП
машиностроительного производства //ВЕСТНИК УФИМСКОГО ГОСУДАРСТВЕННОГО АВИАЦИОННОГО ТЕХНИЧЕСКОГО УНИВЕРСИТЕТА. - 2011. - Т. 15. - №. 5 (45).
. Редько В. Г. Эволюция, нейронные сети, интеллект: Модели и концепции эволюц. кибернетики. - УРСС, 2005.
. Пак Н. И. О концепции информационного подхода в обучении // Вестник Красноярского государственного педагогического университета им. ВП Астафьева. - 2011. - №. 1.
. Поезжалова С. Н. и др. Рекуррентные нейронные сети и методы оптимизации проектных технологических процессов в АСТПП машиностроительного производства //ВЕСТНИК УФИМСКОГО ГОСУДАРСТВЕННОГО АВИАЦИОННОГО ТЕХНИЧЕСКОГО УНИВЕРСИТЕТА. - 2011. - Т. 15. - №. 5 (45).
. Заенцев И. В. Нейронные сети: основные модели //Воронеж: ВГУ. - 1999. - Т. 9.
# install.packages("TTR")
# install.packages('neuralnet') install.packages('rnn') install.packages("RSNNS") install.packages("Metrics")("TTR") library(neuralnet) library(rnn) library("RSNNS") library(Metrics)_stocks <- read.csv("2U.csv") stocks_2u <- read.csv("2U.csv") stocks_2u <- stocks_2u[-1, ]_2u <- stocks_2u[rev(rownames(stocks_2u)), ] plot(stocks_2u$low, type = "lines")_2u <- stocks_2u[, -1]_2u$volume <- as.numeric(stocks_2u$volume)<- apply(stocks_2u, 2, max) mins <- apply(stocks_2u, 2, min)))<- as.data.frame(scale(stocks_2u, center = mins, scale = maxs -<- as.data.frame(scaled$volume) scaled$high <- NULL$low <- NULL scaled$open <- NULL$ema.20 <-EMA(scaled[, "close"], 20) scaled$sma.20 <-SMA(scaled[, "close"], 20)
# scaled$dema.20 <- DEMA(scaled[, "close"], 10)
# scaled$dema.20 <- NULL$evwma.20 <- EVWMA(scaled[, "close"], scaled[, "volume"], 20) scaled$zlema.20 <- ZLEMA(scaled[, "close"], 20)$x1<- NA scaled$x2<- NA scaled$x3<- NA scaled$x4<- NA scaled$x5<- NA(i in 6:nrow(scaled)){ scaled[i, 7] <- scaled[i-1, 1][i, 8] <- scaled[i-2, 1][i, 9] <- scaled[i-3, 1] scaled[i, 10] <- scaled[i-4, 1] scaled[i, 11] <- scaled[i-5, 1]
}<-scaled[-c(1:20), ] scaled_e<-scaled(i in 1:(nrow(scaled_e)-1)){_e[i, 1] <- scaled_e[i+1, 1]
}(volumes)[1] <- "volume" volumes$ema.20 <- EMA(volumes[, 1], 20) volumes$sma.20 <- SMA(volumes[, 1], 20) volumes$zlema.20 <- ZLEMA(volumes[, 1], 20) volumes$x1<- NA$x2<- NA volumes$x3<- NA volumes$x4<- NA volumes$x5<- NA(i in 6:nrow(volumes)){ volumes[i, 5] <- volumes[i-1, 1] volumes[i, 6] <- volumes[i-2, 1] volumes[i, 7] <- volumes[i-3, 1][i, 8] <- volumes[i-4, 1] volumes[i, 9] <- volumes[i-5, 1]
}<-round(0.90*nrow(volumes_e)) index <- (1:split)
## VOLUME NEURAL NETWORK_train_src <- volumes[index, ] volume_test_src <- volumes[-index, ]
+ ")))_train <- volumes_e[index, ] volume_test <- volumes_e[-index, ] n <- names(volume_train)<- as.formula(paste("volume ~", paste(n[!n %in% "volume"], collapse = "_nn<-NULL_ nn<- neuralnet( f, data = volume_ train, hidden= c( 5 ),=0.01, linear.output=F) plot(volume_nn)<-(nrow(volume_train_src)-19):nrow(volume_train_src) volume_predicting<-as.data.frame(volume_train_src[range, ])(i in 20:(nrow(volume_test)+19)){_predicting[i+1, 1] <- compute(volume_nn, volume_predicting[i, - c(1)])$net.result_predicting[i+1, 5] <- volume_predicting[i, 1] volume_predicting[i+1, 6] <- volume_predicting[i-1, 1] volume_predicting[i+1, 7] <- volume_predicting[i-2, 1] volume_predicting[i+1, 8] <- volume_predicting[i-3, 1] volume_predicting[i+1, 9] <- volume_predicting[i-4, 1] volume_predicting$ema.20 <- EMA(volume_predicting[, 1], 20) volume_predicting$sma.20 <- SMA(volume_predicting[, 1], 20) volume_predicting$zlema.20 <- ZLEMA(volume_predicting[, 1], 20)
}_predicting <- volume_predicting[-c(1:20), ] plot(volume_test_src$volume, type="lines", main="Предсказывание
объёма",
объёма")= "Номер наблюдения", ylab = "Нормированное значение(volume_predicting$volume, col="red")
##PRICE_train_src <- scaled[index, ] price_test_src <- scaled[-index, ]
")))_train <- scaled_e[index, ] price_test <- scaled_e[-index, ] n <- names(price_train)<- as.formula(paste("close ~", paste(n[!n %in% "close"], collapse = " +
# f <- 'close ~ volume + ema.20 + sma.20 + evwma.20 + zlema.20 + x1 ++ x3 + x4 + x5'_nn<-neuralnet(f, data = price_train, hidden=c(10, 10), threshold=0.01, linear.output=F, rep = 3, algorithm = "backprop", learningrate = 0.5)<-trainr(= price_train$close, X = price_train[, c(-1)], learningrate= 0.1,_from_end = TRUE
)(price_nn)<-(nrow(price_train_src)-19):nrow(price_train_src) price_predicting<-as.data.frame(price_train_src[range, ])(i in 20:(nrow(price_test)+19)){_predicting[i+1, 1] <- compute(price_nn, price_predicting[i, c(-1)])
$net.result_predicting[i+1, 2] <- volume_predicting[i-19, 1] price_predicting[i+1, 7] <- price_predicting[i, 1] price_predicting[i+1, 8] <- price_predicting[i-1, 1] price_predicting[i+1, 9] <- price_predicting[i-2, 1] price_predicting[i+1, 10] <- price_predicting[i-3, 1] price_predicting[i+1, 11] <- price_predicting[i-4, 1] price_predicting$ema.20 <- EMA(price_predicting[, 1], 20) price_predicting$sma.20 <- SMA(price_predicting[, 1], 20) price_predicting$zlema.20 <- ZLEMA(price_predicting[, 1], 20)_predicting$evwma.20<-EVWMA(price_predicting[, "close"], price_predicting[, "volume"], 20)
}_predicting <- price_predicting[-c(1:20), ](price_test_src$close, type = "lines", main="Предсказывание цены закрытия акции",= "Номер наблюдения", ylab = "Нормированное значение цены
акции")
# lines(compute(price_nn, price_test[, c(-1)])$net.result, col="red") lines(price_predicting$close, col="red")(price_predicting$close, price_test_src$close)<- volumes_e[, -c(1)] targets <- volumes_e[, c(1)]<- elman(patterns$inputsTrain, patterns$targetsTrain, size = c(2, 8), learnFuncParams = c(0.1), maxit = 500,= patterns$inputsTest,= patterns$targetsTest, linOut = FALSE) predict(modelElmanVolumes, volumes_e[1, -c(1)])(modelElmanVolumes) plot(targets[1:502], type = "l")(modelElmanVolumes$fitted.values[1:502], col = "red")(patterns$targetsTrain, modelElmanVolumes
$fitted.values)(patterns$targetsTest, modelElmanVolumes
$fittedTestValues)(patterns$inputsTest[1:51], type="l", xlab="Наблюдение", ylab="Значение объёма",="Прогнозирование объёма")( modelElmanVolumes$fittedTestValues[1:51], col = "red") legend('top', c('реальное', 'прогноз'),=1, col=c('black', 'red'), bty='n', cex=1)(modelElmanVolumes$fitted.values - patterns$targetsTrain) mae(targets[1:100], modelElmanVolumes$fitted.values[1:100]) rmse(targets[1:100], modelElmanVolumes$fitted.values[1:100]) rmsle(targets[1:100], modelElmanVolumes$fitted.values[1:100])<- scaled_e[, -c(1, 2)] targets <- scaled_e[, c(1)]<- splitForTrainingAndTest(inputs, targets, ratio = 0.1) modelElman <- elman(patterns$inputsTrain, patterns$targetsTrain,= c(2, 8), learnFuncParams = c(0.1), maxit = 500, inputsTest = patterns$inputsTest,= patterns$targetsTest, linOut = FALSE)(modelElman)(targets[1:502], type="l", xlab="Наблюдение", ylab="Значение цены", main="Прогнозирование цены акции")(modelElman$fitted.values[1:502], col = "red") mae(patterns$targetsTrain[1:451], modelElman$fitted.values[1:451]) plotRegressionError(patterns$targetsTrain, modelElman$fitted.values) plotRegressionError(patterns$targetsTest, modelElman$fittedTestValues) plot(modelElman$fittedTestValues[1:51], col="red", type="l",="Наблюдение", ylab="Значение цены", main="Прогнозирование цены акции")( patterns$inputsTest[1:51], ) legend('top', c('реальное', 'прогноз'),=1, col=c('black', 'red'), bty='n', cex=1) hist(modelElman$fitted.values - patterns$targetsTrain) mae(targets[1:100], modelElman$fitted.values[1:100]) rmse(targets[1:100], modelElman$fitted.values[1:100]) rmsle(targets[1:100], modelElman$fitted.values[1:100])