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

 
E quais são os resultados na previsão? Atrevo-me a perguntar.
 
mytarmailS:
E quais são os resultados na previsão? Atrevo-me a perguntar.
Se me perguntou, provavelmente não posso responder de forma inequívoca, há muita coisa que está sendo prevista e tudo é diferente. Mas, em média, cerca de 60-65%.
 

Aqui está a planilha preparada para o treinamento do modelo.

Os preços são convertidos em deltas por colunas; colunas removidas sem alterações ou com NA.

3 desfasamentos em cada linha para cada coluna (linha atual menos a anterior; anterior menos a pré-existente; pré-existente menos a pré-existente)

Alvo - aumentar/diminuir o valor na linha seguinte (linha seguinte menos a linha atual, arredondado para +-1, ou 0 se não houver alteração; 3 classes no total). Todos os alvos têm o prefixo "target_".

* Nenhum outro alvo pode ser usado para prever um alvo, ou seria uma espreitadela no futuro. Todas as colunas que são prefixadas com "target_" não podem ser usadas como um preditor ou um intuidor.

Arquivos anexados:
 

Problema.

Arquivo csv dividido em duas partes por linhas, proporção 10:1 para dados de treinamento e fronttest. Eu treinei o modelo para target_SiH7.bid (da tabela acima) e obtive precisão de classificação de 62% nos dados de treinamento e 74% nos novos dados. Ficou feliz, mas duplamente verificado, verificou-se que a classe 0 é muito desequilibrada em relação às outras, e só pela quantidade tem 60% e 74%. Ou seja, o modelo aprendeu a detectar bem 0, mas ficou atolado nas classes -1 e 1.

Uma pontuação diferente é necessária. Para duas classes desequilibradas esta métrica é ótima -https://en.wikipedia.org/wiki/Cohen's_kappa, mas no nosso caso existem três classes desequilibradas, não duas, existe um analógico Kappa para 3?

 
Eunão tenho:
Se você me perguntou, provavelmente não posso responder sem ambigüidade, há muitas coisas que estão previstas e tudo é diferente. Mas, em média, cerca de 60-65%.

Interessante, pode descrevê-lo com mais detalhes...

É que agora estou numa área completamente diferente de previsão e não posso dar-me ao luxo de estar disperso por isso não posso fazer experiências contigo nesta data de marcha, mas é muito interessante ler e observar, escrever mais, por favor...

Dr. Trader:

Acontece que a classe 0 é muito desequilibrada em relação às outras, e só em termos de quantidade tem 60% e 74%. Ou seja, o modelo aprendeu a detectar 0 muito bem, mas desistiu das classes -1 e 1.

Eu tive o mesmo problema quando treinei a minha floresta aleatória para as inversões de marcha, havia naturalmente muito menos inversões de marcha do que não inversões de marcha. Quanto mais árvores eu fiz, mais o MO pontuou nas aulas de turnos e se concentrou mais nas aulas sem turnos.

Existem vários métodos no carpete para equilibrar as classes, mas todos eles são triviais - ou o dobro da classe que tem menos observações para alinhar a soma das observações em todas as classes para obter o mesmo, ou vice-versa remover observações supérfluas da classe que tem mais observações.

Nenhum dos métodos é mais rentável do que sem equilíbrio (mas isso é apenas no meu caso).

 
mytarmailS:

Interessante, pode descrevê-lo com mais detalhes...

Estou agora a trabalhar numa área completamente diferente de previsão e não posso dar-me ao luxo de me perder, por isso não posso fazer experiências contigo nesta data de marcha, mas é muito interessante ler e observar, por favor escreve mais...

Eu tinha o mesmo problema quando estava a treinar para as voltas em U, as voltas em U, claro, eram muito menos do que as voltas em U. Quanto mais árvores eu fazia, mais o MO ficava atolado com a classe U-turn e se concentrava mais na classe non-turn.

Existem vários métodos no carpete para equilibrar as classes, mas todos eles são triviais - ou o dobro da classe que tem menos observações para alinhar a soma das observações em todas as classes para se tornar a mesma ou remover observações desnecessárias da classe que tem mais observações.

Nenhum dos métodos é mais rentável do que sem equilíbrio (mas isto é apenas no meu caso)

Na carpete é possível alterar a função de aptidão na função de comboio através de algum parâmetro. Para a classificação você pode usar precisão ou kappa: e para a regressão algumas duas variantes próprias, como r^2 e algo mais. Aprendi kappa só de lá, me ajudou a treinar um modelo corretamente em aulas muito desequilibradas, sem nenhuma operação adicional.
 
Se estamos a discutir reversões, então devemos equilibrar as classes de uma forma significativa: não uma barra para uma reversão, mas várias barras antes da reversão e várias barras após a reversão. Se as classes são desequilibradas de qualquer forma, mas não tão fatais e podem ser equilibradas por carpete
 
tóxico:

Tudo é negociável. Eu sugeri futuros, por exemplo Si, RI, BR etc. os mais líquidos em geral. Sugiro sinal (-1,0,1)(curto,dinheiro,longo) como resultado, o sinal é inequívoco do que a probabilidade e não distorcidopelo MM como ordens. O pós-processamento, a sinalização e a segmentação são da sua responsabilidade, ou a reserva.

Depois de algum pensamento cheguei à conclusão que pelo menos mais um vidro deve ser adicionado{price:vol,...||..., price:vol } como é, um último por segundo, para cada instrumento previsto, então o delta não é necessário e lance, pergunte também, é IMHO obrigatório, se com uma fita por segundo os volumes divididos e deslocamento do OM, mais ou menos informativos, então para o vidro um delta é muito pouco, pelo menos um deve ver diferentes "placas" de distribuição, etc. e isso é o suficiente como um começo. Adicione um tumbler e coloque um conjunto de dados de treinamento por alguns dias, nós vamos jogar. :)

 

Finalmente, resolveu sobre a métricaPi de Scotthttps://en.wikipedia.org/wiki/Scott's_Pi

Aqui estão os meus resultados com esta estimativa, treinei o modelo nas primeiras 91% das linhas, e depois fiz o frontest nos últimos dados restantes (ratio backtest : frontest = 10:1)
coluna "class_0_rate" na tabela - relação da classe 0 para as classes -1e1, para que eu pudesse peneirar no Excel aqueles resultados onde esse valor é muito alto.

As duas últimas colunas são a métrica Pi de Scott para treinamento e testes, o valor será de -1 a 1; onde 0=resultado é aleatório e o meodelo é inútil, e 1 = tudo está bem. Um resultado negativo não é bom, correlação inversa, você pode tentar inverter o resultado da previsão. A correlação inversa às vezes funciona bem com duas classes quando se negocia exatamente o oposto da previsão. Mas com três classes é difícil encontrar o oposto, cada classe tem dois valores opostos e neste caso o valor negativo também é mau.

Acho que precisamos escolher a moeda em que as previsões de compra (ou venda) têm valores semelhantes e altos no backtest e fronttest, por exemplo, xagusd. Embora uma pontuação de 0,18 em uma escala de 0 a 1 seja pequena. E prever um tique à frente no comércio real também é mau. Em geral há um resultado, mas não é aplicável :)

Código R para Scott's Pi

ScottsPi <- function(act, pred){
  if(length(act) != length(pred)){
    stop("different length")
  }
  
  n_observ <- length(act)
  
  all_levels <- unique(c(act,pred))
  n_levels <- length(all_levels)
  
  marginal_matrix <- matrix(NA, ncol=n_levels, nrow=n_levels)
  colnames(marginal_matrix) <- all_levels
  rownames(marginal_matrix) <- all_levels
  
  for(i in 1:n_levels){
    for(j in 1:n_levels){
      marginal_matrix[i,j] <- sum((act==all_levels[i]) & (pred==all_levels[j]))
    }
  }
  diagSum <- 0
  for(i in 1:n_levels){
    diagSum <- diagSum + marginal_matrix[i,i]
  }
  diagSum <- diagSum / n_observ
  
  marginalSum <- 0
  for(i in 1:n_levels){
    marginalSum <- marginalSum + ((sum(marginal_matrix[i,]) + sum(marginal_matrix[,i]))/n_observ/2)^2
  }
  p <- marginalSum
  return((diagSum - p)/(1-p))
}
Arquivos anexados:
 
Dr. Trader:

Finalmente, resolveu a métricaPi do Scotthttps://en.wikipedia.org/wiki/Scott's_Pi

Aqui estão os meus resultados com esta estimativa, modelo treinado nas primeiras 91% das linhas, e depois fez frontest nos últimos dados restantes (ratio backtest : fronttest = 10:1)
coluna "class_0_rate" na tabela - relação da classe 0 para as classes -1e1, para que eu pudesse peneirar no Excel aqueles resultados onde esse valor é muito alto.

As duas últimas colunas são a métrica Pi de Scott para treinamento e testes, o valor será de -1 a 1; onde 0=resultado é aleatório e o meodelo é inútil, e 1 = tudo está bem. Um resultado negativo não é bom, correlação inversa, você pode tentar inverter o resultado da previsão. A correlação inversa às vezes funciona bem com duas classes quando se negocia exatamente o oposto da previsão. Mas com três classes é difícil encontrar o contrário, cada classe tem duas opostas e, neste caso, o resultado negativo também é mau.

Acho que precisamos escolher a moeda em que as previsões de compra (ou venda) têm valores semelhantes e altos no backtest e fronttest, por exemplo, xagusd. Embora uma pontuação de 0,18 em uma escala de 0 a 1 seja pequena. E prever um tique à frente no comércio real também é mau. Em geral há um resultado, mas não é aplicável :)

Código R para Scott's Pi

ScottsPi <- function(act, pred){
  if(length(act) != length(pred)){
    stop("different length")
  }
  
  n_observ <- length(act)
  
  all_levels <- unique(c(act,pred))
  n_levels <- length(all_levels)
  
  marginal_matrix <- matrix(NA, ncol=n_levels, nrow=n_levels)
  colnames(marginal_matrix) <- all_levels
  rownames(marginal_matrix) <- all_levels
  
  for(i in 1:n_levels){
    for(j in 1:n_levels){
      marginal_matrix[i,j] <- sum((act==all_levels[i]) & (pred==all_levels[j]))
    }
  }
  diagSum <- 0
  for(i in 1:n_levels){
    diagSum <- diagSum + marginal_matrix[i,i]
  }
  diagSum <- diagSum / n_observ
  
  marginalSum <- 0
  for(i in 1:n_levels){
    marginalSum <- marginalSum + ((sum(marginal_matrix[i,]) + sum(marginal_matrix[,i]))/n_observ/2)^2
  }
  p <- marginalSum
  return((diagSum - p)/(1-p))
}
Os dados são muito poucos, meu amigo pendura um conjunto de dados normal, mas em algum lugar se perdeu. Dr Trader: Não há muitos dados, mas está perdido em algum lugar. E se você não está sendo específico, é claro, para o tick à frente é realmente inútil, pelo menos um minuto à frente, em passes um minuto é puro MM, limitadores em ambos os lados, a uma distância proporcional à propagação, aqui "espuma quântica", não adianta falar em direção, porque é muito menor do que a propagação.