Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 261
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
E quais são os resultados na previsão? Atrevo-me a perguntar.
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.
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?
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...
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).
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)
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
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))
}
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
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))
}