В предыдущем посте я писал про вычисление косинуса угла с помощью нейронной сети на R. В этом посте я расскажу о том, как с помощью нейронных сетей можно предсказывать цены и насколько эти предсказания реализуются.
Итак, я взял историю с 2014 года, обучил нейронную сеть на дневных данных акций Газпрома и попробовал предсказать поведение цены на апрель.
Синяя линия — это предсказание динамики. Нейронная сеть думала, что будет двойное дно, после чего цена пойдет примерно на 137.
А вот что было на самом деле. В следующем графике уже предсказание на май и видно, что было в апреле.
Цена действительно пошла на 137, но двойного дна не было, а было обновление лоя на 121 и уже потом поход на 137.
Я думаю, нейронная сеть может предсказывать примерную динамику, но не точно. Хотя, возможно это случайность, что она угадала отскок до 137.
Код на R тут:
#Прогнозы с помощью нейронной сети
#system.time(source('D:/Dropbox/R/MachineLearning/NeuralNetworks/NN.R'))
#Вызов этого скрипта
#install.packages('quantmod')
#install.packages('rusquant')
#install.packages('forecast')
library('quantmod')
library('rusquant')
library('forecast')
#dev.off()
#Очистка графиков
rm(list = ls())
#Очистка среды R от лишних переменных в памяти, если требуется
startDate <- as.Date('2014-03-01')
#endDate <- as.Date('2017-04-01')
getSymbols('GAZP', src='Finam', from=startDate, period='day')
#chartSeries(GAZP)
#Обучение нейронной сети
#p - число входящих нейронов, желательно чтобы совпадало с периодичностью
#lambda - параметр трансорфмации Бокса-Кокса
fit <- nnetar(Cl(GAZP), lambda = 0, p = 40)
#Прогнозирование с помощью нейронной сети
#h - дальность прогноза (по умолчанию 10 если нет периодичности)
fc <- forecast(fit, h = 40)
#График прогноза
plot.forecast(fc, include = 200, showgap = FALSE)
#Детали
print(summary(fc))
В предыдущем посте я использовал для вычисления косинуса либу
neuralnet. В этом посте я уже использовал функцию
nnetar из либы
forecast, так как для прогнозирования временных рядов она удобнее и лаконичнее получается.
Это прекрасно. Заберу себе.
И сбой нивелируется иными предпочтениями… попробуйте, хуже не будет…
1. нейросети крайне плохо работают с абсолютными данными — лучше использовать на вход логарифм приращения цен Ln(Р2/Р1).
2. нейросети с функцией активации гиперболического тангенса лучше справляются с динамическими рядами, и входные данные необходимо отнормировать(привести к разбросу входных данных в диапазон [-1;+1]).
3. 40 дней «пилы» предскажут только продолжение «пилы», а не смену тренда. Обработай предварительно входные данные — примени zig-zag и подавай на вход приращения между экстремумами (не важно сколько времени между ними прошло) — тогда сеть будет искать фрактальные закономерности, волны, паттерны, фигуры типа "двойное дно", "гип" и т.д.
4. Если перейдёшь на приращения и экстремумы, то можешь спокойно скормить сети любые инструменты (лучше брать некоррелирующие), а не только Газпром, и любой период, тогда у сетки будет боОольшая обучающая выборка, и меньше возможностей попасть в локальный минимум.
5. с выхода не требуй больше 2-3 значений.
Удачных разработок!
Не работает, может повезет пару раз, но возможность пролететь будет однозначно.
То есть для тех кто не в курсе, это модель, которая строится на скользящем среднем по графику акции Газпрома, акция Газпрома представляется как линейная функция, зависящая от нескольких предыдущих значений скользящего среднего. С помощью нейронной сети тут подбирают коэффициенты каждой составляющей этой функции.
По применению нейросетей. Нейросеть это не волшебная палочка. Это даже не реализация магической интуиции человека. Нейросеть=ИНС это всего лишь универсальный аппроксиматор, который можно затем использовать, чтобы разделить облако данных, что-то предсказать, распознать и т.д. Но в основе это лишь аппроксимация (как линейная, так и нелинейная). Без потери общности и частности можно утверждать, что любая линейная регрессия, пересечение скользящих средних и пр и пр это лишь варианты нейросетей.
Поэтому хорошо бы применять нейросеть в логике уточнения грубых моделей. Например, мы точно знаем, что данный актив хорошо торгуется одной скользящей средней. Далее давайте по уму заменим эту скользяшку нейросетью такой минимальной конфигурации, чтобы она ничего радикально более сложного, чем скользяшка, не делала и посмотрим, получается ли такой сеткой торговать лучше и в каких случаях.
Ибо когда мы на вход нейросетки из нескольких слоев и множества нейронов кидаем хоть цены хоть индикаторы… то результат либо бред либо жуткая переподгонка.