English Русский Español Deutsch 日本語
preview
Interpretação de modelos: Compreensão mais profunda dos modelos de aprendizado de máquina

Interpretação de modelos: Compreensão mais profunda dos modelos de aprendizado de máquina

MetaTrader 5Aprendizado de máquina | 15 maio 2024, 16:59
72 0
Gamuchirai Zororo Ndawana
Gamuchirai Zororo Ndawana

Introdução

No campo do aprendizado de máquina, é comum enfrentarmos a necessidade de fazer escolhas difíceis. Ao otimizar uma métrica, muitas vezes sacrificamos outra. Conforme construímos modelos cada vez mais vastos e complexos, sua compreensão, explicação e depuração se tornam desafios crescentes. Os aspectos ocultos dos modelos são vitais para entender por que eles tomam uma decisão ou outra. Sem essa compreensão, como poderíamos assegurar que estamos gerenciando corretamente o modelo para alcançar os resultados esperados? Não podemos deixar que o modelo opere de maneira inadequada, pois nossos esforços seriam em vão! O artigo discute os seguintes aspectos:

  1. Definição das características essenciais: identificação das características que o modelo considera importantes.

  2. Análise do impacto de uma característica específica: compreender como cada característica influencia o desempenho do modelo.

  3. Avaliação do impacto coletivo das características: examinar como as características em conjunto afetam as previsões do modelo.

O artigo expõe as sutilezas do aprendizado de máquina, permitindo uma melhor compreensão e modificação do comportamento do modelo. Com os conhecimentos adquiridos, você será capaz de aumentar a eficácia dos seus esforços ao trabalhar com aprendizado de máquina.


Por que isso é importante?

Depuração:

Fig. 1. A arte da depuração

"Errar é humano, perdoar é divino" ~ Alexander Pope

À primeira vista, a depuração pode parecer uma rotina, mas não se deve superestimar sua importância. Pense nos erros sutis que escapam à detecção durante a execução. Os conhecimentos presentes neste artigo lhe capacitarão a desvendar os complexos padrões que estruturam seus modelos. Você será capaz de discernir se esses padrões estão alinhados com sua percepção do mundo real. No intrincado labirinto dos projetos práticos, você encontrará a habilidade de rastrear e corrigir seus próprios erros, acumulando a experiência necessária.

Melhoria no desenvolvimento de características:

Desenvolvimento de características

Fig. 2. Desenvolvimento de características

"Melhoria constante é melhor do que a perfeição adiada" ~ Mark Twain

Vamos aprofundar na área de desenvolvimento de características. Imagine um círculo. Trace uma linha vermelha através do seu diâmetro. Quantas vezes o diâmetro pode envolver a circunferência? A resposta é óbvia – cerca de 3,145, valor conhecido universalmente como o número Pi.

Esse experimento mental atua como um farol, iluminando o impacto da apresentação em nossa capacidade de absorver conhecimento. Assim como a curvatura de um círculo influencia sua forma, as transformações que aplicamos aos objetos podem aprimorar a harmonia do nosso conjunto de dados. Ao criar novas colunas, transcendemos o trivial, elevando a precisão de nossas previsões a novos patamares. Aqui, a intuição se torna nosso guia, navegando por mares nunca antes explorados. E se a intuição nos falha? Não há motivo para alarme. Dispomos de estratégias para navegar até pelos caminhos mais tortuosos, enquanto continuamos a avaliar empiricamente a eficácia das características recém-desenvolvidas.


Gestão da coleta de dados futura:

Fig. 3. Melhoria na coleta de dados


"Se quiser prever o futuro, olhe para o passado" ~ Albert Einstein

Ao lidar com dados, é necessário se lembrar do provérbio antigo: a chave para o futuro está no passado. Teríamos esgotado todas as possibilidades de desenvolvimento de características? No universo dos dados, o passado serve de farol. Novos tipos de dados nos atraem, prometendo revitalizar nossos modelos. A compreensão, nossa fiel aliada, age como mediadora, guiando-nos em direção às joias escondidas nos tesouros de dados. A cada nova compreensão que adquirimos, o caminho para desenvolver novas características se torna mais evidente.

Melhoria na tomada de decisões:

Fig. 4. Melhoria na tomada de decisões

"Pouco aprendizado é uma coisa perigosa" ~ Alexander Pope

Na grande orquestra do aprendizado de máquina, você é o maestro. O modelo dança ao som de sua batuta, revelando as decisões que animam suas previsões. O aprendizado de máquina transcende meras previsões; seu entendimento e sua habilidade formam a base sobre a qual suas ambições são erguidas. Cada nova compreensão molda de forma significativa seus esforços.


Teoria

Neste artigo, exploramos a aplicação de um modelo de árvore com gradiente reforçado (gradient boosted tree model), especificamente usando a biblioteca Python CatBoost, para análises de regressão de preços. Desde o início, notamos um problema significativo que exige um exame mais detalhado do modelo. Antes de explorar técnicas de interpretação para nosso modelo "caixa preta", é necessário entender as limitações desse tipo de modelo e por que há a necessidade de explicadores (explainers) "caixa preta" nesse cenário.

As árvores de gradiente reforçado são eficazes em tarefas de classificação, mas encontram barreiras significativas em regressões específicas de séries temporais. Essas árvores, que são modelos de aprendizado de máquina, segmentam os dados de entrada em grupos conforme o valor alvo. O algoritmo, então, determina o valor médio do alvo para cada grupo e utiliza esses valores médios para prever resultados futuros. É importante notar que esses valores médios, definidos durante o processo de treinamento, não se alteram a menos que um novo treinamento seja executado. Essa característica estática representa uma limitação crítica, visto que árvores de gradiente aumentado muitas vezes falham em extrapolar novas tendências de forma acurada. Frequentemente, ao se depararem com novos dados fora da faixa de treinamento, essas árvores tendem a replicar previsões anteriores, apoiando-se em médias de grupos já conhecidos, o que pode não corresponder com precisão às tendências reais fora do alcance do treinamento.

Adicionalmente, o modelo presume que características similares resultam em valores alvo semelhantes, o que é contraditório com o que observamos nos mercados de títulos financeiros. Nos mercados, é comum modelos de preços aparentemente similares resultarem em desfechos distintos, o que desafia a premissa do modelo de dados homogeneamente agrupados. Essa contradição introduz um viés no modelo.

Para ilustrar melhor essas observações, faremos uma demonstração para os leitores que talvez não tenham percebido essa dinâmica por si mesmos. Nosso objetivo é assegurar que todos os leitores alcancem uma compreensão profunda do tema.

Começamos carregando as dependências necessárias

#pip install pandas if you haven't installed it allready
#We'll use pandas to store and retrieve data
import pandas as pd       

#pip install pandas-ta if you haven't installed it allready
#We'll use pandas_ta to calculate technical indicators
import pandas_ta as ta    

#pip install numpy if you haven't installed it allready
#We'll use numpy to perform optmized vector calculations 
import numpy as np

import matplotlib.pyplot as plt

#pip install numpy if you haven't installed it allready
#We'll use MetaTrader 5 connect to and control our MetaTrader 5 Terminal 
import MetaTrader5 as MT5

#Standard python library
import time
Em seguida, inserimos nossas credenciais para login
login = enter_your_login
password =  enter_your_password
server = enter_your_broker_server
Inicializamos nosso terminal MetaTrader 5 e nos autenticamos.
if(MT5.initialize(login=login, password= password, server=server)):
    print("Logged in succesfully")
else:
    print("Failed to initialize the terminal and login")
Autenticação bem-sucedida
Vamos solicitar um milhão de linhas de dados M1 do índice de volatilidade 75 ou qualquer outro símbolo que você prefira.

data = pd.DataFrame(MT5.copy_rates_from_pos("Volatility 75 Index",MT5.TIMEFRAME_M1,0,100000))
data

Dados de mercado

Fig. 5. Nossos dados de mercado do terminal MetaTrader 5

Determinamos os indicadores técnicos que nos podem ajudar a prever o preço.

#20 period exponential moving average
data["ema_20"] = data.ta.ema(length=20)
#40 period exponential moving average
data["ema_40"] = data.ta.ema(length=40)
#100 period exponential moving average
data["ema_100"] = data.ta.ema(length=100)
#20 period relative strength indicator
data.ta.rsi(length=20,append=True)
#20 period bollinger bands with 3 standard deviations
data.ta.bbands(length=20,sd=3,append=True)
#14 period average true range
data.ta.atr(length=14,append=True)
#Awesome oscilator with default settings
data.ta.ao(append=True)
#Moving average convergence divergence (MACD)
data.ta.macd(append=True)
#Chaikins commidity index
data.ta.cci(append=True)
#Know sure thing oscilator
data.ta.kst(append=True)
#True strength index
data.ta.tsi(append=True)
#Rate of change
data.ta.roc(append=True)
#Slope between 2 points
data.ta.slope(append=True)
#Directional movement
data.ta.dm(append=True)

Configuração do alvo

data["target"] = data["close"].shift(-30)

Configuramos nosso modelo de caixa preta

from catboost import CatBoostRegressor

Preparação dos splits de treino e teste

train_start = 100
train_end   = 10000

test_start = train_end + 100
test_end = test_start + 30000

predictors = [
    "open",
    "high",
    "low",
    "close",
    "KSTs_9",
    "KST_10_15_20_30_10_10_10_15",
    "CCI_14_0.015",
    "AO_5_34",
    "ATRr_14",
    "BBM_20_2.0",
    "BBP_20_2.0",
    "BBB_20_2.0",
    "BBU_20_2.0",
    "BBL_20_2.0",
    "RSI_20",
    "ema_20",
    "ema_40",
    "ema_100",
    "SLOPE_1",
    "ROC_10",
    "TSIs_13_25_13",
    "TSI_13_25_13",
    "MACD_12_26_9",
    "MACDh_12_26_9",
    "MACDs_12_26_9",
    "DMP_14",
    "DMN_14"
]
target = "target"
As árvores de decisão são sensíveis à escala, portanto normalizamos os valores de entrada e armazenaremos as primeiras leituras de cada objeto neste array chamado first_values.
first_values = {}
#Iterating over the columns in the dataset
for col in data.columns:
    #Which of those columns are part of the model inputs?
    if col in predictors:
        #What was the first value in that column?
        first_values[col] = data[col][train_start]
        data[col] = data[col]/first_values[col]

Execução do split de teste Train

train_x = data.loc[train_start:train_end,predictors]
train_y = data.loc[train_start:train_end,target]

test_x = data.loc[test_start:test_end,predictors]
test_y = data.loc[test_start:test_end,target]
Configuração do nosso modelo de caixa preta

cat_full = CatBoostRegressor()
cat_full.fit(train_x,train_y)
Obtenção de previsões do nosso modelo de caixa preta
cat_full_predictions = pd.DataFrame(index=test_x.index)
cat_full_predictions["predictions"] = cat_full.predict(test_x)
cat_full_predictions.plot(label=True)
test_y.plot()

Previsão "caixa preta"

Fig. 6. Previsão da nossa "caixa preta"


Inicialmente, percebe-se claramente que o modelo de previsão apresenta períodos achatados que não são comuns. Considerando nossa análise detalhada da aplicação de algoritmos que utilizam gradiente reforçado, tais padrões são de fato esperados. Nós queremos identificar quais características têm um impacto positivo no desempenho do nosso modelo e quais poderiam ser fontes de interferência. Isso requer uma investigação minuciosa das várias possibilidades de design das características.

Para trazer à tona esses detalhes, sugerimos a utilização do bloco de explicações tipo "caixa preta". No entanto, antes de adotarmos essas explicações de maneira indiscriminada, precisamos compreender os princípios básicos do algoritmo de "caixa preta". Isso implica uma análise crítica das premissas em que ele se baseia, o que nos permite avaliar se tais premissas são sólidas ou se podem estar sendo ignoradas.

Ao adotar as técnicas de explicação "caixa preta", levando em consideração esse entendimento essencial, conseguimos interpretar de maneira coerente cada explicação. Ao examinar cuidadosamente os métodos de explicação e verificar sua aplicabilidade, estamos aptos a atribuir níveis apropriados de confiança às nossas descobertas. Tal abordagem metodológica enriquece nossa capacidade de derivar insights valiosos e tomar decisões bem fundamentadas baseadas nos resultados do processo de explicação "caixa preta".


Algoritmos de explicação "caixa preta"

Importância da remoção de coluna (Drop Column Importance):

O procedimento de eliminar colunas para testar a importância delas é utilizado para verificar a precisão do modelo ao inicialmente considerar todos os preditores e, posteriormente, remover uma coluna de cada vez para observar o efeito sobre a precisão. Esse método nos dá uma visão clara sobre a contribuição específica de cada coluna para o desempenho global do modelo.

Este é um método prático e lógico. A ideia por trás deste método reflete cenários reais onde desalinhamentos de dados são comuns, seja por problemas na conexão à internet, falhas de energia, condições climáticas adversas ou outros imprevistos. A metodologia simula um modelo robusto que representa fielmente os desafios de um ambiente operacional real, aumentando a aplicabilidade e eficiência do método ao abordar cenários que podem ocorrer no cotidiano prático.

Vantagens:

  • Melhor desempenho do modelo: a remoção de colunas desnecessárias ou redundantes pode melhorar o desempenho dos modelos de aprendizado de máquina, reduzindo o ruído e melhorando a relação sinal/ruído.
  • Modelo simplificado: a remoção de colunas desnecessárias pode levar à criação de modelos mais simples e interpretáveis, facilitando seu entendimento e explicação para as partes interessadas.

Desvantagens:

  • Perda de informação: a remoção de uma coluna pode levar à perda de informações valiosas, o que potencialmente pode resultar em um modelo excessivamente simplificado que falha em captar padrões importantes nos dados.
  • Impacto nos processos subsequentes: se uma coluna é usada em análises subsequentes ou é necessária para certos processos de negócios, sua remoção pode perturbar esses fluxos de trabalho.

Oportunidades:

  • Desenvolvimento de características: a remoção de uma coluna pode proporcionar oportunidades para o desenvolvimento de características, permitindo a criação de novas características com base nos dados existentes ou modificando as características remanescentes para melhorar o desempenho do modelo.
  • Otimização de recursos: a remoção de colunas desnecessárias pode resultar em economia de recursos em termos de memória, armazenamento e tempo de processamento, especialmente em grandes conjuntos de dados.

Problemas potenciais:

  • Viés do modelo: se a coluna removida contém informações cruciais para previsões objetivas, sua remoção pode introduzir um viés no modelo, levando a resultados imprecisos.
  • Problema de integridade dos dados: remover colunas sem um entendimento completo dos dados pode levar a problemas de integridade, afetando a qualidade geral do conjunto de dados e a análise subsequente.


Importância da permutação (Permutation Importance):

A importância da permutação surge como uma técnica alternativa para medir a relevância de variáveis em modelos preditivos. Essa abordagem envolve embaralhar aleatoriamente os dados de uma coluna específica e observar como essa mudança afeta os indicadores de erro do modelo. O princípio é que, se uma variável é significativa para o modelo, alterar seus dados originais deve resultar em um aumento nos erros e uma queda na precisão. Por outro lado, se a variável tiver pouca influência, as alterações nos indicadores de erro serão mínimas e pode até haver uma melhora no desempenho em certos casos.

Este procedimento não só esclarece a importância dos atributos, mas também possibilita uma análise dinâmica de como cada elemento contribui para a eficácia preditiva do modelo. A inclusão de uma camada de aleatoriedade através da permutação permite identificar a sensibilidade do modelo a diferentes características, oferecendo um entendimento mais aprofundado do seu valor no contexto da previsão.

Vantagens:

  • Independência do modelo: a importância da permutação não depende do modelo, ou seja, pode ser aplicada a qualquer modelo de treinamento supervisionado sem suposições sobre o algoritmo subjacente. Isso o torna um método universal e amplamente aplicável.
  • Interpretação intuitiva: o conceito de importância das permutações é relativamente fácil de entender. Ele mede a mudança no desempenho do modelo quando os valores de uma característica específica são permutados aleatoriamente, fornecendo uma interpretação clara da importância da característica.

Desvantagens:

  • Intensidade de cálculo: o cálculo da importância das permutações envolve a reavaliação do desempenho do modelo para cada permutação de características, tornando-o computacionalmente intensivo e potencialmente oneroso, especialmente para grandes conjuntos de dados.
  • Sensibilidade ao tamanho da amostra: a importância da permutação pode depender do tamanho do conjunto de dados. Em conjuntos de dados pequenos, o efeito da permutação de uma característica pode ser exagerado, levando a estimativas de importância menos confiáveis.

Oportunidades:

  • Guia para seleção de características: os resultados da importância das permutações podem ajudar na seleção de características, identificando quais características mais afetam o desempenho do modelo. Essa informação pode ser útil para simplificar modelos e reduzir a dimensionalidade.
  • Identificação de conexões não lineares: ao contrário dos modelos lineares, a importância das permutações pode refletir conexões não lineares entre as características e a variável alvo, proporcionando um entendimento das complexidades nos dados.

Problemas potenciais:

  • Influência de características correlacionadas: a importância da permutação pode ter dificuldade em lidar com situações em que as características estão fortemente correlacionadas. Se dois características estão correlacionadas, a permutação de um deles pode ter pouco efeito no desempenho do modelo, se a outra característica ainda fornecer informações semelhantes.
  • Possibilidade de sobreajuste: em alguns casos, existe o risco de sobreajuste (overfitting), especialmente se o modelo for muito complexo ou se o conjunto de dados for pequeno. As estimativas de importância podem generalizar mal para novos dados.

Gráficos de dependência parcial (Partial Dependence Plots, PDP) e expectativa condicional individual (Individual Conditional Expectation, ICE):

Os gráficos fornecem um entendimento mais profundo do comportamento dos modelos analíticos. Eles revelam como as previsões se alteram conforme um preditor específico é ajustado, mantendo fixos os demais preditores. Por outro lado, os gráficos ICE detalham a influência de cada atributo, exibindo trajetórias individuais para cada dado analisado, o que permite uma investigação minuciosa do efeito de cada variável.

Acompanhando os gráficos PDP e ICE, encontramos representações visuais que transcendem as análises superficiais. Os PDPs esboçam a relação entre um preditor e as previsões, enquanto os gráficos ICE se debruçam sobre cada caso individualmente com uma série de curvas representativas. Essa combinação de recursos visualiza padrões complexos e variações nas respostas do modelo aos diferentes valores dos preditores, ampliando a compreensão sobre o papel significativo das variáveis no contexto da modelagem preditiva.

Vantagens:

  • Interpretabilidade: Os PDP proporcionam uma representação intuitiva e visual da relação entre a característica e o resultado previsto, facilitando para os não especialistas a interpretação e compreensão do impacto de uma característica específica nas previsões do modelo.
  • Identificação de padrões: Os PDP podem ajudar a identificar padrões e tendências na relação entre a característica e o resultado previsto, permitindo um entendimento mais profundo de como as mudanças na característica afetam as previsões do modelo.

Desvantagens:

  • Suposição de independência: Os PDP assumem que a característica de interesse é independente de outras características. Em modelos complexos com características correlacionadas, a interpretação dos PDP pode ser desafiadora, e os gráficos podem não refletir com precisão as verdadeiras relações.
  • Limitação do efeito marginal: Os PDP mostram o efeito marginal de uma característica, mantendo outras características fixas. Eles podem não refletir interações complexas entre várias características, limitando sua capacidade de revelar toda a complexidade do modelo.

Oportunidades:

  • Verificação do modelo: Os PDP podem ser usados como uma ferramenta para verificação do modelo. Comparando as informações obtidas durante o PDP com o conhecimento ou expectativas da área de especialidade, os profissionais podem avaliar se o modelo corresponde ao comportamento esperado das características.
  • Classificação da importância das características: Os PDP podem ajudar na classificação da importância das características, destacando visualmente as características que têm o maior impacto nas previsões do modelo. Esta informação pode auxiliar na seleção de características e na simplificação do modelo.

Problemas potenciais:

  • Risco de interpretação incorreta: sem um entendimento adequado dos conceitos estatísticos, existe o risco de interpretação errada. Os usuários podem erroneamente atribuir relações causais às conexões observadas, especialmente se não estiverem cientes das variáveis distorcidas potenciais ou das complexidades subjacentes ao modelo.
  • Complexidade de dados multidimensionais: Os PDP tornam-se difíceis de interpretar em espaços multidimensionais devido à explosão combinatória de possíveis combinações de características. A visualização das interações entre características torna-se cada vez mais complexa.


Valores SHAP (Shapley Additive Explanations, explicações aditivas de Shapley):


Lloyd Shapley

Fig. 7. Em memória de Lloyd Shapley, que faleceu em 12 de março de 2016, na cidade de Tucson, Arizona. Suas ideias viverão para sempre

Os valores SHAP, que levam o nome de seu criador, Lloyd Shapley, são fundamentais para desvendar os resultados de um modelo, ao apontar a contribuição específica de cada característica na previsão.

A determinação dos valores SHAP se dá por meio da análise das saídas do modelo sob todas as combinações possíveis de características. De forma mais direta, isso envolve permutar os valores de uma característica enquanto se mantêm as demais fixas, para ver como isso afeta as previsões do modelo.

Similar a um jogador em um jogo, se um atributo, ao ter seus valores alterados, não modifica as saídas do modelo (tal como um jogador que não impacta o resultado do jogo ao ficar de fora), então seu valor SHAP será menor. Em contraste, se a modificação de um atributo altera significativamente as saídas, seu valor SHAP será elevado, sinalizando uma contribuição importante.

Os valores SHAP, portanto, oferecem uma medida quantitativa da influência de cada característica. Ao comparar os valores SHAP de diferentes objetos, é possível identificar quais influenciam mais as previsões do modelo.

Dessa forma, se uma característica é frequentemente desconsiderada (com seus valores sendo permutados ou modificados) e isso não altera substancialmente o desempenho do modelo, isso sugere que sua contribuição para as previsões do modelo é, de fato, mínima.

Vantagens:

  • Independência do modelo: os valores SHAP não dependem do modelo, ou seja, podem ser aplicados a qualquer modelo de aprendizado de máquina, incluindo modelos complexos como métodos de ensemble, redes neurais e máquinas de vetores de suporte (support vector machines).
  • Interpretabilidade global e local: os valores SHAP fornecem tanto a interpretabilidade global quanto a local. Eles podem explicar o impacto de características individuais em uma previsão específica (interpretabilidade local) e a contribuição geral de cada característica em todo o conjunto de dados (interpretabilidade global).

Desvantagens:

  • Intensidade computacional: o cálculo dos valores SHAP pode exigir grandes recursos computacionais, especialmente para grandes conjuntos de dados ou modelos complexos. Isso pode criar problemas em aplicações de tempo real ou em situações onde os recursos computacionais são limitados.
  • Problemas de interpretação de dados multidimensionais: a interpretação dos valores SHAP para modelos com muitas características pode ser um desafio. Visualizar e entender a contribuição de múltiplas características torna-se uma tarefa mais complexa em espaços multidimensionais.

Oportunidades:

  • Classificação da importância dos objetos: os valores SHAP podem ser usados para classificar objetos com base em seu impacto nas previsões do modelo. Essa informação é útil para a seleção de características e a determinação das variáveis mais influentes no modelo.
  • Visualizações explicativas: os valores SHAP permitem criar visualizações detalhadas, como gráficos sumários de SHAP ou gráficos de força individual, ajudando a transmitir as previsões do modelo e informações sobre características para as partes interessadas.

Problemas potenciais:

  • Suposição de consistência: os valores SHAP assumem consistência, o que significa que o impacto de uma característica na previsão é o mesmo em diferentes instâncias. Em alguns casos, essa suposição pode não se manter, levando a potenciais interpretações incorretas.
  • Complexidade da interpretação: embora os valores SHAP forneçam informações valiosas, sua interpretação correta requer uma compreensão clara dos conceitos subjacentes. Os usuários podem interpretar incorretamente o valor de determinadas características ou não captar os nuances da contribuição de certas características.

Informação mútua (Mutual Information, MI):

A informação mútua é uma medida da quantidade de informação que a presença ou ausência de uma variável fornece sobre outra variável. Ela quantifica o grau de dependência ou conexão entre duas variáveis.

Vantagens:

  • Independência do modelo: a informação mútua não depende de um modelo específico de aprendizado de máquina. Ela pode ser aplicada a qualquer tipo de relação entre variáveis, incluindo dependências lineares e não lineares.
  • Captura conexões não lineares: ao contrário da correlação, que é mais adequada para relações lineares, a informação mútua pode capturar dependências não lineares entre variáveis, tornando-a versátil para diferentes tipos de dados.

Desvantagens:

  • Sensibilidade ao tamanho da amostra: a informação mútua pode ser sensível ao tamanho do conjunto de dados. Em conjuntos de dados pequenos, a estimativa de MI pode ser menos estável, e pequenas mudanças nos dados podem ter um impacto mais significativo nos resultados.
  • Complexidade na interpretação dos valores: embora a MI forneça uma medida da força da associação, seus valores absolutos podem ser difíceis de interpretar diretamente. A interpretação de "alta" ou "baixa" informação mútua depende do contexto e da escala das variáveis.

Oportunidades:

  • Seleção de características: a informação mútua pode ser usada para selecionar características, classificando-as com base em sua relevância para a variável alvo. As características com valores mais altos de MI são consideradas mais informativas para a previsão do objetivo.
  • Importância das variáveis em modelos de ensemble: no aprendizado de ensemble, a informação mútua pode ser usada para avaliar a importância das variáveis, ajudando na construção de modelos de ensemble mais precisos e interpretáveis.

Problemas potenciais:

  • Pressuposto de independência: a informação mútua pressupõe que as variáveis são independentes quando seu MI é zero. Na prática, pode não refletir dependências complexas ou relações afetadas por fatores ocultos ou variáveis interferentes.
  • Cálculos intensivos para grandes dimensões: a avaliação da informação mútua para dados multidimensionais pode exigir grandes recursos computacionais. Isso pode criar problemas em termos de tempo e recursos necessários.


Felizmente, bibliotecas especializadas em Python facilitam esse processo, eliminando a necessidade de criar a maior parte do código do zero.

Neste artigo, não nos aprofundaremos nos detalhes de treinamento e ajuste de modelos. Em vez disso, nos concentraremos na etapa posterior ao treinamento e exploraremos como avaliar e interpretar o desempenho do modelo. No exemplo de código fornecido, o modelo básico é construído apenas para fins ilustrativos, demonstrando os passos tomados após o projeto e treinamento do modelo. 

Vamos começar

Importância de remover uma coluna

Usaremos o algoritmo de eliminação recursiva de recursos (Recursive Feature Elimination algorithm) da biblioteca sklearn, que servirá para implementar a importância da remoção de coluna.

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR
O algoritmo de eliminação recursiva de recursos espera que entreguemos um modelo de aprendizado supervisionado, que ele possa ajustar e avaliar.
A modelo deve fornecer informações sobre a importância da característica, seja através de coeficientes ou através de uma característica especial.
Não é necessário que o modelo seja o mesmo que usamos em nosso projeto.
O modelo não precisa ser da biblioteca sklearn, mas deve ter pelo menos um wrapper sklearn.

Usaremos um modelo linear e avaliaremos sua precisão removendo características aleatoriamente.

lm = LinearRegression()
rfe = RFE(lm,step=1)

O argumento do passo indica quantos objetos devem ser removidos em cada iteração.

Então, configuramos a exclusão recursiva de características

rfe = rfe.fit(train_x,train_y)
Vamos verificar quais características nosso algoritmo RFE considerou informativas
rfe.support_
array([ True, True, True, True, False, False, False, False, False, True, False, True, True, True, False, True, True, True, False, False, False, False, False, False, True, False, True])
Também podemos obter a classificação de cada característica

rfe.ranking_
array([ 1, 1, 1, 1, 2, 5, 14, 11, 13, 1, 7, 1, 1, 1, 8, 1, 1, 1, 12, 15, 3, 4, 9, 10, 1, 6, 1])

A implementação do sklearn nos fornece uma máscara que podemos aplicar às colunas em nosso quadro de dados train_x para ver os nomes das colunas que o RFE considera importantes.

train_x.columns[rfe.support_]
Index(['open', 'high', 'low', 'close', 'BBM_20_2.0', 'BBB_20_2.0', 'BBU_20_2.0', 'BBL_20_2.0', 'ema_20', 'ema_40', 'ema_100', 'MACDs_12_26_9', 'DMN_14'], dtype='object')
Portanto, de todos os indicadores que aplicamos, os seguintes contêm informações valiosas:
    1) Open         2) High         3) Low         4) Close         6) KSTs_9         7) KST_10_15_20_30_10_10_10_15         7) Todas as 3 médias móveis exponenciais         8) 4 componentes da Banda de Bollinger: 'BBM_20_2.0' 'BBB_20_2.0' 'BBU_20_2.0' 'BBL_20_2.0'         9)MACD: 'MACDs_12_26_9'         10) Movimento direcional negativo     Outros indicadores talvez tenham introduzido ruído, mas lembre-se disso!
Não podemos concluir definitivamente que isso é exato, no entanto, para nós é uma afirmação razoável.


Em seguida, passamos para a avaliação da importância da permutação

Para implementar o algoritmo, usaremos a biblioteca Python chamada Explain Like I'm 5 (ELI5) - "Explique como se eu tivesse 5 anos"

#pip install eli5 if you don't allready have it installed
import eli5
from eli5.sklearn import PermutationImportance
from sklearn.ensemble import GradientBoostingRegressor
gbr = GradientBoostingRegressor().fit(train_x,train_y)

permutation = PermutationImportance(gbr).fit(test_x,test_y)

Agora vamos avaliar os pesos que o algoritmo atribuiu a cada uma de nossas características.

eli5.show_weights(permutation,feature_names = test_x.columns.to_list())


Pesos de importância de permutação

Fig. 8. Pesos de importância de permutação


A interpretação dos resultados da importância da permutação é bastante simples. As características são classificadas em ordem decrescente de importância: as mais importantes estão no topo e as menos significativos estão na parte inferior. O valor do peso (por exemplo, "0.0986 +- 0.0256") indica a alteração nos indicadores de erro do modelo. Em resumo, a importância da permutação implica em embaralhar aleatoriamente os valores das características. Se uma característica afeta significativamente o modelo, essa randomização deve levar a um aumento nos indicadores de erro do modelo. Devido à natureza estocástica do algoritmo, esse aumento é apresentado como um intervalo, e não como um valor específico.

Por outro lado, para as características que não são importantes, não haverá mudanças ou, em alguns casos, uma redução nos indicadores de erro do modelo quando os valores são embaralhados aleatoriamente. Este caráter dual dos resultados — seja um aumento ou uma diminuição nos indicadores de erro — fornece uma indicação clara da importância relativa de cada característica, facilitando uma interpretação concisa e compreensível dos resultados da importância das permutações. Assim, podemos concluir que a importância da remoção de uma coluna e a importância da permutação têm opiniões semelhantes sobre a importância das características em nosso modelo.

Gráficos de dependência parcial (PDP) e expectativa condicional individual (ICE):

#Import partial dependence display from sklearn
from sklearn.inspection import PartialDependenceDisplay

for feature_name in predictors:
    PartialDependenceDisplay.from_estimator(cat_full,test_x,[feature_name])
    plt.grid()
    plt.show()

PDP Open Price

PDP MACDs

Fig. 9. Gráfico de dependência parcial do preço de abertura e da linha de sinal MACD



O gráfico de dependência parcial é uma ferramenta valiosa para entender como a mudança em uma variável específica afeta as previsões do nosso modelo. Analisando o gráfico de dependência parcial da linha de sinal MACD, podemos razoavelmente concluir que, em geral, um aumento na linha de sinal MACD está associado a um aumento no preço de fechamento previsto pelo nosso modelo.

No entanto, a interpretação dos gráficos de dependência parcial pode ser mais complexa, como mostrado no gráfico da altura do MACD abaixo.

Gráfico de dependência parcial da altura do MACD

Fig. 10. Gráfico de dependência parcial da altura do MACD

As dificuldades na interpretação desses gráficos podem surgir devido a relações não lineares ou interações com outras variáveis, que exigem uma análise mais detalhada. No caso do gráfico da altura do MACD, podem ser necessárias considerações e pesquisas adicionais para descobrir a natureza exata da relação entre a altura do MACD e o preço de fechamento previsto pelo modelo.

Este reconhecimento destaca a necessidade de um estudo abrangente dos gráficos de dependência parcial, considerando as características únicas de cada variável e, em caso de problemas de interpretação, a busca de informações adicionais por meio de análises adicionais ou consultas com especialistas.

Os gráficos de expectativa condicional individual (ICE) são criados para fornecer uma visão detalhada de como os casos individuais reagem às mudanças em uma variável preditora específica. Abaixo está uma explicação passo a passo de como os gráficos ICE são criados e usados:

1. Variantes individuais de previsões:

  • Começamos com um conjunto de dados que contém a variável preditora de interesse e outras características necessárias.
  • Selecionamos uma instância específica do conjunto de dados.

2. Modificamos a variável preditora:

  • Para a instância selecionada, alteramos sistematicamente os valores da variável preditora, mantendo as outras características constantes.
  • Criamos um conjunto de previsões correspondente a cada valor da variável preditora.

3. Criação de curvas individuais:

  • Repetimos os passos 1 e 2 para várias instâncias no conjunto de dados, criando um conjunto de curvas individuais (uma para cada instância), que ilustram a relação entre a variável preditora e as previsões do modelo.

4. Plotagem:

  • Desenhe cada curva individual em um único gráfico. O eixo X representa os valores da variável preditora, enquanto o eixo Y representa as previsões do modelo.

5. Interpretação:

  • Analise o gráfico ICE para observar como as previsões do modelo mudam para cada instância com a alteração da variável preditora.
  • Identifique padrões, tendências ou variações nas curvas para obter uma ideia do impacto da variável preditora nas previsões individuais.

6. Análise comparativa:

  • Compare vários gráficos ICE, especialmente ao trabalhar com diferentes instâncias, para entender a heterogeneidade do impacto da variável no conjunto de dados.

Uso:

  • Compreensão detalhada: Os gráficos ICE oferecem uma visão detalhada e específica de como a variável preditora afeta as previsões, permitindo um entendimento mais aprofundado.
  • Compreensão do modelo: Os gráficos ajudam os usuários a explorar relações não lineares, interações e potenciais anomalias que podem não ser óbvias em representações agregadas.
  • Importância das características: Os gráficos ICE podem ajudar a avaliar a importância de uma característica específica, ilustrando seu impacto nas previsões individuais.
  • Suporte à decisão: As informações dos gráficos ICE podem auxiliar na tomada de decisões, especialmente quando é importante entender como as previsões mudam para casos específicos em resposta a alterações em uma variável específica.

Na verdade, o gráfico PDP é simplesmente a média dos gráficos ICE criados. A linha PDP é mostrada em laranja abaixo.

for feature in predictors:
    PartialDependenceDisplay.from_estimator(cat_full,test_x,[feature],kind='both')

ICE High

ICE EMA

Fig. 11. Gráfico ICE com preço alto e EMA de período 40

Com base nos gráficos observados, é evidente que um aumento no preço alto ou na média móvel exponencial não leva a um impacto imediato nas previsões do nosso modelo. Em vez disso, parece que essas variáveis precisam aumentar significativamente antes que possamos esperar quaisquer mudanças notáveis nas previsões do modelo. Essa observação sugere que o modelo não é muito sensível a mudanças graduais nessas características específicas.

Principais conclusões com base nos gráficos:

  1. Sensibilidade limiar: O modelo parece mostrar uma sensibilidade limiar, o que significa que é necessário um nível significativo ou limiar de mudança no preço alto ou na média móvel exponencial antes que ele ajuste substancialmente suas previsões.

  2. Resposta gradual: Mudanças graduais ou moderadas nas características mencionadas parecem não levar a ajustes imediatos nas previsões do modelo. Essa característica sugere uma reação gradual ou contida a tais mudanças.

  3. Baixa sensibilidade: A conclusão de que o modelo não é muito sensível a mudanças nessas características implica que flutuações menores no preço alto ou na média móvel exponencial dificilmente terão um impacto significativo nos resultados do modelo.

Entender a sensibilidade do modelo a diferentes características é fundamental para a interpretação eficaz do modelo e para a tomada de decisões. Essas ideias podem auxiliar em análises futuras, melhorias no modelo ou informar as partes interessadas sobre a natureza das relações entre preditores específicos e as previsões do modelo.

Podemos também verificar gráficos de dependência parcial bidimensionais para observar o efeito combinado de duas características.

#Setting up the plot
fig , ax = plt.subplots(figsize=(10,5))
column_names = [('ROC_10','ATRr_14')]

#Plotting 2D PDP
disp_4 = PartialDependenceDisplay.from_estimator(cat_full, test_x[0:1000],column_names, ax=ax)
plt.show()

Gráfico 2D de dependência parcial

Fig. 12. Gráfico 2D de dependência parcial do indicador de taxa de variação (ROC) e da média de amplitude de variação (ATR)

A análise do gráfico de dependência parcial 2D mostra que, em geral, o aumento dos indicadores ROC (taxa de variação) e ATR (Média de Amplitude de Variação) corresponde a um aumento na previsão esperada do nosso modelo. Esta correlação positiva está alinhada com o comportamento esperado do modelo em resposta às mudanças desses indicadores.

No entanto, o gráfico também fornece insights sobre a interação desses dois indicadores. É notável que a ausência de limites claramente definidos no gráfico sugere que as relações nem sempre são estáveis. Em vez disso, existem áreas de força e fraqueza mistas, indicando que o impacto dos indicadores ROC e ATR nas previsões do modelo pode variar em diferentes áreas do gráfico.

A presença de enclaves aleatórios de expectativas fracas dentro dos limites de expectativas fortes enfatiza ainda mais o caráter dinâmico da interação. É importante notar que o comportamento observado pode ser afetado pelo método de amostragem, especialmente se um subconjunto de dados foi usado por razões de eficiência computacional.

Algumas considerações e possíveis implicações incluem:

  1. Limitações de amostragem: As discrepâncias observadas podem ser parcialmente explicadas pelo uso de uma amostra menor para aumentar a eficiência computacional. Uma abordagem de amostragem mais ampla poderia fornecer uma representação mais completa da interação.

  2. Não linearidade ou interações: A falta de limites claramente definidos e a presença de áreas mistas sugerem potencial não linearidade ou interação entre os indicadores ROC e ATR. Pesquisas adicionais, possivelmente usando amostras maiores, podem revelar padrões mais sutis.

  3. Confiabilidade do modelo: Entender a variabilidade da interação ajuda a avaliar a confiabilidade do modelo e sua sensibilidade a diferentes combinações de características de entrada.

Em conclusão, a interpretação do gráfico bidimensional de dependência parcial fornece informações valiosas sobre a resposta do modelo às mudanças nos indicadores ROC e ATR. Reconhecer o potencial impacto do tamanho da amostra nas padrões observados, investigação adicional e, se possível, uma estratégia de amostragem mais extensiva podem melhorar a precisão desses resultados.


Valores aditivos de explicações de Shapley (SHAP)

#pip install shap if you don't have it installed
#Import SHAP
import shap

#Initialise the shap package
shap.initjs()

Alguns fatores a considerar:

  • Os valores de SHAP assumem que os objetos são independentes/não correlacionados

  • Valores de SHAP requerem grandes esforços computacionais para cálculo preciso. O problema se intensifica com o aumento da dimensionalidade do conjunto de dados.

  • Os valores de SHAP são independentes do modelo, ou seja, eles podem não nos ajudar a capturar um comportamento específico do modelo. Essa é a força e a fraqueza dos valores de SHAP.

  • Valores de SHAP são sensíveis à ordem de entrada!

Em nosso conjunto de dados, existem condições estritas de correlação, e isso é um problema sério no cálculo dos valores de SHAP, que viola a suposição de independência dos objetos. Felizmente, existem várias maneiras de resolver esse problema, como:

  • Desconsiderar características correlacionadas — essa é a solução mais simples, mas geralmente deve ser considerada como último recurso.

  • Uso de métodos de redução de características, como análise de componentes principais ou outros métodos de seleção de características com os quais você pode estar familiarizado.

  • Discretização dos objetos em bins pode ajudar a mitigar os efeitos adversos da correlação nos cálculos dos valores SHAP.

  • Uso de algoritmos SHAP projetados para lidar com dados correlacionados.

  • Uso de características não correlacionadas, por exemplo, no nosso caso, Volume e High Low Spread têm uma correlação muito fraca.

Neste caso, optaremos pela quarta solução, usando algoritmos SHAP especiais projetados para lidar com dados correlacionados. Algoritmos SHAP baseados em estruturas de árvore lidam bem com a correlação.

#Initialise shap value calculator
tree_explainer = shap.TreeExplainer(cat_full)

#Store SHAP values
shap_values = tree_explainer.shap_values(test_x)

#Plot SHAP values
shap.summary_plot(shap_values,test_x)

Valores SHAP

Fig. 13. Gráficos dos valores SHAP

Como interpretamos o gráfico de resumo SHAP:

  1. Importância das características: as características listadas na parte superior do eixo Y têm uma influência mais forte no aumento do preço de fechamento, enquanto as características na parte inferior têm um impacto maior na redução do preço de fechamento. 

  2. Direção do impacto: cada característica tem pontos coloridos ao longo do eixo X. Pontos azuis simbolizam valores mais baixos da característica, enquanto pontos vermelhos representam valores mais altos. O posicionamento horizontal desses pontos nos diz sobre o impacto do valor da característica no preço de fechamento. Assim, nossos cálculos dos valores SHAP mostram que nosso High_Low_Spread não é muito indicativo do preço de fechamento.

  3. Magnitude da localização: o posicionamento horizontal de cada ponto ao longo do eixo X representa a magnitude do impacto, então valores extremamente altos e baixos têm um impacto relativamente maior no preço de fechamento em comparação com características como Volume, Open e High_Low_Spread neste exemplo demonstrativo.


Informações mútuas

from sklearn.feature_selection import mutual_info_regression
mi_scores = mutual_info_regression(train_x, train_y)
mi_scores = pd.Series(mi_scores, name="MI Scores", index=train_x.columns)
mi_scores = mi_scores.sort_values(ascending=False)
mi_scores

ema_100                                       1.965130

ema_40                                         1.960548

ema_20                                         1.933651

BBM_20_2.0                                   1.902066

BBL_20_2.0                                   1.895867

BBU_20_2.0                                  1.881435

high                                             1.795941

low                                              1.786879

close                                            1.783567

open                                            1.777118

TSIs_13_25_13                              0.232247

ATRr_14                                        0.215980

MACDs_12_26_9                            0.214559

KST_10_15_20_30_10_10_10_15    0.208868

KSTs_9                                         0.205177

MACD_12_26_9                            0.174518

TSI_13_25_13                              0.168086

AO_5_34                                     0.128653

BBB_20_2.0                                 0.104481

RSI_20                                         0.095368

MACDh_12_26_9                          0.076360

DMP_14                                      0.060191

DMN_14                                     0.048856

ROC_10                                     0.042115

BBP_20_2.0                               0.028558

CCI_14_0.015                            0.022320

SLOPE_1                                   0.004144

def plot_mi_scores(scores):
    scores = scores.sort_values(ascending=True)
    width = np.arange(len(scores))
    ticks = list(scores.index)
    plt.barh(width, scores)
    plt.yticks(width, ticks)
    plt.title("Mutual Information Scores")
plt.figure(dpi=100, figsize=(8, 5))
plt.grid()
plot_mi_scores(mi_scores)


Informação mútua

Fig. 14. Valores de informação mútua

Observamos um consenso constante em todos os nossos métodos de explicação de "caixa preta", sugerindo que as características consistentemente destacadas nesses métodos contêm informações substanciais que podemos utilizar eficientemente. A média móvel exponencial, as bandas de Bollinger e os preços de abertura, máximo, mínimo e fechamento estão consistentemente posicionados perto do topo, portanto, ao medir a tendência central, podemos logicamente concluir que essas características podem ser muito informativas e, assim, podemos descartar todo o resto. 

Vamos verificar nossas conclusões.

Usaremos dois modelos: uma regressão linear simples e nosso poderoso modelo de caixa preta. Selecionaremos características usando a informação que obtivemos através de nossos métodos de explicação de "caixa preta". 

Primeiro, importaremos as dependências necessárias.

from sklearn.linear_model import LinearRegression
from catboost import CatBoostRegressor
from sklearn.metrics import mean_squared_error

    Primeiro, estabeleceremos o modelo mais simples.

    #First we fit the simpler model
    lm = LinearRegression()
    
    lm.fit(train_x.loc[:,["open","high","low","close"]],train_y)

    Depois, avaliaremos o quão bem o modelo mais simples se ajusta aos dados de treinamento.

    lm_predictions = pd.DataFrame(lm.predict(train_x.loc[:,["open","high","low","close"]]), index = train_y.index)
    lm_fit = lm.predict(train_x.loc[:,["open","high","low","close"]])
    residuals = pd.DataFrame(train_y - lm_fit)

    Agora, usaremos nosso modelo de caixa preta mais poderoso para explorar os resíduos do nosso modelo mais simples. Forneceremos ao nosso modelo de caixa preta as características que acreditamos serem as mais informativas.

    #Now we bring in our more powerfull black-box model
    cat = CatBoostRegressor()
    cat.fit(
        train_x.loc[:,["BBM_20_2.0","BBL_20_2.0","BBU_20_2.0","ema_40","ema_20","ema_100"]],
        residuals)

    Conduziremos uma comparação dos níveis de erro nos dados de teste, avaliando o desempenho do nosso modelo de caixa preta original, que usava todas as características disponíveis, em comparação com a precisão do modelo refinado. O modelo aprimorado inclui uma regressão linear simples e utiliza estrategicamente um subconjunto de características cuidadosamente selecionadas.

    lm_test_predictions = pd.DataFrame(lm.predict(test_x.loc[:,["open","high","low","close"]]),index=test_y.index)
    cat_full_test_predictions = cat_full.predict(test_x[predictors])
    
    cat_residuals_predictions = pd.DataFrame(cat.predict(test_x.loc[:,["BBM_20_2.0","BBL_20_2.0","BBU_20_2.0","ema_40","ema_20","ema_100"]]),index=test_y.index)

    Avaliaremos o nível de erro do nosso caixa preta original.

    full_error = mean_squared_error(test_y,cat_full_test_predictions)

    E o compararemos com o nível de erro do nosso novo híbrido de caixa preta.

    hybrid_predictions = lm_test_predictions.iloc[:,0] + cat_residuals_predictions.iloc[:,0]
    hybrid_error = mean_squared_error(test_y, hybrid_predictions)
    delta_error = full_error - hybrid_error
    (delta_error / full_error) * 100

    94.428

    Nosso novo híbrido de "caixa preta" apresentou uma melhora de 94% nos indicadores de erro.

    hybrid_predictions.plot()

    Previsão do híbrido de "caixa preta"

    Fig. 15. Nova previsão de "caixa preta"

    A melhoria na realidade de nossas novas previsões de "caixa preta", livres dos períodos flat anteriormente observados, é de primordial importância. Agora alcançamos maior precisão com um conjunto otimizado de características. Isso destaca o princípio de que, com a execução eficaz, podemos alcançar mais com menos esforço.


    Reunindo tudo

    Estamos prontos para integrar todos os componentes em uma estratégia comercial abrangente.

    MARKET_SYMBOL = "Volatility 75 Index"
    DEVIATION = 100
    VOLUME = 0
    symbol_info = MT5.symbol_info(MARKET_SYMBOL)
    VOLUME = symbol_info.volume_min * 1
    def preprocess(df):
        #20 period exponential moving average
        df["ema_20"] = df.ta.ema(length=20)
        #40 period exponential moving average
        df["ema_40"] = df.ta.ema(length=40)
        #100 period exponential moving average
        df["ema_100"] = df.ta.ema(length=100)
        #20 period bollinger bands with 3 standard deviations
        df.ta.bbands(length=20,sd=2,append=True)
        df = df.loc[100:,:]
    def fetch_prices():
        current_prices = pd.DataFrame()
        current_prices = pd.DataFrame(MT5.copy_rates_from_pos(MARKET_SYMBOL,MT5.TIMEFRAME_M1,0,200))
        preprocess(current_prices)
        return(current_prices)
    def normalise_prices(raw_data):
        for col in raw_data.columns:
            if col in first_values:
                raw_data[col] = raw_data[col] / first_values[col]
    model_forecast = 0
    def hybrid_forecast(model_1,model_2):
        market_data = fetch_prices()
        normalise_prices(market_data)
        forecast_1 = model_1.predict(market_data.loc[199:200,["open","high","low","close"]])
        forecast_2 = model_2.predict(market_data.loc[199:200,["BBM_20_2.0","BBL_20_2.0","BBU_20_2.0","ema_40","ema_20","ema_100"]])
        out = forecast_1 + forecast_2
        return(out)
    INITIAL_BALANCE = MT5.account_info().balance
    CURRENT_BALANCE = 0
    if __name__ == "__main__":
        while True:
            
            #Account standing
            info = MT5.account_info()
            CURRENT_BALANCE = info.balance
            profit = CURRENT_BALANCE - INITIAL_BALANCE
            
            model_forecast = hybrid_forecast(lm,cat)
            print("Current forecast: ",model_forecast)
            
            #We have no open positions
            if(MT5.positions_total() == 0):
                print("No open positions")
                
                #Buy
                if(model_forecast > MT5.symbol_info(MARKET_SYMBOL).ask):
                    print("Following model forecast buy")
                    MT5.Buy(MARKET_SYMBOL,VOLUME)
                    last_trade = 1
                            
                #Sell    
                elif(model_forecast < MT5.symbol_info(MARKET_SYMBOL).ask):
                    print("Following model forecast sell")
                    MT5.Sell(MARKET_SYMBOL,VOLUME)
                    last_trade = 0
                    
            elif(MT5.positions_total() > 0):
                print("Checking model forecast")
                
                if((model_forecast > MT5.symbol_info(MARKET_SYMBOL).ask) & (last_trade == 0)):
                    print("Model is forecasting a move that hurts our exposure. Closing positions")
                    MT5.Close()
                
                elif((model_forecast < MT5.symbol_info(MARKET_SYMBOL).ask) & (last_trade == 1)):
                    print("Model is forecasting a move that hurts our exposure. Closing positions")
                    MT5.Close()
                    
            print("Total Profit/Loss: ",profit)
            time.sleep(60)

    Current forecast: [239100.04622681] No open positions Following model forecast buy Total Profit/Loss: 0.0


    Considerações finais

    À medida que avançamos para treinar modelos maiores e mais complexos, eles se tornam cada vez mais difíceis de entender, explicar e depurar. Sem a capacidade de entender completamente como nossos modelos de aprendizado de máquina são construídos e por que tomam certas decisões, não podemos ter certeza de que o modelo está funcionando como supomos. A incapacidade de entender os modelos e resolver problemas não garante complicações adicionais que surgem ao usar esses métodos. O valor que podemos extrair consistentemente da ferramenta é limitado pelo quanto entendemos essa ferramenta. Foi exatamente com esse objetivo que este artigo foi escrito - para encorajar você a confiar mais em seus modelos e obter uma compreensão mais profunda dos mecanismos internos dos modelos de aprendizado de máquina em "caixa preta".

    Traduzido do Inglês pela MetaQuotes Ltd.
    Artigo original: https://www.mql5.com/en/articles/13706

    Algoritmos de otimização populacional: simulação de têmpera (Simulated Annealing, SA). Parte I Algoritmos de otimização populacional: simulação de têmpera (Simulated Annealing, SA). Parte I
    O algoritmo de simulação de têmpera é uma metaheurística inspirada no processo de têmpera de metais. Neste artigo, realizaremos uma análise detalhada do algoritmo e mostraremos como muitas concepções comuns e mitos em torno deste método de otimização popular e amplamente conhecido podem ser equivocados e incompletos. Anúncio da segunda parte do artigo: "Conheça nosso algoritmo autoral de simulação de têmpera isotrópica (Simulated Isotropic Annealing, SIA)!"
    Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 08): Perceptrons Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 08): Perceptrons
    Os perceptrons, redes com uma única camada oculta, podem ser um bom suporte para aqueles familiarizados com os fundamentos do trading automático e que desejam mergulhar nas redes neurais. Vamos examinar passo a passo como eles podem ser implementados no conjunto de classes de sinais, que faz parte das classes do Assistente MQL5 para EAs.
    Redes neurais de maneira fácil (Parte 67): Aprendendo com experiências passadas para resolver novos problemas Redes neurais de maneira fácil (Parte 67): Aprendendo com experiências passadas para resolver novos problemas
    Neste artigo, continuaremos a falar sobre métodos de coleta de dados em uma amostra de treinamento. É claro que o processo de aprendizado requer constante interação com o ambiente. Mas as situações podem variar.
    Anotação de dados na análise de série temporal (Parte 4): Decomposição da interpretabilidade usando anotação de dados Anotação de dados na análise de série temporal (Parte 4): Decomposição da interpretabilidade usando anotação de dados
    Esta série de artigos apresenta várias técnicas destinadas a rotular séries temporais, técnicas essas que podem criar dados adequados à maioria dos modelos de inteligência artificial (IA). A rotulação de dados (ou anotação de dados) direcionada pode tornar o modelo de IA treinado mais alinhado aos objetivos e tarefas do usuário, melhorar a precisão do modelo e até mesmo ajudar o modelo a dar um salto qualitativo!