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

 
mytarmailS:

ну а если я вместо того чтобы добавлять к "Y" NA в конце,  и потом его же NA буду удалять, просто возьму и удалю последнюю строчку в SomeData , разве это не будет тоже самое?

Я реально не понимаю разницы, может уже перегрелся напрочь (( 

Абсолютно тоже самое. Просто я не делаю так и не понял твое решение.
 
mytarmailS:
не жалко но я не умею, просто не получается сколько раз уже пробовал, ты попробуй по своему, какую целевую я делал ты знаешь , и отпишись как сделаешь 
Все упаковываешь любым упаковщиком и прикрепляешь файл
 
СанСаныч Фоменко:
Все упаковываешь любым упаковщиком и прикрепляешь файл

Да пробовал множество раз, не выходит, выкидывает из форума и все...

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

 
mytarmailS:

Да пробовал множество раз, не выходит, выкидывает из форума и все...

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

Ладно. Пусть так. Буду пробовать свои. Завтра
 
mytarmailS:

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

Меня настораживают два момента в коде:

1) поскольку для прогноза используется ohlc, то самый последний бар нельзя использовать для предсказаний, ведь предсказание мы будем делать в начале бара, и hlc будут меняться в течении жизни всего бара. Получается что обучаем модель используя полностью сформированный последний бар, а на реале потом предсказываем используя несформированный. Так нельзя, сдвиг цели нужно делать не на 1, а на 2 бара. 
Сдвиг цели на 1 бар был бы допустим если вы используете для прогноза только open цены, игнорируя high, low, close.

2) У вас для цели используется Close а не Open. Это важно для какой-то стратегии, или взято просто так? Ведь обычно входим в сделку в начале бара, а потом на следующем новом баре либо переворачиваемся, либо оставляем, либо выходим. И для обученной модели важно предсказать прирост цены от текущего open до следующего open.
Close текущего бара не обязательно совпадают с open следующего, т.е взяв close как цель вы хоть и избавились от первой ошибки, но взамен получили возможно не те приросты. Я сейчас посмотрел, close в таблице цен обычно не совпадает с Open следующего бара, так что ваши целевые значения очень сомнительны.

 

 

Если candlestick перерисовывается, то нужно это обойти.
Берём скользящее окно, первых сотню бар (100 - просто случайное число, для вашего кода минимальное число бар = 23, а если меньше то candlestick кидает ошибки), находим значения индикаторов, оставляем только самые последние из них, находим соответсвующую цель, всё это добавляем в итоговую табличку. Смещаем окно на 1 бар вперёд, повторяем. Всё это в десятки раз медленнее чем просто взять и всё за раз посчитать, но так надёжней. Потом можно сравнить оба результат, и сделать вывод и существовании или нет перерисовки.

Ещё хорошо бы поменять размер скользящего окна, и посмотреть изменятся ли результаты. Если изменятся - то индикатор использует свои собственные предыдущие значения для расчёта новых, ширина окна в таком случае будет работать чем-то вроде экспоненциального периода внутри самого индикатора. Если результат будет меняться, то ширину окна нужно увеличивать до тех пор пока результаты перестанут изменяться. Внутри индикатора может быть какое-то своё внутреннее ограничение на число используемых бар, например зигзаг в mt5 имеет это значение=100 бар, тоесть ширина окна больше сотни уже никак не влияет на результат. 

 

Для начала попробуйте такой код для создания обучающей/тестовой таблички. Сравните с результатами в вашей табличке, если всё совпадёт 100% то перерисовки и использования предыдущих значений для определения новых - нету, и candlestick можно доверять
Потом попробуйте увеличивать indicatorDepth - ширину скользящего окна, посмотрите будет ли менять результат от этого, и можно ли вообще найти такое значение indicatorDepth, когда ещё большее его увеличение не влияет на результат.

 

if(!require(quantmod)){ install.packages("quantmod", dependencies = TRUE); library(quantmod) }
if(!require(rusquant)){ install.packages("rusquant", repos="http://r-forge.r-project.org", dependencies = TRUE); library(rusquant) }
if(!require(candlesticks)){ install.packages("candlesticks", repos="http://r-forge.r-project.org", dependencies = TRUE); library(candlesticks) }


tryCatch({
  load("SPFB.RTS.rdata")
}, error = function(e){
  getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
  save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
  SPFB.RTS <<- SPFB.RTS
  finam.stock.list <<- finam.stock.list
})

chart_Series(tail(SPFB.RTS, 100))


indicatorDepth <- 23

tryCatch({
  load("trainData.rdata")
}, error=function(e){
  trainData <<- matrix(NA, ncol=60, nrow = nrow(SPFB.RTS)-2)
  for(i in (indicatorDepth+1):(nrow(SPFB.RTS)-2)){
    X1  <- as.numeric(tail(CandleBodyLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X2  <- as.numeric(tail(CandleLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X3  <- as.numeric(tail(CSPDarkCloudCover(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X4  <- as.numeric(tail(CSPDoji(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X5  <- as.numeric(tail(CSPEngulfing(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X6  <- as.numeric(tail(CSPGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X7  <- as.numeric(tail(CSPHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X8  <- as.numeric(tail(CSPHarami(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X9  <- as.numeric(tail(CSPInsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X10 <- as.numeric(tail(CSPInvertedHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X11 <- as.numeric(tail(CSPKicking(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X12 <- as.numeric(tail(CSPLongCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X13 <- as.numeric(tail(CSPLongCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X14 <- as.numeric(tail(CSPMarubozu(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X15 <- as.numeric(tail(CSPNHigherClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
    X16 <- as.numeric(tail(CSPNLowerClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
    X17 <- as.numeric(tail(CSPOutsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X18 <- as.numeric(tail(CSPPiercingPattern(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X19 <- as.numeric(tail(CSPShortCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X20 <- as.numeric(tail(CSPShortCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X21 <- as.numeric(tail(CSPStar(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X22 <- as.numeric(tail(CSPStomach(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X23 <- as.numeric(tail(CSPTasukiGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X24 <- as.numeric(tail(CSPThreeInside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X25 <- as.numeric(tail(CSPThreeMethods(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X26 <- as.numeric(tail(CSPThreeOutside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X27 <- as.numeric(head(tail(nextCandlePosition(SPFB.RTS[max(1, i-indicatorDepth):i,]), 2), 1))
    X28 <- as.numeric(tail(TrendDetectionChannel(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X29 <- as.numeric(tail(TrendDetectionSMA(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    target <- as.numeric(SPFB.RTS[i+2,"SPFB.RTS.Open"]) - as.numeric(SPFB.RTS[i+1,"SPFB.RTS.Open"])
    trainData[i,] <<- c(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,target)
    cat(i, "/", nrow(SPFB.RTS)-2, "\n")
  }
  colnames(trainData)[-ncol(trainData)] <- paste0("pred",1:(ncol(trainData)-1))
  colnames(trainData)[ncol(trainData)] <- "target"
  save(trainData, file="trainData.rdata")
})

# trainData <- trainData[-(1:indicatorDepth),]
 
Dr.Trader:

Меня настораживают два момента в коде:

1) поскольку для прогноза используется ohlc, то самый последний бар нельзя использовать для предсказаний, ведь предсказание мы будем делать в начале бара, и hlc будут меняться в течении жизни всего бара. Получается что обучаем модель используя полностью сформированный последний бар, а на реале потом предсказываем используя несформированный. Так нельзя, сдвиг цели нужно делать не на 1, а на 2 бара. 
Сдвиг цели на 1 бар был бы допустим если вы используете для прогноза только open цены, игнорируя high, low, close.

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

2) У вас для цели используется Close а не Open. Это важно для какой-то стратегии, или взято просто так? ........

Взято абсолютно просто так, для быстроты и удобства 

 

Если candlestick перерисовывается, то нужно это обойти........

мне не понятен этот кусок, что он вообще делает? что такое SPFB.RTS.rdata ? 

от куда она взялась?  и почему он потом перезаписываеться? не понятно совсем((


tryCatch({
  load("SPFB.RTS.rdata")
}, error = function(e){
  getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
  save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
  SPFB.RTS <<- SPFB.RTS
  finam.stock.list <<- finam.stock.list
})

И самое главное, вы же наверняка пробовали что то обучить на полученных данных , почему об этом ни слова? поделитесь результатом

 
mytarmailS:

И самое главное, вы же наверняка пробовали что то обучить на полученных данных , почему об этом ни слова? поделитесь результатом

Прогресс создания обучающей таблички - 16527 из 55857. Как создастся, так попробую обучить.

 

mytarmailS:

прогнозируем положение текущего клоуз относительно предыдущего клоуз

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

 

mytarmailS:

мне не понятен этот кусок, что он вообще делает? что такое SPFB.RTS.rdata ? 

 Скачанные котировки. Скачиваем, сохраняем в rdata чтоб Finam не теребонить каждый запуск этого скрипта и не ждать секунды пока они скачаются. А если уже были скачаны раньше и сохранены в rdata файл - то из него и берём.

 
Dr.Trader:

 Спасибо

 
Dr.Trader:

Меня настораживают два момента в коде:

1) поскольку для прогноза используется ohlc, то самый последний бар нельзя использовать для предсказаний, ведь предсказание мы будем делать в начале бара, и hlc будут меняться в течении жизни всего бара. Получается что обучаем модель используя полностью сформированный последний бар, а на реале потом предсказываем используя несформированный. Так нельзя, сдвиг цели нужно делать не на 1, а на 2 бара. 
Сдвиг цели на 1 бар был бы допустим если вы используете для прогноза только open цены, игнорируя high, low, close.

2) У вас для цели используется Close а не Open. Это важно для какой-то стратегии, или взято просто так? Ведь обычно входим в сделку в начале бара, а потом на следующем новом баре либо переворачиваемся, либо оставляем, либо выходим. И для обученной модели важно предсказать прирост цены от текущего open до следующего open.
Close текущего бара не обязательно совпадают с open следующего, т.е взяв close как цель вы хоть и избавились от первой ошибки, но взамен получили возможно не те приросты. Я сейчас посмотрел, close в таблице цен обычно не совпадает с Open следующего бара, так что ваши целевые значения очень сомнительны. 

 

Мне кажется, что Вы все усложняете.

1. Первая проблема  тесно связана со второй. Если мы используем Close в качестве цели, то все остальные три цены сформированы и не меняются. При прогнозе на один шаг вперед сдвигать цель надо на 1 позицию.

2. Ваши аргументы по разности цен Close  и Open также принять не могу. Это на каком ТФ или в какой день недели. Если взять Н1, то имеем три разных вариант:

  • обычный случай, когда эти величины совпадают, либо разнятся на несколько пипсов. Это какой процент от прибыли, которую мы пытаемся взять?
  • случай гэпа, который запросто может быть в 100 пипсов. Это будет обязательно между  Close  и Open? Вот 7 октября бешенное движение было за несколько минут до окончания часа
  • случай перехода с пятницы на понедельник. Так это вообще отдельный случай

 

Это только то, что пришло на ум. А ситуаций может быть гораздо больше. Все они говорят, что реальная торговля сильно отличается от модели. В настоящий момент полезнее сосредоточиться на некотором идеализированном варианте, а остальных драги и прочих программировать отдельно.

3. По-поводу перерисовки.  

Священная корова ТА. Считается некой незыблемой истиной на века.

А на каком основании?

Для всех специалистов, занимающихся АНАЛИЗОМ, изменение данных, на которых они делают свои эпохальные выводы о ПРОШЛОМ, недопустимо. Еще раз: для прошлого недопустимо.

Мы занимаемся прогнозам, и наш взгляд на прошлое не только может, но и должен меняться на основании вновь поступивших данных. Имеется цена не перерисовывающимся данным: запаздывание.

Вот пришел новый бар, который является вестником разворота рынка. Но мы, продолжая кормить священную корову, не меняем свой взгляд на историю ради некоторой идеи, взятой из раздела "анализ".

 

Не надо бояться изменений индикаторов.

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

 

Все это теоретические разговоры. Надо строить модель и получать ее оценку. Чем и займусь 

 

Сделал небольшой дата сет из 5000 цен

скрипт работает не корректно

 когда все посчиталось получил варнинг

....
....
....
5677 / 5688
5678 / 5688
5679 / 5688
5680 / 5688
5681 / 5688
5682 / 5688
5683 / 5688
5684 / 5688
5685 / 5688
5686 / 5688
5687 / 5688
5688 / 5688
Warning message:
In readChar(con, 5L, useBytes = TRUE) :
  cannot open compressed file 'trainData.rdata', probable reason 'No such file or directory'

сами данные

head(trainData)
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[1,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA     NA


 

tail(trainData)
                <NA> <NA>         <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 8.621061e-05   10 0.0016378604  190    0    1    0    0    0    0    0    0    0
[5684,] 6.036304e-04   70 0.0010346611  120    0    0    0    0    0    1    0    0    0
[5685,] 1.208355e-03  140 0.0018122977  210    0    0    0    0    0    0    0    0    0
[5686,] 6.911447e-04   80 0.0019009764  220    0    0    0    0    0    0    0    0    0
[5687,] 2.592577e-04   30 0.0007778402   90    0    0    0    0    0    0    0    0    0
[5688,] 9.501188e-04  110 0.0016415396  190    0    0    0    0    0    0    0    0    0
        <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,]    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
[5684,]    0    0    1    0    0    0    0    0    0    1    0    0    0    0    0    0
[5685,]    0    0    0    0    0    0    0    1    0    1    0    0    0    0    0    0
[5686,]    0    0    0    0    0    0    0    1    0    1    0    0    0    1    0    0
[5687,]    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
[5688,]    0    0    0    0    0    0    1    0    1    0    0    0    0    0    1    0
        <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,]    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
[5684,]    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
[5685,]    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
[5686,]    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
[5687,]    1    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
[5688,]    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
        <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[5683,]   NA   NA   NA   NA   NA   NA    0    1    0    0    0    0    1   -1    -70
[5684,]   NA   NA   NA   NA   NA   NA    0    1    0    0    0    0    1   -1   -140
[5685,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1    -90
[5686,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1     20
[5687,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1    100
[5688,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1     50

Те в данных постоянно присутствуют NA-шки , хотя и не исключаю что что то сам намутил 

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