Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 265

 
СанСаныч Фоменко:
Пробовал, но быстро сломался: не понятно что делать с дырками в выходные.

 Дырок в выходные снимают на дискотеках :)

Саныч когда ты уже научишься нормально цитировать? чтобы написать три слова не надо цитировать пол страницы форума...

 

 Теперь далее по теме 

  Наделал я различных свечных комбинаций и прочего с помощью пакета candlesticks , при попытке обучать МО оказалось что он тренируется на все 100% те ошибка 0 как на тренировочных так и на новых данных, очевидно что в данных присутствуют какие то предикторы которые заглядывают в будущее, чтобы не разбираться в каждой функции я просто удалил первые 6 предикторов которые по версии фореста были самыми значимыми и сильно выделялись на фоне других, я надеялся на то что именно среди них будут те что заглядывают в будущее и снова обучил МО , ошибка составила около 3%, кароч я не знаю что за фигня, почему такие сказочные результаты, может ошибка в моем коде...

Кароч кому интересно поразбираться вот  код как я делал выборку, целевая у меня была "цвет свечи"

В коде только сама выборка, целевую и прочие манипуляции делайте какие хотите 

Пробуйте, експериментируйте ведь  это как ни  как доп  30 признаков к вашей модели

 

library(rusquant)
# загружаю последние 500 дней котировок индекса ртс
getSymbols("SPFB.RTS",src = "Finam",period="5min",from = Sys.Date()-500)
chart_Series(  tail(SPFB.RTS,100)  )

D <- SPFB.RTS

# cчитаем функции по свечным формациям и прочим добром
library(candlesticks)

X29<- TrendDetectionSMA(D)  
X28<- TrendDetectionChannel(D)  
X27<- nextCandlePosition(D)  
X26<- CSPThreeOutside(D)
X25<- CSPThreeMethods(D)
X24<- CSPThreeInside(D)
X23<- CSPTasukiGap(D)
X22<- CSPStomach(D)
X21<- CSPStar(D)
X20<- CSPShortCandleBody(D)
X19<- CSPShortCandle(D)
X18<- CSPPiercingPattern(D)
X17<- CSPOutsideDay(D)
X16<- CSPNLowerClose(D,N = 3)
X15<- CSPNHigherClose(D,N = 3)
X14<- CSPMarubozu(D)
X13<- CSPLongCandleBody(D)
X12<- CSPLongCandle(D)
X11<- CSPKicking(D)
X10<- CSPInvertedHammer(D)
X9 <- CSPInsideDay(D)
X8 <- CSPHarami(D)
X7 <- CSPHammer(D)
X6 <- CSPGap(D)
X5 <- CSPEngulfing(D)
X4 <- CSPDoji(D)
X3 <- CSPDarkCloudCover(D)
X2 <- CandleLength(D)
X1 <- CandleBodyLength(D)


dat <- cbind.data.frame(D, X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,
                        X11,X12,X13,X14,X15,X16,X17,X18,X19,
                        X20,X21,X22,X13,X24,X25,X26,X27,X28,X29)


# true,false заменяю на 1 и -1 а NA-шки на 0
dat[dat==TRUE]     <- 1
dat[dat==0]        <- -1
dat[is.na(dat)]    <- 0

# пишем все в файл с которым удобно работать в будущем
save(dat,file = "D:/R/candles_lib/candle_dat.RData")  # ваш путь

 
mytarmailS: 

Саныч когда ты уже научишься нормально цитировать? 

Предикторы не заглядывают в будущее - они повторяю целевую. 

Где форвард тест? Че обсуждать обучение? 

 

ПС

Все по просьбе 

 
СанСаныч Фоменко:

Предикторы не заглядывают в будущее - они повторяю целевую. 

Где форвард тест? Че обсуждать обучение? 

Просто попробуй у себя обучить и напиши что получилось, а там уже будет что по обсуждать, надеюсь..
 
mytarmailS:
Просто попробуй у себя обучить и напиши что получилось, а там уже будет что по обсуждать, надеюсь..

Я понял причину.

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

Если интересно предсказание, то D сдвинь на один шаг влево. Эта модель предсказывает на один шаг вперед. можно на несколько

 
СанСаныч Фоменко:

Я понял причину.

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

Если интересно предсказание, то D сдвинь на один шаг влево. Эта модель предсказывает на один шаг вперед. можно на несколько

В смысле пришла новая цена ?

 код тот что я дал просто делает предикторы из цен которые скачиваються из финама

потом данные сохраняются

# пишем все в файл с которым удобно работать в будущем
save(dat,file = "D:/R/candles_lib/candle_dat.RData")  # ваш путь

потом эти данные  candle_dat.RData мы уже открываем в новом скрипте, там уже делаем целевую и обучаем МО, нет там никакого   пришла новая цена 

ей неоткуда приходить. Целевую я естественно сдвигал на шаг, те под прогноз, я же не первый раз обучаю

так что  то там другое
 

Или я тебя не понял? 
 
mytarmailS:

В смысле пришла новая цена ?

 код тот что я дал просто делает предикторы из цен которые скачиваються из финама

потом данные сохраняются

# пишем все в файл с которым удобно работать в будущем
save(dat,file = "D:/R/candles_lib/candle_dat.RData")  # ваш путь

потом эти данные  candle_dat.RData мы уже открываем в новом скрипте, там уже делаем целевую и обучаем МО, нет там никакого   пришла новая цена 

ей неоткуда приходить. Целевую я естественно сдвигал на шаг, те под прогноз, я же не первый раз обучаю

так что то то там другое
 

Или я тебя не понял? 
А какая целевая?
 
СанСаныч Фоменко:
А какая целевая?

клоуз выше ниже предыдущего клоуз

load(file = "D:/R/candles_lib/candle_dat.RData")

Y <- diff(dat$SPFB.RTS.Close)
Y[Y>=0] <- 1
Y[Y<0] <- 0

dat <- dat[-nrow(dat),]
Y <- as.factor(Y)

tr <- 1:10000
ts <- 10001:15000


library(randomForest)
cm <- colnames(dat)
colnames(dat) <- paste0("var_" , 1:ncol(dat))

model <- randomForest(Y[tr]~., dat[tr,]  , ntree=100, mtry=10)

layout(1:2)
plot(model)
varImpPlot(model,type = 2)

pr <- predict(model,dat[ts,])


library(caret)
confusionMatrix(Y[ts] , pr)


 

 
mytarmailS:

клоуз выше ниже предыдущего клоуз 

Не могу понять где сдвиг целевой? При дифференцировании? Но первой строе предикторов, которая получена вычитанием из 2, ставим в соответствие 1-е значение целевой, т.е. ЗНАЕМ следующие значения для целевой с индексом 2.
 
СанСаныч Фоменко:
Не могу понять где сдвиг целевой? При дифференцировании? Но первой строе предикторов, которая получена вычитанием из 2, ставим в соответствие 1-е значение целевой, т.е. ЗНАЕМ следующие значения для целевой с индексом 2.

при дифференцировании сдвиг идет как бы автоматически так как ряд становиться короче на один элемент, потом все что нужно это укоротить  выборку(табл. с наблюдениями) на последний элемент

вот пример

SomeData <- c(10,20,30,20,10,20,30,40,50,40)

Y <- diff(SomeData)

cbind.data.frame(  Y , SomeData[-length(SomeData)])


 получаем

   Y                   SomeData[-length(SomeData)]
1  10                          10
2  10                          20
3 -10                          30
4 -10                          20
5  10                          10
6  10                          20
7  10                          30
8  10                          40
9 -10                          50
 
mytarmailS:

при дифференцировании сдвиг идет как бы автоматически так как ряд становиться короче на один элемент, потом все что нужно это укоротить  выборку на последний элемент

Сдвигать влево надо не предикторы, а целевую  

Попробую еще раз объяснить.


Строка предикторов с индексом 1 получена =  из ВТОРОЙ и первой строки предикторов. Результат записывается на место с индексом 1.

Целевая как имела индекс =1 так и имеет. Но ее значение мы предсказываем на основе сведений предикторов из БУДУЩЕЙ, второй строки

Сдвиньте целевую на 1, т.е. вместо Y[1:n] возьмите Y[2:n] и посчитайте 

Причина обращения: