Русский
preview
Visão computacional para trading (Parte 2): complexificando a arquitetura até a análise 2D de imagens RGB

Visão computacional para trading (Parte 2): complexificando a arquitetura até a análise 2D de imagens RGB

MetaTrader 5Sistemas de negociação |
20 0
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Introdução: quando os números ganham vida

Na primeira parte do nosso estudo mostramos como redes neurais convolucionais podem analisar séries temporais de cotações cambiais por meio de filtros unidimensionais. Agora damos um salto qualitativo: ensinamos os algoritmos a perceber o mercado como uma paisagem integral, repleta de texturas, padrões e sinais ocultos.

A transformação de séries numéricas secas em imagens permite que o algoritmo analise o mercado a partir de uma perspectiva completamente nova. É assim que pensam os mestres do trading, vendo não apenas tabelas de dados, mas um quadro vivo do mercado, no qual cada detalhe carrega um sinal significativo. O algoritmo se eleva acima da representação unidimensional, descobrindo estruturas e regularidades que permanecem invisíveis nas séries numéricas.


A alquimia dos dados: dos números às sinfonias visuais

Nossa tela digital de 128 por 128 pixels torna-se a tela sobre a qual se desenrola o drama do mercado. Linhas de cotações bursáteis são transformadas em mapas visuais multicanais. 

O canal vermelho pulsa com dados de preço, o verdadeiro santo graal perseguido pelos traders. O verde ganha vida graças aos indicadores técnicos, médias móveis, MACD, bandas de Bollinger, ferramentas lapidadas ao longo de décadas. O canal azul respira os osciladores, RSI, estocástico, métricas de volatilidade, que, como um pulso, revelam o humor do mercado.

O código que cria essa magia é enganosamente simples, mas por trás dele se esconde um poder capaz de transformar nossa compreensão dos mercados:

# Фрагмент кода, превращающий данные в RGB-изображение
for t in range(window_size):
    x = int(t / window_size * img_size[1])
    y = int((1 - img_data[j, t]) * img_size[0])
    if 0 <= y < img_size[0] and 0 <= x < img_size[1]:
        img[y, x, 0] = 1.0  # Красный канал для ценовых данных

Quando os dados se transformam em imagem, formas surpreendentes emergem, como estrelas no céu noturno. É como ver um rosto em uma fotografia em vez de descrevê-lo por fórmulas. Padrões que os traders levam anos para aprender a reconhecer, “cabeça e ombros”, “fundo duplo”, “bandeira”, ganham vida diante do algoritmo, tornando-se tão evidentes quanto o nascer do sol. 

Para tornar essas imagens ainda mais ricas, adicionamos padrões de candles. As velas de alta brilham em verde, como a esperança de crescimento; as de baixa, em vermelho, como um alerta de perigo. Os pavios são desenhados em semitons, como sombras que sugerem a luta entre compradores e vendedores. Isso permite que o modelo não apenas capte tendências gerais, mas também perceba detalhes sutis, “martelo”, “engolfo”, “doji”.

É assim que isso se materializa no código:

if close_y < open_y:  # Бычья свеча
    for y in range(close_y, open_y):
        if 0 <= y < img_size[0] and 0 <= x < img_size[1]:
            img[y, x, 1] = 1.0  # Зелёный
else:  # Медвежья свеча
    for y in range(open_y, close_y):
        if 0 <= y < img_size[0] and 0 <= x < img_size[1]:
            img[y, x, 0] = 1.0  # Красный

Essas imagens não são apenas uma visualização. Elas se assemelham a mapas de calor, nos quais a intensidade da cor reflete a energia do mercado, e cada vela é uma pequena narrativa da batalha entre touros e ursos. É uma nova linguagem pela qual o algoritmo dialoga com o mercado, e ela soa como poesia.


Arquitetura neural: um trader artificial com visão tripla

Criar um trader artificial é como construir um arranha-céu, em que cada andar cumpre a sua função e, juntos, eles criam algo grandioso. Nossa arquitetura consiste em três caminhos paralelos, cada um observando o mercado a partir de um ângulo próprio. O primeiro caminho, com filtros convolucionais curtos, captura lampejos instantâneos: rompimentos de níveis, reversões, saltos bruscos. O segundo, com filtros longos, observa as grandes tendências que, como rios, moldam os ciclos de mercado. O terceiro caminho acompanha a volatilidade e a energia, analisando os osciladores para entender se o mercado está calmo ou prestes a explodir.

O código que materializa essa ideia tem a seguinte aparência:

local_path = Conv1D(64, 3, padding='same', activation='relu')(inputs[:,:,:,0])
trend_path = Conv1D(64, 7, padding='same', activation='relu')(inputs[:,:,:,1])
vol_path = Conv1D(64, 5, padding='same', activation='relu')(inputs[:,:,:,2])

Esses caminhos se fundem em um todo único, mas antes disso passam por um mecanismo de atenção, uma tecnologia que ensina o modelo a focar no essencial, como um trader que, no meio do ruído de notícias e gráficos, enxerga apenas o sinal-chave. Marcus du Sautoy, autor de “The Creativity Code”, compara isso à meditação: “O modelo aprende a descartar o ruído e ver a essência”. Uma única linha de código torna isso realidade:

attention_layer = Attention()([merged, merged])

Mas isso ainda não é tudo. Adicionamos uma camada LSTM bidirecional, que observa os dados para frente e para trás, como um historiador folheando as páginas do passado e do futuro. Isso ajuda a captar padrões complexos: consolidações prolongadas, reversões ocultas, momentos em que o mercado prende a respiração antes de um movimento brusco. Em seguida, a agregação global de características, como um maestro, reúne todas as notas em uma única sinfonia, criando uma visão holística do mercado.

O toque final é o aprendizado multitarefa. O modelo não apenas decide se o preço vai subir ou cair, ele prevê o quão forte será o movimento do mercado. Peter Lynch, investidor lendário, certa vez disse: “Saber que uma ação vai subir é uma coisa. Prever que ela vai subir exatamente 8% é outra completamente diferente”. Nosso modelo faz exatamente isso, como um enxadrista que enxerga não apenas o próximo lance, mas toda a partida.


Pelo buraco da fechadura: como o algoritmo revela seus pensamentos

O código que torna isso possível é simples, mas por trás dele se esconde uma revolução:

attention = np.mean(np.abs(attention_maps[i]), axis=-1)
heatmap = cv2.applyColorMap(np.uint8(255 * attention_resized), cv2.COLORMAP_JET)

Essa visualização é o início de uma nova ciência, a interpretação neural dos mercados. Pela primeira vez, não apenas recebemos uma previsão de uma caixa-preta, mas entendemos por que ela foi feita. 

Outra descoberta é a especialização dos neurônios. Ao analisar as ativações das camadas internas, observamos que alguns neurônios “acendem” apenas em reversões bruscas, outros em tendências suaves, e outros ainda em períodos de calmaria antes da tempestade. É como no cérebro humano, onde diferentes áreas são responsáveis pela visão ou pela audição.

O modelo criou seu próprio mapa do mercado, classificando situações de uma forma que nenhum analista havia feito antes. Por exemplo, ele identificou divergências não convencionais entre RSI e preço, que traders experientes posteriormente confirmaram como relevantes. Isso não é apenas um algoritmo, é uma nova forma de enxergar o mercado.


Transparência das decisões: quando a máquina se explica

Nosso sistema não apenas fornece previsões, ele explica como chegou a elas. Podemos desenhar um gráfico em que as áreas de atenção do modelo são destacadas em vermelho, mostrando onde ele está olhando. É como espiar a mente de um trader que circula os pontos-chave no gráfico. O código para essa visualização tem a seguinte aparência:

def plot_prediction_with_attention(data, prediction, attention_weights):
    plt.plot(data.index, data['close'], label='Цена закрытия', color='black', linewidth=2)
    for i in range(len(data.index) - 1):
        plt.axvspan(data.index[i], data.index[i+1], 
                   alpha=attention_weights[i] * 0.3, color='red')

Essas imagens transformam o modelo de um enigma em um parceiro. O trader vê não apenas que o mercado vai subir, mas também por quê: quais indicadores, quais candles, quais momentos convenceram o algoritmo. O modelo desliza pelos dados, gerando previsões quadro a quadro, como um diretor filmando um longa sobre o mercado. Não são apenas números, é uma história contada em movimento.

imageio.mimsave(gif_path, frames, duration=0.5)


Histórias de sucesso: como o modelo muda o jogo

Para entender como o modelo funciona na prática, imagine uma trader chamada Anna, que trabalha em um pequeno fundo de prop trading em Chicago. Anna confiou por anos em sua experiência e intuição, mas o mercado se tornava cada vez mais complexo, e a concorrência, cada vez mais acirrada. Quando ela começou a usar esse modelo, sua abordagem mudou. Em vez de passar horas analisando gráficos, agora ela observa os mapas de calor de atenção que o modelo desenha sobre o EURUSD. Esses mapas mostram onde o mercado está prestes a reverter, onde a tendência ganha força, onde vale a pena esperar por calmaria. Mas também o modelo pode libertá-la totalmente do estresse, evoluindo para um robô de trading. 


Detalhes técnicos: como o modelo aprende a enxergar

Um dos passos-chave foi o uso do RobustScaler para normalização dos dados. Os mercados são um caos, em que valores atípicos, como notícias repentinas, podem distorcer a imagem. O RobustScaler ajuda o modelo a permanecer estável, ignorando essas anomalias. É assim que isso funciona:

scaler = RobustScaler()
if window_data[indicator].std() != 0:
    img_data[j] = scaler.fit_transform(window_data[indicator].values.reshape(-1, 1)).flatten()

Outro truque é o desfoque das imagens com a ajuda de um filtro gaussiano. Isso suaviza o ruído, ajudando o modelo a se concentrar em padrões gerais, e não em picos aleatórios. É como colocar óculos para enxergar a floresta em vez das árvores:

img = gaussian_filter1d(img, sigma=0.5, axis=0)
img = gaussian_filter1d(img, sigma=0.5, axis=1)

O treinamento do modelo é uma saga à parte. Utilizamos callbacks para evitar sobreajuste, salvar as melhores versões e adaptar a taxa de aprendizado. O EarlyStopping interrompe o processo se o modelo começa a “decorar” e memorizar os dados, enquanto o ReduceLROnPlateau reduz o passo quando o progresso desacelera. É como ensinar uma criança a andar de bicicleta: dá apoio até que ela consiga seguir sozinha.

callbacks = [
    EarlyStopping(monitor='val_direction_accuracy', patience=15, restore_best_weights=True, verbose=1, mode='max'),
    ModelCheckpoint(filepath=os.path.join(checkpoint_dir, 'best_model.keras'), monitor='val_direction_accuracy', save_best_only=True, verbose=1),
    ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=7, min_lr=0.00001, verbose=1)
]

Os resultados do gráfico de treinamento são encorajadores, a precisão no conjunto de teste não cai de forma significativa e permanece estável acima de 53%, e isso com um número pequeno de épocas de treinamento:

Nossa arquitetura aprimorada já demonstra resultados promissores, mas isso é apenas o começo do caminho. 

Integração de dados fundamentais

O modelo atual trabalha exclusivamente com dados técnicos. O próximo passo lógico é a integração de fatores fundamentais: indicadores econômicos, eventos de notícias, sentimento de mercado. Isso pode ser implementado por meio de aprendizado multimodal, no qual o contexto das notícias é transformado em representações vetoriais e combinado com os dados técnicos.

Hierarquia temporal e estrutura fractal dos mercados

Os mercados possuem uma natureza fractal: padrões se manifestam em diferentes timeframes com uma impressionante autossimilaridade. Uma arquitetura baseada no processamento hierárquico de diferentes timeframes (de gráficos de minutos a mensais) pode revelar regularidades complexas em múltiplos níveis.

Aprendizado adaptativo e metaaprendizado

Os mercados evoluem constantemente, o que exige adaptação contínua dos modelos. Uma direção promissora é o desenvolvimento de um sistema de metaaprendizado que ajuste automaticamente a arquitetura e os parâmetros do modelo, de acordo com as mudanças nas condições de mercado.

Esses detalhes não são apenas código. Eles são o alicerce sobre o qual o modelo aprende a enxergar o mercado mais profundamente do que qualquer trader.


Olhando para o futuro: novos horizontes

Nosso modelo é apenas o começo, a primeira pincelada em uma grande tela. Imagine adicionar notícias e dados econômicos. Transformadores converterão manchetes da Bloomberg e relatórios do Fed em vetores, que o modelo combinará com gráficos e indicadores. Uma decisão de aumento de juros ou um tweet inesperado de Elon Musk passarão a fazer parte do quadro que o algoritmo enxerga. É como dar ao trader não apenas o gráfico, mas todo o contexto do mundo.

Os mercados são fractais, nos quais os padrões se repetem em diferentes escalas, de minutos a meses. Se ensinarmos o modelo a observar todos os timeframes simultaneamente, ele poderá encontrar tendências aninhadas que escapam até mesmo aos melhores analistas. Imagine um modelo que identifica um “cabeça e ombros” no gráfico diário e, dentro dele, um micropadrão no gráfico de cinco minutos. É como enxergar uma galáxia e suas estrelas com um único olhar.

E se o modelo puder se aprimorar sozinho? O metaaprendizado permitirá que ele se adapte às mudanças de regimes de mercado, da calmaria à tempestade. Se o mercado se tornar volátil, ele ajustará automaticamente seus parâmetros, como um capitão que corrige o leme durante uma tempestade. Isso não é fantasia, é o próximo passo que já desponta no horizonte.

A transparência é outro objetivo. Queremos que os traders não apenas confiem no modelo, mas aprendam com ele. Visualizações mais profundas de atenção e ativações mostrarão como o algoritmo pensa e, talvez, nos ensinem a enxergar o mercado de outra forma. Imagine que o modelo destaque um padrão que ninguém havia notado antes, e os traders passem a chamá-lo de “cruz neural” em sua homenagem. Isso não será apenas uma ferramenta, mas uma nova forma de pensar.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/18103

Arquivos anexados |
CV_2_D.py (41.61 KB)
Modelo matricial de previsão baseado em cadeia de Markov Modelo matricial de previsão baseado em cadeia de Markov
Criamos um modelo matricial de previsão baseado em uma cadeia de Markov. O que são cadeias de Markov e como uma cadeia de Markov pode ser usada para trading no Forex.
Automatizando Estratégias de Trading em MQL5 (Parte 5): Desenvolvendo a Estratégia Adaptive Crossover RSI Trading Suite Automatizando Estratégias de Trading em MQL5 (Parte 5): Desenvolvendo a Estratégia Adaptive Crossover RSI Trading Suite
Neste artigo, desenvolvemos o Sistema Adaptive Crossover RSI Trading Suite, que utiliza cruzamentos de médias móveis de 14 e 50 períodos para geração de sinais, confirmados por um filtro de RSI de 14 períodos. O sistema inclui um filtro de dias de negociação, setas de sinal com anotações e um painel em tempo real para monitoramento. Essa abordagem garante precisão e adaptabilidade no trading automatizado.
Está chegando o novo MetaTrader 5 e MQL5 Está chegando o novo MetaTrader 5 e MQL5
Esta é apenas uma breve resenha do MetaTrader 5. Eu não posso descrever todos os novos recursos do sistema por um período tão curto de tempo - os testes começaram em 09.09.2009. Esta é uma data simbólica, e tenho certeza que será um número de sorte. Alguns dias passaram-se desde que eu obtive a versão beta do terminal MetaTrader 5 e MQL5. Eu ainda não consegui testar todos os seus recursos, mas já estou impressionado.
Ciência de Dados e ML (Parte 33): Dataframe do Pandas em MQL5, Coleta de Dados para Uso em ML facilitada Ciência de Dados e ML (Parte 33): Dataframe do Pandas em MQL5, Coleta de Dados para Uso em ML facilitada
Ao trabalhar com modelos de aprendizado de máquina, é essencial garantir consistência nos dados usados para treinamento, validação e testes. Neste artigo, criaremos nossa própria versão da biblioteca Pandas em MQL5 para garantir uma abordagem unificada para o tratamento de dados de aprendizado de máquina, assegurando que os mesmos dados sejam aplicados dentro e fora do MQL5, onde ocorre a maior parte do treinamento.