Блог им. SciFi

Предсказание курса акций Газпрома с помощью нейронной сети на R

    • 07 мая 2017, 10:43
    • |
    • SciFi
  • Еще
В предыдущем посте я писал про вычисление косинуса угла с помощью нейронной сети на R. В этом посте я расскажу о том, как с помощью нейронных сетей можно предсказывать цены и насколько эти предсказания реализуются. 

Итак, я взял историю с 2014 года, обучил нейронную сеть на дневных данных акций Газпрома и попробовал предсказать поведение цены на апрель. 

Предсказание курса акций Газпрома с помощью нейронной сети на R
Синяя линия — это предсказание динамики. Нейронная сеть думала, что будет двойное дно, после чего цена пойдет примерно на 137. 

А вот что было на самом деле. В следующем графике уже предсказание на май и видно, что было в апреле.

Предсказание курса акций Газпрома с помощью нейронной сети на R
Цена действительно пошла на 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, так как для прогнозирования временных рядов она удобнее и лаконичнее получается.




★17
25 комментариев
Я думаю, нейронная сеть может предсказывать примерную динамику, но не точно

Это прекрасно. Заберу себе.
avatar
за изобретение — пять!
А думали ли Вы о поведении сети под влиянием третьего и восьмого элемента? От этого влияния сеть начинает давать сбои на уровне PH. Влияние расторговывается после вливания 300-500г.
И сбой нивелируется иными предпочтениями… попробуйте, хуже не будет…
avatar
На вход какие данные подавал? просто 40 последних значений цены?
Маркин Павел, да, есть еще другой вариант, когда я подавал индикаторы, но он совсем плохой.
avatar
SciFi, 
1. нейросети крайне плохо работают с абсолютными данными — лучше использовать на вход логарифм приращения цен Ln(Р2/Р1).
2. нейросети с функцией активации гиперболического тангенса лучше справляются с динамическими рядами, и входные данные необходимо отнормировать(привести к разбросу входных данных в диапазон [-1;+1]).

3. 40 дней «пилы» предскажут только продолжение «пилы», а не смену тренда. Обработай предварительно входные данные — примени zig-zag и подавай на вход приращения между экстремумами (не важно сколько времени между ними прошло) — тогда сеть будет искать фрактальные закономерности, волны, паттерны, фигуры типа "двойное дно", "гип" и т.д.

4. Если перейдёшь на приращения и экстремумы, то можешь спокойно скормить сети любые инструменты (лучше брать некоррелирующие), а не только Газпром, и любой период, тогда у сетки будет боОольшая обучающая выборка, и меньше возможностей попасть в локальный минимум.

5. с выхода не требуй больше 2-3 значений.
трейдер со средним опытом вряд ли предположил бы двойное дно, что с этой сетью не так?
avatar
Предлагаю сделать предсказание не на два месяца, а скользящим окошком пройтись по истории в год. И заодно еще учесть 2008 год, например. Много интересного узнаете про свою сетку)
avatar
CrocGen, да я уже знаю, что на новых значениях она начинает сходить с ума ) писал про это еще в предыдущем посте про косинус
avatar
CrocGen, хорошая идея для дальнейшего развития в этом направлении
avatar
Сеть не так уж и ошиблась. Но так это ж робот… а я в последнее время себе даже не доверяю: хотел пукнуть, но обор… ся =). 
Удачных разработок!
avatar
Мда. Т.е. сейчас Ваша система предсказывает рост газика до 142-143 и падение? Весьма возможно, но прямое падение с нынешнего уровня тоже весьма возможно.
avatar
В общем могу сказать следующее: Этот метод представляет собой древнюю модель ARIMA, авторегрессионная модель скользящего среднего одной переменной. А нейронная сеть используется тут чисто для подбора параметров модели, что в общем неэффективно, и может неправильно подобрать. 
 Не работает, может повезет пару раз, но возможность пролететь будет однозначно.
 То есть для тех кто не в курсе, это модель, которая строится на скользящем среднем по графику акции Газпрома, акция Газпрома представляется как линейная функция, зависящая от нескольких предыдущих значений скользящего среднего. С помощью нейронной сети тут подбирают коэффициенты каждой составляющей этой функции.
avatar
alexKa, все верно, но в отличие от ARIMA эта модель нелинейная, находится не гиперплоскость, а гиперповерхность.
avatar
Нейронная сеть в та — мракобесие
Семен Семенычъ, суть ТА — в паттернах. Распознавание паттернов — одно из главнейших приложений нейросетей.
avatar
Это грааль!
Это слишком просто, так в лоб это не сработает. Несмотря на сложность метода под капотом
avatar
Интересно было бы «скормить» мои индикаторы вашей нейронке.
avatar
Эти нейросети косинус то криво предсказывали, а тут внезапно бы разошлись и выдали «правду».
avatar
За труд и пример спасибо!

По применению нейросетей. Нейросеть это не волшебная палочка. Это даже не реализация магической интуиции человека. Нейросеть=ИНС это всего лишь универсальный аппроксиматор, который можно затем использовать, чтобы разделить облако данных, что-то предсказать, распознать и т.д. Но в основе это лишь аппроксимация (как линейная, так и нелинейная). Без потери общности и частности можно утверждать, что любая линейная регрессия, пересечение скользящих средних и пр и пр это лишь варианты нейросетей.

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

Ибо когда мы на вход нейросетки из нескольких слоев и множества нейронов кидаем хоть цены хоть индикаторы… то результат либо бред либо жуткая переподгонка.
avatar
Sergey Pavlov, на счет аппроксиматора согласен, но нейронная сеть наилучшая из всех возможных регрессий, так как это множественная нелинейная регрессия. Я не знаю ни одного актива, который торгуется скользяшкой. 
avatar
SciFi, топ-20 по ликвидности акций и топ-10 фьючерсов (за исключением нефти, золота, серебра и евро-доллара) на нашем рынке хорошо торгуются скользяшками.
avatar
Если честно, рассуждения вроде «тут угадала, тут почти угадала» от человека, знающего программирование, коробят. Как минимум интересно увидеть эквити системы на истории. Можно перед каждым новым баром даже переобучать на всех до предыдущего включительно. Вообщем, без бектеста как — то неинфоомативно, хотя тема интересная
avatar
То есть вводишь много много значений (чем больше, тем лучше)… и программа анализирует по какому принципу эти числа следуют друг за другом и примерно предсказывает следующие числа? И это рабочий код для этой программы?

теги блога SciFi

....все тэги



UPDONW
Новый дизайн