Discussão do artigo "Gradient Boosting (CatBoost) no desenvolvimento de sistemas de negociação. Uma abordagem ingênua"

 

Novo artigo Gradient Boosting (CatBoost) no desenvolvimento de sistemas de negociação. Uma abordagem ingênua foi publicado:

Treinamento do classificador CatBoost em Python e exportação do modelo para a mql5, bem como a análise dos parâmetros do modelo e um testador de estratégia customizado. A linguagem Python e a biblioteca MetaTrader 5 são usadas para preparar os dados e treinar o modelo.

O robô compilado pode ser testado no Testador de Estratégia padrão da MetaTrader 5. Selecionamos um tempo gráfico adequado (que deve corresponder ao utilizado no treinamento do modelo) e as entradas look_back e MA_period, que também deve corresponder aos parâmetros do programa em Python. Vamos verificar o modelo no período de treinamento (subamostras treinamento + validação):

Desempenho do modelo (subamostras de treinamento + validação)

Se nós compararmos o resultado com o obtido no testador personalizado, esses resultados são iguais, exceto por alguns desvios do spread. Agora, vamos testar o modelo usando os dados absolutamente novos, desde o início do ano:

Desempenho do modelo em novos dados

O modelo teve um desempenho significativamente pior com os novos dados. Esse resultado ruim está relacionado a razões objetivas, que eu tentarei descrever mais adiante.

Autor: Maxim Dmitrievsky

 

Não há necessidade de misturar as coisas aqui

train_X, test_X, train_y, test_y = train_test_split(X, y, train_size = 0.5, test_size = 0.5, shuffle=True)

De acordo com a ajuda em https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

shuffle bool, default=True

Se os dados devem ou não ser embaralhados antes da divisão. Se shuffle=False, então stratify deve ser None.

Os dados são embaralhados antes da divisão, ou seja, alguns exemplos do teste serão incluídos no trem.

Em geral, gostei do artigo, pois mostra que é muito fácil implementar e usar a IA na negociação.

sklearn.model_selection.train_test_split — scikit-learn 0.23.2 documentation
  • scikit-learn.org
*arrays , **options ¶ Quick utility that wraps input validation and and application to input data into a single call for splitting (and optionally subsampling) data in a oneliner. Parameters *arrays Allowed inputs are lists, numpy arrays, scipy-sparse matrices or pandas dataframes. test_size If float, should be between 0.0 and 1.0 and represent...
 
Você pode fazer o último gráfico do artigo, mas sem misturar?
Acho que a validação se deterioraria e o teste em dados desconhecidos poderia melhorar.
[Excluído]  
elibrarius:

Não há necessidade de se mexer aqui

De acordo com a ajuda https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Os dados são misturados antes da divisão, ou seja, alguns exemplos do teste serão incluídos no trem.

Em geral, gostei do artigo, pois ele mostra que é muito fácil implementar e usar a IA na negociação.

Faço isso de propósito para equilibrar um pouco as amostras. Sem a mistura, o teste fica pior, mas quase não tem efeito sobre os novos dados. Mostrarei exemplos mais tarde.

 

É isso que eu não entendo:

if dataset['close'][i] >= (dataset['close'][i + rand]):
            labels.append(1.0)
        elif dataset['close'][i] <= (dataset['close'][i + rand]):
            labels.append(0.0)              
        else:
            labels.append(0.0)

As condições que nunca funcionarão estão marcadas em vermelho.

[Excluído]  
Stanislav Korotky:

É isso que eu não entendo:

As condições que nunca funcionarão estão marcadas em vermelho.

Não há nada de errado aqui, eu mudei as condições e ainda tenho artefatos.

 
Maxim, mil vezes obrigado por compartilhar esses artigos...
Especialmente pela importação do modelo python no mql5.
Como não sou um especialista em ALGLIB, acho que o XGBoost, o CATBoost e o Pytorch são, de longe, superiores para fazer aprendizado profundo e de máquina.
 
Trabalho muito interessante! Agradecimentos ao autor.
 
Há uma pergunta relacionada ao artigo, não diretamente, mas indiretamente, por meio da dependência do CatBoost.

Alguém pode explicar nos dedos como é feita a separação por característica (variável de entrada) no CatBoost (ou mais generalizada - na árvore de decisão de aumento de gradiente baseada em histograma) com base no histograma? Está claro que, para cada bin (barra do histograma), são calculadas estatísticas: o número total de ocorrências de vetores com um valor no intervalo do bin e sua divisão por pertencer a classes de saída (nesse caso, duas). E tendo um histograma com essas estatísticas, como escolher uma divisão para criar a árvore do próximo nível?

 
Stanislav Korotky:
Houve uma pergunta relacionada ao artigo, não diretamente, mas indiretamente por meio da dependência do CatBoost.

Alguém pode explicar nos dedos como é feita a separação por característica (variável de entrada) no CatBoost (ou mais generalizada - na árvore de decisão de aumento de gradiente baseada em histograma) com base no histograma? Está claro que, para cada bin (barra do histograma), são calculadas estatísticas: o número total de ocorrências de vetores com um valor no intervalo do bin e sua divisão por pertencer a classes de saída (nesse caso, duas). E tendo o histograma com essas estatísticas, como escolher a divisão para criar a árvore do próximo nível?

As árvores são construídas independentemente umas das outras e, em seguida, a contagem é feita nas folhas (enumeração por preditores não quantificados) de forma que o erro de gradiente seja reduzido.

Ao selecionar preditores para a construção e divisão de árvores, são usados coeficientes aleatórios, o que possibilita, em teoria, aumentar a integridade (Recall) e evitar o treinamento excessivo.

[Excluído]  
Stanislav Korotky:
Houve uma pergunta relacionada ao artigo, não diretamente, mas indiretamente por meio da dependência do CatBoost.

Alguém pode explicar nos dedos como é feita a separação por característica (variável de entrada) no CatBoost (ou mais generalizada - na árvore de decisão de aumento de gradiente baseada em histograma) com base no histograma? Está claro que, para cada bin (barra do histograma), são calculadas estatísticas: o número total de ocorrências de vetores com um valor no intervalo do bin e sua divisão por pertencer a classes de saída (nesse caso, duas). E tendo um histograma com essas estatísticas, como escolher uma divisão para criar a árvore do próximo nível?

É melhor perguntar aos desenvolvedores