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

 
Vladimir Perervenko #:

ONNX модель - это разложенный на элементарные операции граф обученной модели. Обучать модель в формате ONNX в Винде невозможно. Пишут о такой возможности в Линукс.

Ее можно использовать только получения предикта (исполняет намного быстрее чем предикт модели) и без Питона. Очень интересное применение модели ONNX в пакете carefree-learn. Внизу рисунок.Взят из описания пакета.

 

Вопрос про ONNX из ONNX возник просто из сопоставления двух встречавшихся утверждений: 1) получение модели представимо в виде конвейера, 2) конвейер можно конвертировать в ONNX формат.

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

Одно дело, если это ограничения типа невозможности записи в файл и другое, если это ограничения вроде отсутствия поддержки типов данных (датафреймов, например).

 
Ivan Butko #:

Виктор Григорьевич, моё почтение xD

Ага, Особенно сегодняшнее видео(((
 
Aleksey Vyazmikin #:

А прошлый код-скрипт, что ранее чуть выложили - перестал работать - раньше работал - до обновлений.

library(patchwork)

  Установлена?

 
Aleksey Vyazmikin #:

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

запустил, у меня такая же картинка )) 


Понял ошибку, там у меня было заглядывание в будущее в целевой.. мда.. теряем хватку

вот эту строку надо заменить 

dp <- с(diff(close),0)   

на 

dp <- tail(c(diff(close),0),nrow(X))


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

close <- cumsum(rnorm(10000,sd = 0.00001))+100
par(mar=c(2,2,2,2))  ; plot(close,t="l")


D <- make_data(close)
tr <- 1:500
R <- make_rules(y = D$Y[tr] , x = D$X[tr,])
# head(R)
buy_rules <- R$condition[ R$pred==1 ]



plot(x = 1:2000,y = rep(NA,2000), ylim = c(-0.001,0.001)) 
for(i in 1:length(buy_rules)){
  cum_profit <- cumsum( D$diff_price[  eval(str2expression(buy_rules[i]))  ] )
  lines(cum_profit,col=8,lwd=1)}
for(i in 1:length(buy_rules)){
  cum_profit <- cumsum( D$diff_price[  eval(str2expression(buy_rules[i]))  ] )
      
      if(length(cum_profit)>30){
      ccor <- cor(cum_profit, 1:length(cum_profit))
      if(ccor>=0.95)  lines(cum_profit,col=i,lwd=2)
      }
}
abline(h = 0,col=2,lty=2)
gc(T,T)

вспомагательные функции

make_rules <- function(y, x){
  library(inTrees)  # ?inTrees::getRuleMetric()
  library(RRF)
  rf <- RRF(x = x,y = y,ntree=100)
  rule <- getRuleMetric(unique(extractRules(RF2List(rf),x)),x,y)
  rule <- data.frame(rule,stringsAsFactors = F)
  for(i in c(1,2,3,5)) rule[,i] <- as.numeric(rule[,i])
  return(rule)}
make_data <- function(close){
  sw <- embed(x = close,dimension = 10)[,10:1] # make slide window data
  X <- t(apply(sw,1,scale)) # normalase data
  
  dp <- tail(c(diff(close),0),nrow(X)) # diff prices
  Y <- as.factor( ifelse(dp>=0,1,-1) ) # target for classification
  res <- list(Y=Y,X=X,diff_price=dp)
  return(res)
}


 
Maxim Dmitrievsky #:

ну если нет никаких других критериев оценки, то через устойчивость параметров

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

Для строителей кастомных ФФ может быть полезно.

самое лучшее мерило - это время и тесты в реале. Любая ТС перестает работать.

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

 
Aleksey Nikolayev #:

Вопрос про ONNX из ONNX возник просто из сопоставления двух встречавшихся утверждений: 1) получение модели представимо в виде конвейера, 2) конвейер можно конвертировать в ONNX формат.

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

Одно дело, если это ограничения типа невозможности записи в файл и другое, если это ограничения вроде отсутствия поддержки типов данных (датафреймов, например).

Оба утверждения верны. Получение модели включая препроцессинг - возможно. К сожалению не во все фреймворках и только простейшие. ТФ/Керас внедряют первые слои NN выполняющие препроцессинг. scikit-learn имеет самый богатый выбор  pipeline+model .   Смотрите scl2onnx.

Радует то, что серьезные участники понимают, что ONNX должен включать весь конвейер (pipeline) начиная с препроцессинга. Новые данные в производстве должны проходить те же этапы препроцесинга что и при обучении. Иначе результаты работы модели ONNX будут непредсказуемые. 

Это направление стремительно развивается и я думаю, что скоро и этот вопрос будет решен. Пока нужно экспериментировать.

Удачи

 
Комментарии, не относящиеся к этой теме, были перенесены в "Недопустимый способ общения".
 
mytarmailS #:

запустил, у меня такая же картинка )) 


Понял ошибку, там у меня было заглядывание в будущее в целевой.. мда.. теряем хватку

вот эту строку надо заменить 

на 


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

вспомагательные функции


Пробую измененный код

close <- cumsum(rnorm(10000,sd = 0.00001))+100
par(mar=c(2,2,2,2))  ; plot(close,t="l")


D <- make_data(close)
tr <- 1:500
R <- make_rules(y = D$Y[tr] , x = D$X[tr,])
# head(R)
buy_rules <- R$condition[ R$pred==1 ]



plot(x = 1:2000,y = rep(NA,2000), ylim = c(-0.001,0.001)) 
for(i in 1:length(buy_rules)){
  cum_profit <- cumsum( D$diff_price[  eval(str2expression(buy_rules[i]))  ] )
  lines(cum_profit,col=8,lwd=1)}
for(i in 1:length(buy_rules)){
  cum_profit <- cumsum( D$diff_price[  eval(str2expression(buy_rules[i]))  ] )
  
  if(length(cum_profit)>30){
    ccor <- cor(cum_profit, 1:length(cum_profit))
    if(ccor>=0.95)  lines(cum_profit,col=i,lwd=2)
  }
}
abline(h = 0,col=2,lty=2)
gc(T,T)

make_rules <- function(y, x){
  library(inTrees)  # ?inTrees::getRuleMetric()
  library(RRF)
  rf <- RRF(x = x,y = y,ntree=100)
  rule <- getRuleMetric(unique(extractRules(RF2List(rf),x)),x,y)
  rule <- data.frame(rule,stringsAsFactors = F)
  for(i in c(1,2,3,5)) rule[,i] <- as.numeric(rule[,i])
  return(rule)}
make_data <- function(close){
  sw <- embed(x = close,dimension = 10)[,10:1] # make slide window data
  X <- t(apply(sw,1,scale)) # normalase data
  
  dp <- tail(c(diff(close),0),nrow(X)) # diff prices
  Y <- as.factor( ifelse(dp>=0,1,-1) ) # target for classification
  res <- list(Y=Y,X=X,diff_price=dp)
  return(res)
}

Получаю ошибку

> D <- make_data(close)
Error in make_data(close) : could not find function "make_data"
> source('~/.active-rstudio-document', echo=TRUE)

> close <- cumsum(rnorm(10000,sd = 0.00001))+100

> par(mar=c(2,2,2,2))  ; plot(close,t="l")

> D <- make_data(close)
Error in make_data(close) : could not find function "make_data"
> source('~/.active-rstudio-document', echo=TRUE)

> close <- cumsum(rnorm(10000,sd = 0.00001))+100

> par(mar=c(2,2,2,2))  ; plot(close,t="l")

> D <- make_data(close)
Error in make_data(close) : could not find function "make_data"
> 
 
Aleksey Vyazmikin #:

Пробую измененный код

Получаю ошибку

Потому что функции надо сначало объявить, а потом использовать.. 

Вы тролите или что? 
 
mytarmailS #:
Потому что функции надо сначало объявить, а потом использовать.. 

Вы тролите или что? 

Откуда я знал...

Тогда такая ошибка выдаётся

> D <- make_data(close)
Error in h(simpleError(msg, call)) : 
  ошибка при оценке аргумента '.data' при выборе метода для функции 'embed': argument ".data" is missing, with no default
Причина обращения: