Разобрался в том, как обучить нейронную сеть чему-то и решил поделиться этим. В первой части расскажу о том, как я научил нейронную сеть вычислять косинус угла. Во второй части — как использовать нейронные сети в трейдинге. Первая часть позволит лучше разобраться в минусах и плюсах нейронных сетей, что улучшит понимание их применения в трейдинге.
Я взял 100 равномерно распределенных случайных чисел в промежутке от -4 до 4 Pi и научил по этим данным нейронную сеть, состоящую из 10 скрытых нейронов вычислять косинус угла. Вот что в итоге получилось, когда я вычислил 600 значений между -4 и 4 Pi.
Не плохо, правда? Нейронная сеть не знает ничего о том, что такое косинус, она не знает, зачем он нужен, в чем его геометрический смысл, какое у него разложение Тейлора и тд. И тем не менее, она научилась его вычислять.
Выглядит сеть примерно так:
Затем я попробовал уменьшить количество значений в обучающей выборке в 5 раз до 20 чисел. Результат ухудшился:
Если поменять топологию сети и добавить нейроны, результат лучше не становится. Здесь 27-9-3 внутренних нейронов.
Выглядит такая сеть вот так:
Но от того, что мы добавили нейроны, лучше не стало, так как обучающая выборка слишком мала.
Первая нейронная сеть, которая обучается по 100 значениям с 10 нейронами, плохо вычисляет значения за пределами обучающей выборки:
Если представить, что мы ребенка научили русскому алфавиту, то он будет неплохо определять буквы, даже если они написаны по другому. Но если ему показать английские буквы вроде Z, то ребенок не разберется. Также и такие нейронные сети, судя по всему.
Выводы
Минусы:
— Если данных при обучении мало, усложнение сети бесполезно и нейронные сети работают плохо
- С новыми необычными данными нейронные сети не справляются
Плюсы:
+ Нейронные сети хорошо работают в тех местах, где они хорошо натренированы
+ Нейронные сети подходят для описания нелинейных функций вроде косинуса, корня угла и т.д. в отличие от линейной регрессии
+ Нейронные сети хороши для распознавания паттернов в рамках границ, в которых они обучались.
Касательно трейдинга можно сказать, что если наши предикторы цены будут обычными, нейронная сеть, натренированная на большой истории, скорее всего будет хорошо справляться, так как по Ливермору на рынке происходит всегда одно и то же. Но если появится Черный Лебедь и предикторы будут иметь нестандартные значения, нейронная сеть войдет в заблуждение.
А вот код на R:
# ВЫЧИСЛЕНИЕ КОСИНУСА УГЛА С ПОМОЩЬЮ НЕЙРОННОЙ СЕТИ
#system.time(source('D:/Dropbox/R/MachineLearning/NeuralNetworks/Cosine.r'))
#Вызов этого скрипта
#install.packages('neuralnet')
library('neuralnet')
#Если ввести ?neuralnet можно узнать более подробную информацию
#dev.off()
#Очистка графиков
rm(list = ls())
# Очистка среды R от лишних переменных в памяти, если требуется
#Генерим случайные равномерно распределенные числа
#И сохраняем их в виде data frame
traininginput <- as.data.frame(runif(100, min=-4, max=4))
trainingoutput <- cospi(traininginput)
#Создаем единую структуру из входящих и исходящих значений
trainingdata <- cbind(traininginput,trainingoutput)
colnames(trainingdata) <- c('Input','Output')
#Обучение нейронной сети
#Используем 10 внутренних нейронов
net.cos <- neuralnet(Output~Input, trainingdata, hidden=10, threshold=0.01)
#print(net.cos)
#Графическое представление сети
plot(net.cos)
testdata <- as.data.frame(runif(600, min=-4, max=4))
net.results <- compute(net.cos, testdata) #Run them through the neural network
#Свойства объекта net.results можно посмотреть так:
#ls(net.results)
#Результаты
#print(net.results$net.result)
#Результаты в виде таблицы, в которой видно теор. значение и вычисленное
cleanoutput <- cbind(testdata, cospi(testdata), as.data.frame(net.results$net.result))
colnames(cleanoutput) <- c('Input', 'Expected Output', 'Neural Net Output')
#print(cleanoutput)
#Ошибка нейронной сети
MSE.nn <- sum((net.results$net.result - cospi(testdata)) ^ 2) / nrow(testdata)
#print('Error:')
#print(MSE.nn)
#Построение графика по вычисленным с помощью нейронной сети значениям
testdata$cos <- net.results$net.result
colnames(testdata) <- c('Angle in Radians', 'Cosine')
plot(testdata)
А что касается трейдинга — нейронные сети оказываются не очень-то эффективны. Может не так уж и повторяется история?
Т.е. в половине случаев повторяется, в половине не повторяется?
Купил пару книг и скачал тонны электронных книг, но особо не читал. Хватает вполне того, что есть в интернете. Важно не просто изучать R, а решать на нем свои задачи, так быстрее научитесь, в процессе экспериментов с кодом.