Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 3048

 
Aleksey Vyazmikin #:

E o script de código anterior, que foi postado um pouco antes, parou de funcionar - costumava funcionar - antes das atualizações.

library(patchwork)

Ele está instalado?

 
Aleksey Vyazmikin #:

Na atualização geral, mesmo que o erro não seja gravado, o resultado é o mesmo: quase tudo está perdido.

Eu executei, obtive a mesma imagem))


Percebi o erro, pois dei uma olhada no futuro no alvo... sim... perdemos o controle.

Essa linha deve ser substituída

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

por

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


Reescrevi o código de forma um pouco mais legível.

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)

Funções auxiliares

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 #:

Bem, se não houver outros critérios de avaliação, então, por meio da estabilidade dos parâmetros

também é possível representar os valores de saída do TS como sinais no tempo, medir sua entropia e compará-la com a aleatoriedade. Se o TS capturar algumas regularidades que se repetem com certa periodicidade, isso será refletido.

Para os criadores de FFs personalizados, isso pode ser útil.

A melhor medida é o tempo e os testes na vida real. Qualquer TC deixará de funcionar.

Já entendi por que tudo isso não funciona com novos dados, e até entendo mais ou menos o que fazer.

 
Aleksey Nikolayev #:

A pergunta sobre o ONNX a partir do ONNX surgiu simplesmente da justaposição de duas afirmações que encontrei: 1) a aquisição de modelos pode ser representada como um pipeline, 2) o pipeline pode ser convertido para o formato ONNX.

Está claro que isso dificilmente é possível na prática. Na verdade, eu gostaria de entender o que exatamente impede a implementação de tal possibilidade, a fim de perceber as limitações fundamentais dessa tecnologia como um todo.

Uma coisa são limitações como a impossibilidade de gravar em um arquivo e outra são limitações como a falta de suporte a tipos de dados (dataframes, por exemplo).

Ambas as afirmações são verdadeiras. É possível obter um modelo incluindo o pré-processamento. Infelizmente, não em todas as estruturas e somente nas mais simples. O TF/Keras implementa as primeiras camadas de NN realizando o pré-processamento. O scikit-learn tem a opção mais rica de pipeline+modelo. Consulte scl2onnx.

É bom ver que os colaboradores sérios percebem que o ONNX deve incluir todo o pipeline, começando pelo pré-processamento. Os novos dados em produção devem passar pelas mesmas etapas de pré-processamento que no treinamento. Caso contrário, os resultados do modelo ONNX serão imprevisíveis.

Essa direção está se desenvolvendo rapidamente e acredito que esse problema será resolvido em breve. Por enquanto, você deve fazer experiências.

Boa sorte

 
Os comentários não relevantes para este tópico foram movidos para "Maneira inaceitável de se comunicar".
 
mytarmailS #:

e eu obtive a mesma imagem ))


Percebi meu erro, dei uma olhada no futuro no alvo... sim... estou perdendo o jeito.

Essa linha deve ser substituída

para


reescrevi um pouco o código para ficar mais legível

funções auxiliares


Testando o código modificado

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)
}

Recebo um erro

> 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 #:

Experimentando o código modificado

Recebo um erro

Porque as funções devem ser declaradas primeiro e depois usadas...

Você está trollando ou o quê?
 
mytarmailS #:
Como as funções precisam ser declaradas primeiro e depois usadas...

Você está trollando ou algo assim?

Como eu sabia...

Então este é o erro

> D <- make_data(close)
Error in h(simpleError(msg, call)) : 
  ошибка при оценке аргумента '.data' при выборе метода для функции 'embed': argument ".data" is missing, with no default
 
Artigo interessante sobre a RL. https://habr.com/ru/articles/349800/
Também uma conversa interessante no cometário entre o criador deste tópico e outro membro.
 
mytarmailS #:
Artigo interessante sobre a RL. h ttps:// habr.com/ru/articles/349800/
Também uma conversa interessante no cometário entre o criador deste tópico e outro membro.

O conceito de RL não é redundante para tarefas de negociação? Temos a influência do ambiente sobre o agente, mas existe uma influência do agente sobre o ambiente? Provavelmente é possível introduzir essa segunda influência artificialmente, mas isso faz sentido?

Duas (ou três) ideias do artigo não são supérfluas para nós: a função de perda deve refletir exatamente o que precisamos e deve ser suave (e monotônica). No nosso caso, ela deve ser o lucro e deve depender de forma suave e monotônica dos parâmetros do modelo.

A suavidade de algum análogo do lucro, provavelmente, pode ser obtida de alguma forma (por exemplo, por algo como suavização de kernel). Mas duvido muito da monotonicidade.