Redes neurais em trading: dos Transformers aos neurônios de disparo (SpikingBrain)
Introdução
Os mercados financeiros sempre foram um ambiente em que o acaso convive com padrões e uma reação imediata costuma ser mais importante do que uma análise prolongada. Eles já foram comparados a um oceano, cuja superfície tranquila pode se transformar em tempestade de um instante para outro, e a um organismo, cujo ritmo é definido pelos impulsos nervosos. No entanto, talvez a metáfora mais precisa continue sendo a do sistema nervoso, capaz de reagir aos estímulos externos de forma instantânea e localizada. É justamente por isso que o surgimento do framework SpikingBrain, apresentado no estudo "SpikingBrain Technical Report: Spiking Brain-inspired Large Models", desperta tanto interesse.
Inspirado na biologia cerebral, o framework utiliza um modelo de processamento baseado em disparos. Ao contrário das redes neurais tradicionais, que processam continuamente os dados de entrada, as redes neurais de disparos funcionam como postos de vigilância. Permanecem inativas até que ocorra um evento crítico e só então emitem um sinal. Essa lógica se aproxima de maneira surpreendente do próprio comportamento do mercado, no qual o preço pode oscilar durante horas em uma faixa estreita até que um único evento rompa o equilíbrio e dê origem a uma tendência bem definida.
Para compreender melhor essa analogia, basta observar os gráficos Renko. Neles, um novo candle não surge com o passar do tempo, mas apenas quando o preço atinge determinado limiar. Todo o ruído de pequena amplitude desaparece, restando apenas o desenho nítido do movimento. Um neurônio de disparo funciona da mesma forma. Permanece inativo até que o sinal analisado alcance o nível estabelecido. Para o trader, isso equivale a identificar um sinal claro de mercado em meio ao caos das cotações, no qual inúmeros detalhes irrelevantes ocultam o que realmente importa.
Na prática, o mercado financeiro é movido não pelo tempo, mas pelos eventos. A divulgação do Non-Farm Payrolls é um exemplo particularmente ilustrativo. Poucos minutos antes da publicação dos dados, o mercado pode parecer adormecido. As cotações ficam praticamente paralisadas, a liquidez diminui e os traders aguardam em silêncio. Mas basta que os números surpreendam para que ocorra uma explosão de atividade. Os pares de moedas registram movimentos bruscos, os spreads se ampliam e as ordens stop são acionadas uma após a outra no livro de ofertas. Os modelos clássicos muitas vezes precisam de algum tempo para incorporar mudanças tão abruptas. Como calculam médias e suavizam os dados, só identificam o movimento quando ele já está quase concluído. A arquitetura de disparos registra esses eventos de outra maneira: cada impulso atualiza imediatamente o estado da rede, permitindo tomar uma decisão de trading no exato momento em que ela ainda faz sentido.
Um cenário semelhante ocorre no rompimento de níveis psicológicos. O preço permanece por muito tempo rondando esse nível, enquanto os traders aguardam e a tensão aumenta. Então ocorre um único movimento brusco, e o nível é rompido. Uma avalanche de ordens toma conta do mercado, o movimento acelera e o mercado explode em atividade. Nesse momento, é especialmente importante que o modelo reaja ao próprio rompimento, e não ao acúmulo gradual de estatísticas. Esse comportamento corresponde perfeitamente à intuição de um trader experiente. Ele sabe que todo o ruído anterior foi apenas um prelúdio e que o verdadeiro sinal surge no instante do movimento decisivo.
Outro exemplo é o acionamento sucessivo de stop-losses. O preço atinge uma zona crítica e as ordens são ativadas uma após a outra, gerando um efeito cascata. Esse fenômeno se assemelha de forma surpreendente ao funcionamento de um circuito neural, na qual o primeiro impulso desencadeia o segundo, que aciona o terceiro, e a onda continua se propagando. Os modelos tradicionais tendem a interpretar essa dinâmica como um movimento caótico. Para um modelo de disparos, porém, trata-se de um processo natural. Cada disparo desencadeia o seguinte, permitindo que o sistema reproduza naturalmente esse tipo de dinâmica em cascata.
Essas observações deixam claro que o SpikingBrain opera com base em eventos. Ao contrário dos modelos tradicionais, que tratam o fluxo de dados como um processo contínuo, ele identifica exatamente os momentos que carregam informações relevantes. Seu funcionamento não se baseia em análise constante, mas em reação imediata. Essa abordagem evita o desperdício de recursos com oscilações ruidosas e concentra a atenção no que realmente movimenta o mercado.
Outro benefício igualmente importante é a eficiência energética. Nos modelos tradicionais, os neurônios permanecem ativos mesmo quando não há nenhum sinal relevante na entrada. Nos modelos neurais de disparos, a lógica é diferente. O neurônio só dispara quando o limiar é atingido. No contexto do mercado, isso significa que os recursos computacionais são utilizados apenas quando ocorre um movimento importante. Essa abordagem permite implementar o algoritmo diretamente nos terminais de negociação, sem depender de servidores externos nem introduzir atrasos excessivos.
Outra característica que torna o SpikingBrain especialmente valioso na prática é sua capacidade de aprendizado online. O mercado muda constantemente, e os padrões que funcionaram ontem podem se tornar inúteis amanhã. Os modelos clássicos muitas vezes ficam presos ao passado. Treinados com dados antigos, eles têm dificuldade para lidar com situações inesperadas. O modelo de disparos, por sua vez, ajusta sua previsão em tempo real. Cada novo evento passa a integrar seu aprendizado, permitindo que o algoritmo permaneça flexível e dinâmico. Esse comportamento se assemelha muito ao de um trader experiente, que reage imediatamente às notícias recentes e ajusta sua estratégia sem permanecer preso a padrões antigos.
Todas essas características permitem considerar o SpikingBrain uma tentativa de construir um sistema nervoso completo para um robô de trading. Ele opera por impulsos, reage a eventos e se adapta às novas condições com a mesma rapidez do mercado. Assim como os gráficos Renko ajudam o trader a identificar a essência do movimento sem o ruído desnecessário, o modelo de disparos destaca o que é importante e ignora o que é secundário.
Algoritmo SpikingBrain
Quando analisado sob a perspectiva da evolução das redes neurais, o SpikingBrain se apresenta como uma etapa natural, lógica e oportuna desse desenvolvimento. O Transformer provocou uma verdadeira revolução ao abandonar as pesadas estruturas recorrentes e introduzir um mecanismo de atenção capaz de considerar simultaneamente toda a sequência de dados. Essa versatilidade o transformou no padrão de referência para modelos de linguagem e diversas tarefas relacionadas. No entanto, a versatilidade também tem seu ponto fraco. Uma arquitetura que funciona perfeitamente com textos pode ficar rapidamente sobrecarregada quando aplicada ao mercado, pois, na maior parte do tempo, nada de relevante acontece, enquanto há oscilações ruidosas demais.
É justamente nesse aspecto que o SpikingBrain introduz uma nova perspectiva. Os autores do framework adotam o conceito de atenção, mas o transferem para uma lógica orientada a eventos. No Transformer clássico, a atenção é distribuída por toda a sequência: o modelo considera tudo ao mesmo tempo, atribuindo maior ou menor relevância a cada parte. No SpikingBrain, a atenção surge como um disparo, uma reação imediata ao instante em que determinado limiar é atingido.
No mercado financeiro, essa diferença se torna particularmente evidente. As cotações podem ser imaginadas como um fluxo de letras que formam as palavras e frases da história do mercado. Ao contrário da linguagem, porém, esse fluxo contém uma enorme quantidade de letras desnecessárias, repetições e inserções aleatórias. O Transformer é capaz de processar tudo isso, mas muitas vezes de forma desnecessariamente abrangente, como um professor meticuloso que não deixa passar nenhum detalhe, mesmo quando esse detalhe não tem significado. O SpikingBrain, por sua vez, atua como um editor experiente, eliminando trechos banais e concentrando a atenção apenas no que altera o sentido. Como resultado, a estrutura dos dados permanece coesa e o sinal não fica sobrecarregado por informações desnecessárias.
A eficiência energética também desempenha um papel importante. O Transformer exige recursos computacionais enormes, o que se justifica em tarefas de geração de texto ou tradução, nas quais cada detalhe pode ser relevante. No mercado financeiro, esse excesso de análise pode gerar falsos sinais e custos desnecessários. O modelo de disparos funciona de outra forma. O neurônio permanece inativo até acumular potencial suficiente e só então emite um sinal. Dessa maneira, o modelo economiza recursos e seu comportamento se aproxima mais da dinâmica do trading. Um trader não reage a cada tick, mas aguarda o momento em que o movimento realmente merece atenção.
O SpikingBrain pode ser visto como um modelo híbrido. Por um lado, ele herda a força conceitual do Transformer; por outro, amplia essa base com uma lógica orientada a eventos e inspirada na biologia. Nessa nova interpretação, a atenção deixa de ser um estado permanente e passa a representar um ato de seleção, o acionamento instantâneo da resposta do sistema. É justamente essa característica que torna o modelo especialmente valioso para o mercado, em que o decisivo não é todo o fluxo de dados, mas apenas os momentos críticos capazes de alterar a trajetória do capital.
A economia de recursos computacionais já é, por si só, um argumento relevante. Nos mercados financeiros, porém, ela assume um significado ainda mais profundo. A questão não se resume à velocidade de processamento, mas envolve também a capacidade de gerar sinais oportunos e confiáveis. Quando um modelo fica sobrecarregado por informações excessivas, ele pode reagir com atraso ou produzir falsos sinais. A complexidade quadrática do Transformer faz com que, à medida que a sequência aumenta, o sistema comece a ficar saturado. Em vez de uma visão clara do mercado, o trader recebe ruído disfarçado de análise.
O SpikingBrain resolve esse problema de uma forma radicalmente diferente. O processamento orientado a eventos reduz a carga computacional e filtra os dados de maneira natural. O neurônio só dispara quando o movimento acumulado passa a ser realmente relevante. O modelo se transforma em uma espécie de editor do mercado, eliminando oscilações sem significado e preservando apenas os momentos de inflexão. Como resultado, os sinais se tornam menos frequentes, porém mais confiáveis, exatamente o que o trading exige, em que cada decisão envolve riscos e precisa ser bem fundamentada.
Além disso, a redução da carga computacional abre espaço para cenários de aplicação mais complexos. Enquanto o Transformer clássico esbarra nas limitações do hardware, a arquitetura de disparos permite processar grandes volumes de informações de mercado em tempo real sem perda de desempenho. Para o trading algorítmico, no qual alguns milissegundos podem determinar o resultado de uma operação, essa vantagem é crucial.
A arquitetura do SpikingBrain se baseia em princípios que integram de forma natural o processamento por disparos ao mecanismo de atenção, adaptado à lógica orientada a eventos. Sua estrutura é composta por um conjunto de neurônios de disparo, cada um deles responsável por receber o sinal de entrada e acumular potencial até atingir um limiar crítico. Nesse momento, o neurônio é ativado e gera um disparo, que se propaga pela rede, influencia outros neurônios e aciona os blocos de processamento correspondentes.
Essa abordagem permite que a rede se concentre em eventos relevantes, ignorando pequenas oscilações e variações ruidosas. No SpikingBrain, o mecanismo de atenção deixa de funcionar como uma ponderação distribuída, como ocorre no Transformer clássico, e passa a atuar como um filtro dinâmico. Ele intensifica a resposta dos neurônios que recebem os dados de entrada mais relevantes e reduz a reação aos sinais de menor importância. Assim, a rede não responde a cada mudança, mas apenas aos momentos que realmente podem alterar a situação do mercado.
As conexões entre os neurônios são estruturadas para proporcionar respostas tanto locais quanto globais. As conexões locais registram mudanças em segmentos específicos dos dados. Já as conexões globais permitem que o sinal se propague pela rede, promovendo a sincronização e a resposta a eventos de maior escala, como o rompimento de um nível de liquidez ou o acionamento em cascata de ordens stop. Essa estrutura preserva os detalhes sem perder a visão global do mercado.
Outro elemento fundamental é a adaptação do limiar. O limiar de ativação dos neurônios não é fixo, mas se ajusta dinamicamente de acordo com a volatilidade atual e a dinâmica histórica. Isso permite que o modelo permaneça sensível a movimentos inesperados sem reagir de forma excessiva a pequenas oscilações ruidosas. Combinada ao processamento orientado a eventos, essa característica torna a arquitetura do SpikingBrain especialmente robusta diante das oscilações do mercado e capaz de gerar sinais de alta qualidade.
Em seu estudo, os autores do framework SpikingBrain concluem que, com uma leve atualização incremental do modelo, um Transformer de base pode ser convertido em diferentes variantes eficientes de atenção. Isso permite equilibrar de forma flexível a precisão e a economia computacional. No contexto dos mercados financeiros, essa possibilidade é especialmente importante: algumas tarefas exigem a análise rápida de longas sequências de preços, enquanto outras priorizam a alta precisão dos sinais com recursos limitados.
Para ilustrar essa abordagem, o estudo apresenta dois modelos desenvolvidos a partir de um mesmo Transformer clássico pré-treinado. O primeiro, SpikingBrain-7B, é um modelo inteiramente linear, otimizado para processar contextos longos com o mínimo consumo de recursos. O segundo, SpikingBrain-76B, é uma variante híbrida baseada em Mixture-of-Experts, que combina atenção linear e local para equilibrar eficiência e qualidade das previsões.
No SpikingBrain-7B, as camadas de atenção linear se alternam com camadas locais de atenção com janela deslizante de tamanho fixo. As camadas locais capturam padrões detalhados de preços, de forma semelhante a um trader que identifica impulsos de curto prazo, enquanto a atenção linear comprime de forma eficiente as dependências de longo alcance. Assim, o modelo preserva a integridade do contexto sem elevar desnecessariamente a carga computacional. Graças a essa estrutura, a complexidade temporal do treinamento permanece linear, enquanto o consumo de memória durante a execução se mantém constante, independentemente do comprimento da sequência. Na prática, a atenção linear é implementada por meio do módulo Gated Linear Attention, que reforça os sinais relevantes e ajuda os neurônios a reter a dinâmica do mercado, respondendo apenas a eventos realmente significativos.
O SpikingBrain-76B leva essa ideia adiante. Nele, a atenção linear e a atenção local são combinadas dentro de cada camada em uma configuração híbrida paralela. Além disso, camadas convencionais de atenção completa são intercaladas entre as demais camadas para reforçar a coerência global dos sinais. Essa arquitetura permite capturar simultaneamente eventos locais e globais do mercado, sem sobrecarregar o modelo com dados desnecessários. Para tornar a atenção local mais flexível e reduzir o efeito de attention sink, o modelo incorpora tokens treináveis especiais, que interagem com a sequência sem restrição causal. Também é utilizada uma estrutura esparsa de Mixture-of-Experts nos módulos FFN. Cada camada ativa apenas uma parte dos especialistas, economizando recursos e permitindo que o modelo processe grandes volumes de dados em tempo real.
As duas implementações demonstram como os princípios do Transformer podem ser reinterpretados segundo uma lógica orientada a eventos.
A solução arquitetural do SpikingBrain apresenta diversas semelhanças com os princípios de funcionamento do cérebro biológico. Os módulos de atenção linear exibem propriedades comparáveis às da memória humana. Eles utilizam estados compactados e continuamente atualizados. A cada etapa, extraem informações apenas da memória atual, manifestando um comportamento semelhante ao de um processo de Markov. Do ponto de vista biológico, esse processamento recorrente ao longo do tempo pode ser interpretado como uma abstração simplificada da dinâmica dendrítica com morfologia ramificada, na qual cada ramo realiza o processamento local do sinal.
O componente Mixture-of-Experts (MoE) incorpora o princípio da ativação modular esparsa e da especialização funcional, semelhante ao processamento distribuído e especializado dos circuitos neurais. Cada especialista processa apenas uma parte das informações, e o resultado global é formado pelas saídas dos módulos ativos, aumentando a eficiência e a robustez do sistema.
O esquema de codificação de disparos proposto pelos autores do framework foi inspirado em sistemas biológicos nos quais a ativação dos neurônios é orientada a eventos e apresenta esparsidade adaptativa. A combinação da esparsidade no nível do modelo, por meio do MoE, com a esparsidade de neurônios individuais permite distribuir os recursos computacionais de forma econômica e obter eficiência em dois níveis: no modelo e nos neurônios individuais. Assim, o sistema é ativado apenas quando necessário, concentrando os recursos nos eventos mais relevantes do mercado e mantendo, ao mesmo tempo, uma alta velocidade de processamento dos dados.
Em conjunto, essas soluções apontam um caminho promissor para a criação de arquiteturas de modelos de grande porte que sejam eficientes e econômicas do ponto de vista computacional. Ao mesmo tempo, elas preservam a plausibilidade biológica ao combinar a capacidade das redes neurais com os princípios de funcionamento do cérebro biológico. No contexto dos mercados financeiros, isso significa que o SpikingBrain pode destacar os eventos essenciais, agindo de maneira seletiva e reduzindo o ruído.
O treinamento do SpikingBrain se baseia em princípios que permitem transferir com eficiência o conhecimento de modelos Transformer já treinados para novas arquiteturas neurais de disparos e arquiteturas híbridas. O fundamento dessa abordagem é a correspondência entre os mapas de atenção. Em um Transformer pré-treinado, a atenção é determinada pela função SoftMax padrão aplicada ao produto entre consultas e chaves multiplicado pela máscara da sequência. Nesse contexto, a atenção local com janela deslizante (SWA) pode ser considerada uma versão esparsa desse mapa, com forte ênfase nos eventos mais recentes. Já a atenção linear representa uma aproximação de baixo posto, na qual o posto máximo do mapa é limitado pela dimensionalidade dos vetores de consulta e chave.
Com base nessa correspondência, os parâmetros das projeções QKV podem ser inicializados diretamente a partir do checkpoint do Transformer pré-treinado. Por meio de uma leve atualização incremental do modelo com um volume relativamente pequeno de dados, o mecanismo de atenção é adaptado a configurações locais ou de baixo posto. A atenção local preserva a precisão na análise dos eventos recentes, enquanto a atenção linear mantém as dependências globais. A combinação das duas em uma configuração híbrida proporciona uma aproximação mais precisa do mapa de atenção original. Para o mercado financeiro, isso significa que o modelo pode acompanhar simultaneamente picos de preços de curto prazo e tendências globais, preservando a coerência dos sinais.
Para garantir a estabilidade do treinamento e uma transição gradual para a nova arquitetura, são empregadas várias técnicas importantes. Em primeiro lugar, as ativações QK da atenção linear são convertidas em valores não negativos por meio de ReLU ou Sigmoid, preservando as propriedades do SoftMax e permitindo a transferência correta do conhecimento. Em segundo lugar, são mantidos os parâmetros de baixo posto, como os componentes de normalização e gating. Durante a conversão, o treinamento é realizado com uma learning rate baixa, o que dificulta a otimização de um grande número de parâmetros inicializados aleatoriamente. Por isso, os autores do framework reutilizam todos os pesos de projeção dos módulos de atenção e FFN, reduzindo ao mínimo a quantidade de novos parâmetros.
A terceira característica é a ampliação do comprimento do contexto durante a atualização incremental do modelo. Como a complexidade dos mecanismos eficientes de atenção cresce de forma subquadrática, é conveniente limitar o comprimento do contexto na conversão inicial e aumentá-lo gradualmente ao longo do treinamento. Dessa forma, a eficiência computacional é preservada. Para garantir o desempenho, todos os parâmetros do modelo são treinados durante a conversão, com o uso de aquecimento da learning rate, métodos de destilação entre arquiteturas ou treinamento simultâneo de todos os parâmetros.
No contexto financeiro, essa abordagem permite transferir gradualmente o conhecimento de modelos pré-treinados de grande capacidade para as arquiteturas neurais de disparos especializadas do SpikingBrain. O modelo preserva as informações sobre os principais eventos do mercado, ao mesmo tempo que filtra o ruído com eficiência e reduz os custos computacionais.
O treinamento do SpikingBrain é implementado como uma conversão em várias etapas. O pré-treinamento contínuo com expansão gradual do contexto, Continual Pre-Training (CPT), dá lugar gradualmente ao ajuste fino supervisionado, Supervised Fine-Tuning (SFT). Em seu estudo, os autores do framework utilizaram conjuntos de dados abertos de alta qualidade para treinar os modelos. Na prática, porém, dados financeiros específicos podem ser empregados para adaptar o sistema a determinados mercados ou ativos.
O artigo dos autores descreve o treinamento do modelo de linguagem SpikingBrain em três etapas. Em cada uma delas, o comprimento do contexto aumenta gradualmente e o modelo se adapta aos novos requisitos. Na primeira etapa, os modelos são treinados com 100 bilhões de tokens e sequências com comprimento de 8k tokens. Isso permite transferir os padrões de atenção para variantes locais e de baixo posto, além de garantir a convergência estável da função de perda. Na segunda e na terceira etapas, o comprimento da sequência é ampliado para 32k e 128k, respectivamente, com o uso de 20 a 30 bilhões de tokens em cada uma. No total, a conversão requer cerca de 150 bilhões de tokens, o equivalente a apenas aproximadamente 2% do volume de dados necessário para treinar um modelo do zero, proporcionando uma adaptação eficiente mesmo com recursos limitados. Em todas as etapas, a codificação posicional RoPE de base permanece inalterada, assim como no modelo original.
Após a etapa de CPT, vem o ajuste fino, também dividido em três etapas. A primeira se concentra na compreensão básica da linguagem e no conhecimento do domínio, utilizando o amplo conjunto de dados Infinity Instruct, que abrange conhecimentos científicos, interpretação de código e resolução de problemas matemáticos. O treinamento é realizado com 500 mil exemplos e sequências com comprimento de 8k tokens. A segunda etapa enfatiza as habilidades de diálogo e o cumprimento de instruções, utilizando um conjunto de diálogos com múltiplos turnos, voltados para tarefas e perguntas de conteúdo informativo. O volume de dados e o comprimento das sequências permanecem inalterados. A terceira etapa é dedicada a tarefas de raciocínio e utiliza um conjunto de dados de alta qualidade com cadeias detalhadas de raciocínio para demonstrações matemáticas, inferências lógicas, análise de casos e outras tarefas compostas por várias etapas.
Essa abordagem em várias etapas permite que o SpikingBrain assimile gradualmente o conhecimento dos modelos pré-treinados, adapte-se a contextos longos e, ao mesmo tempo, aumente a precisão dos sinais em diferentes níveis.
Para converter com eficiência um modelo FFN denso em uma arquitetura MoE, os autores do framework utilizam a técnica de upcycling, que permite ampliar a capacidade do modelo e, ao mesmo tempo, reutilizar o conhecimento já codificado nos parâmetros originais. Durante a inicialização, os parâmetros da FFN densa de base são copiados para N especialistas, e é aplicado um roteamento aleatório a cada token. Esse roteador seleciona os Top-K especialistas com probabilidade p e retorna a soma ponderada de suas saídas, garantindo inicialmente a equivalência funcional com a rede densa original.
Durante o treinamento, o roteamento estocástico e a adição de ruído aos dados rompem gradualmente a simetria inicial, gerando gradientes diferenciados e favorecendo a especialização dos especialistas. Além dos especialistas selecionados pelo roteador, o SpikingBrain-76B utiliza um especialista compartilhado, que permanece ativo para todos os tokens e ajuda a estabilizar a conversão.
A cópia direta e a ativação de vários especialistas aumentam a escala dos valores de saída. Para preservar a consistência entre as saídas do MoE e da FFN densa, é introduzido um fator de escala, aplicado a todos os especialistas durante a inicialização. Dessa forma, a rede MoE começa operando de maneira equivalente ao modelo denso original, mas mantém o potencial de ampliar sua capacidade e desenvolver especializações ao longo do treinamento.
No contexto financeiro, essa arquitetura MoE permite que o SpikingBrain acompanhe simultaneamente diversos cenários de mercado, atribuindo especialistas a diferentes tipos de sinais. Alguns se concentram em impulsos de preços de curto prazo, enquanto outros analisam tendências globais ou eventos raros. Graças ao upcycling, a rede se adapta rapidamente ao reutilizar o conhecimento já acumulado, o que acelera o treinamento e aumenta a precisão dos sinais sem elevar desnecessariamente a carga computacional.
Inspirados em mecanismos biológicos de computação, como o processamento orientado a eventos e a ativação esparsa, os autores do framework propõem uma estratégia especializada de codificação por disparos, que converte as ativações dos modelos de grande porte em valores inteiros e sequências de disparos. Esse esquema pode ser aplicado tanto durante quanto após o treinamento, transformando as ativações do modelo em sinais de disparo. Para aumentar ainda mais a eficiência energética, propõe-se também a quantização dos pesos do modelo e do cache KV com precisão INT8. A integração dessa estratégia com a conversão simplificada do SpikingBrain dispensa uma atualização incremental completa do modelo. Basta utilizar uma pequena amostra de calibração para otimizar os parâmetros de quantização.
As ativações no SpikingBrain são convertidas em duas etapas. Na primeira, utiliza-se o disparo com limiar adaptativo. As ativações são convertidas em disparos representados por valores inteiros com base em um limiar ajustado dinamicamente, que mantém o equilíbrio estatístico da atividade neural. Isso evita tanto o excesso de disparos quanto a inatividade dos neurônios, aspecto fundamental para preservar o conteúdo informativo dos sinais.
Formalmente, o limiar é definido como o valor absoluto médio do potencial de membrana, escalado pelo hiperparâmetro k, que controla a quantidade de disparos. Esse mecanismo é robusto a valores atípicos raros. Os neurônios mantêm uma atividade estável para a maioria dos sinais e aumentam a quantidade de disparos apenas diante de picos realmente críticos. No contexto financeiro, esse comportamento pode ser comparado ao cruzamento do preço com uma média móvel. As oscilações comuns não ultrapassam o limiar neutro e não provocam nenhuma reação. Somente quando o preço cruza a média móvel, em um momento decisivo, o sinal é gerado. Da mesma forma, a rede neural de disparos reage apenas a eventos relevantes, filtrando o ruído e concentrando a atenção nos movimentos do mercado com relevância prática para o trading.
Na segunda etapa, já durante a inferência, os disparos inteiros obtidos são desdobrados ao longo do eixo temporal em sequências esparsas com valores {−1, 0, 1}. Isso permite substituir multiplicações matriciais densas por acumulações orientadas a eventos, aumentando significativamente a eficiência computacional. Para diferentes cenários, os autores do framework propõem três esquemas de codificação.
O primeiro é a codificação binária {0, 1}. Cada unidade corresponde à ativação de um neurônio, e a quantidade de disparos é acumulada ao longo do tempo. Trata-se de uma solução simples e eficiente quando a densidade de disparos é baixa. No entanto, valores elevados exigem muitos passos temporais.
O segundo é a codificação ternária {−1, 0, 1}, que introduz disparos inibitórios. Essa abordagem permite representar tanto a excitação quanto a inibição, aproximando-se mais dos princípios biológicos de excitação e inibição. A codificação ternária reduz o número de passos temporais e reduz a frequência dos disparos para menos da metade, sem comprometer a expressividade dos sinais.
O terceiro é a codificação bit a bit, ou bitwise coding. Nela, a contagem inteira de disparos é desdobrada em bits ao longo do tempo. Esse esquema proporciona a maior compressão possível no eixo temporal. Também são possíveis variantes de codificação bidirecional e representações com sinal, que permitem considerar simultaneamente valores positivos e negativos, preservando a simplicidade e a plausibilidade biológica. A codificação bit a bit reduz em até 8 vezes o volume total de disparos, minimizando a sobrecarga de comunicação e a carga computacional.
Com isso, o SpikingBrain deixa de reagir a cada tick ou oscilação ruidosa do mercado e passa a se concentrar em eventos relevantes, assim como um trader que só toma uma decisão quando o preço cruza um nível importante. Cada conversão das ativações em disparos torna o modelo mais seletivo, econômico e adaptado ao ambiente dinâmico dos mercados financeiros.
A visualização do framework SpikingBrain elaborada pelos autores é apresentada abaixo.

Implementação em MQL5
Após examinarmos detalhadamente os aspectos teóricos do framework SpikingBrain, passaremos à parte prática do estudo, na qual analisaremos uma das possíveis implementações das abordagens propostas em MQL5. Antes de tudo, porém, é preciso encarar a realidade. A economia de recursos mencionada pelos autores do framework é obtida, em grande parte, com o uso de modelos de linguagem de grande porte pré-treinados e baseados na arquitetura Transformer. Sem acesso a esses modelos, o treinamento continua sendo trabalhoso e exigindo muitos recursos, algo que deve ser considerado no planejamento do desenvolvimento.
Ainda assim, a principal questão sobre a eficiência da arquitetura proposta permanece em aberto. É justamente isso que pretendemos avaliar na prática, investigando o comportamento do processamento por disparos e da arquitetura modular MoE em condições de recursos computacionais limitados e com dados reais de mercado. Dessa forma, poderemos estimar as vantagens concretas do SpikingBrain: até que ponto ele consegue filtrar o ruído, identificar os principais sinais de mercado e economizar recursos computacionais em um ambiente no qual milissegundos e precisão são fatores críticos.
Ao mesmo tempo, o uso de modelos neurais pré-treinados, conforme proposto pelos autores do framework, oferece uma possibilidade importante. Podemos reutilizar, nesta implementação, módulos e camadas de redes neurais desenvolvidos anteriormente, acelerando significativamente o desenvolvimento. No entanto, não será possível evitar por completo a introdução de novos algoritmos. A combinação de componentes prontos com novas soluções algorítmicas permitirá implementar o SpikingBrain com eficiência em MQL5 e avaliar sua eficiência.
Começaremos pela construção de um algoritmo relativamente simples, que converte o sinal contínuo de um neurônio convencional em um valor discreto ternário {-1, 0, 1}. Essa abordagem reproduz a ideia básica da ativação por disparos: o neurônio permanece inativo enquanto o potencial não atinge um limiar crítico e só então emite um sinal positivo ou negativo. Para implementar esse algoritmo, criaremos um novo kernel no programa OpenCL.
A lógica de funcionamento do kernel é simples e intuitiva. Primeiro, verificamos se o valor de entrada é válido e não corresponde a NaN nem a infinito. Quando o sinal está ausente ou é pequeno demais em relação ao limiar, o neurônio permanece em estado de repouso e recebe o valor 0.
__kernel void FloatToSpike(__global const float* values, __global const float* levels, __global float* outputs ) { const size_t id = get_global_id(0); float val = IsNaNOrInf(values[id], 0.0f); if(val == 0.0f) outputs[id] = 0.0f; else { const float lev = IsNaNOrInf(levels[id], 0.0f); if(fabs(val) < lev) outputs[id] = 0.0f; else outputs[id] = (float)sign(val); } }
Quando o valor absoluto ultrapassa o limiar, o neurônio emite um disparo de acordo com a direção da variação: +1 para um impulso positivo e -1 para um impulso negativo.
Essa abordagem permite simular o princípio fundamental do processamento por disparos: reagir apenas a eventos relevantes. A conversão para {-1, 0, 1} filtra movimentos sem importância e concentra a análise nos eventos decisivos, assim como um trader reage apenas quando o preço cruza um nível importante.
No entanto, por trás da aparente simplicidade do algoritmo de propagação para frente, existe uma tarefa nada trivial: distribuir o gradiente de erro necessário ao treinamento do modelo. A principal questão é determinar quando e como o gradiente deve ser propagado para o sinal original do neurônio. Caso essa propagação seja limitada apenas aos neurônios ativos, um grande número de neurônios pode acabar desativado, interrompendo efetivamente o treinamento, interrompendo efetivamente o treinamento. O gradiente simplesmente deixa de passar, e o modelo perde a capacidade de se adaptar.
A dificuldade aumenta com o uso do sinal ternário {-1, 0, 1}. Durante o treinamento, inevitavelmente será necessário alterar a direção da ativação do neurônio, passando de positiva para negativa ou vice-versa e atravessando, nesse processo, a faixa de inatividade. Caso o gradiente seja bloqueado nesse intervalo, o neurônio fica paralisado e perde a capacidade de aprender.
Diante disso, adotamos uma decisão fundamental: o gradiente do erro deve ser propagado continuamente, independentemente do estado atual do neurônio. Essa abordagem garante a atualização contínua dos parâmetros, evita a interrupção do treinamento e preserva a capacidade de adaptação do modelo, mesmo quando a maior parte dos neurônios permanece temporariamente inativa. Esse é um passo essencial para garantir a eficiência do processamento por disparos com sinais discretos e permitir que o modelo seja treinado de forma estável com fluxos de dados financeiros.
O segundo aspecto importante diz respeito ao limiar de disparo dos neurônios. Como observam os autores do framework SpikingBrain, um limiar elevado faz com que os sinais sejam gerados com pouca frequência. Com isso, uma parcela significativa das informações úteis passa despercebida pelo modelo. Por outro lado, um limiar baixo aumenta a sensibilidade dos neurônios, mas também faz com que reajam ao ruído, gerando falsos sinais.
Portanto, a melhor solução é permitir que o próprio modelo aprenda os limiares de disparo de cada neurônio. Nesse caso, surge uma característica interessante: os gradientes do erro referentes ao sinal e ao limiar de disparo apontam em direções opostas. Para intensificar a resposta do neurônio a eventos relevantes, é necessário reduzir o limiar, para que o sinal ultrapasse o limiar com mais facilidade. Quando o objetivo é suprimir oscilações ruidosas, o limiar deve ser elevado para reduzir os falsos disparos.
Assim, o aprendizado dos valores de limiar exige um equilíbrio delicado. O modelo precisa filtrar o ruído sem perder a sensibilidade aos principais eventos do mercado. Esse mecanismo torna os neurônios de disparo adaptativos e permite que se concentrem nas oscilações de preço realmente relevantes, assim como um trader experiente, que sabe quando reagir e quando aguardar uma confirmação.
Transferimos a implementação dessa abordagem para o kernel do programa OpenCL, criando um algoritmo responsável por processar os gradientes de erro associados aos sinais dos neurônios e aos respectivos valores de limiar.
__kernel void FloatToSpikeGrad(__global const float* values, __global float* values_gr, __global float* levels_gr, __global const float* gradients ) { const size_t id = get_global_id(0); const float grad = IsNaNOrInf(gradients[id], 0.0f); values_gr[id] = grad; if(fabs(grad) > 0.0f) { float val = IsNaNOrInf(values[id], 0.0f); levels_gr[id] = (float)(-sign(val) * grad); } else levels_gr[id] = 0.0f; }
A lógica de funcionamento do kernel reflete uma característica fundamental do treinamento de neurônios com limiar. O gradiente de erro é sempre propagado para o sinal original do neurônio por meio do array values_gr. Já o gradiente referente ao valor de limiar do neurônio é gerado com sinal algébrico oposto ao do sinal do neurônio. Para intensificar o disparo do neurônio diante de um evento relevante, o limiar é reduzido. Para suprimir o ruído, ele é elevado.
Para implementar essa lógica no programa principal, criamos uma nova camada CNeuronSpikeConv. Ela herda a funcionalidade básica dos objetos de camadas totalmente conectadas e permite combinar a convolução clássica com a geração de disparos em um único módulo, responsável por produzir impulsos discretos para o processamento posterior.
class CNeuronSpikeConv : public CNeuronBaseOCL { protected: CNeuronConvOCL cConv; CParams cLevels; //--- virtual bool FloatToSpike(void); virtual bool FloatToSpikeGrad(void); //--- virtual bool feedForward(CNeuronBaseOCL *NeuronOCL) override; virtual bool updateInputWeights(CNeuronBaseOCL *NeuronOCL) override; virtual bool calcInputGradients(CNeuronBaseOCL *NeuronOCL) override; public: CNeuronSpikeConv(void) {}; ~CNeuronSpikeConv(void) {}; //--- virtual bool Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint window, uint step, uint window_out, uint units_count, uint variables, ENUM_OPTIMIZATION optimization_type, uint batch); //--- virtual CBufferFloat* GetWeightsConv(void) { return cConv.GetWeightsConv(); } virtual int Type(void) override const { return defNeuronSpikeConv; } //--- methods for working with files virtual bool Save(int const file_handle) override; virtual bool Load(int const file_handle) override; virtual void SetOpenCL(COpenCLMy *obj) override; //--- virtual bool WeightsUpdate(CNeuronBaseOCL *source, float tau) override; virtual uint GetFilters(void) const { return cConv.GetFilters(); } virtual uint GetVariables(void) const { return cConv.GetVariables(); } virtual uint GetUnits(void) const { return cConv.GetUnits(); } };
A classe contém vários componentes fundamentais. O objeto cConv executa as operações de convolução dos sinais, enquanto cLevels aprende e armazena os valores de limiar de cada neurônio. A classe também define os métodos FloatToSpike e FloatToSpikeGrad, que funcionam como wrappers dos kernels de mesmo nome.
A inicialização do novo objeto é realizada no método Init, que configura sequencialmente todos os principais componentes da camada.
bool CNeuronSpikeConv::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint window, uint step, uint window_out, uint units_count, uint variables, ENUM_OPTIMIZATION optimization_type, uint batch) { if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, window_out * units_count * variables, optimization_type, batch)) return false;
Primeiro, é chamado o método de inicialização do objeto pai, no qual são criadas as interfaces básicas herdadas.
Em seguida, é inicializado o módulo convolucional cConv, que recebe os parâmetros da janela, do passo, da quantidade de elementos e das variáveis. A função de ativação TANH é definida imediatamente para esse módulo, garantindo o escalonamento suave do sinal de saída dentro do intervalo de valores esperado.
if(!cConv.Init(0, 0, OpenCL, window, step, window_out, units_count, variables, optimization, iBatch)) return false; cConv.SetActivationFunction(TANH);
Depois, é configurado o componente de limiares cLevels, também com suporte à otimização e com a função de ativação SIGMOID. Uma etapa importante consiste em preencher os pesos de cLevels com o valor constante -10. Isso garante um estado inicial adequado dos limiares antes do treinamento, mantendo-os próximos de zero e permitindo que os neurônios respondam imediatamente a eventos relevantes, sem serem bloqueados por um limiar elevado.
if(!cLevels.Init(0, 1, OpenCL, Neurons(), optimization, iBatch)) return false; cLevels.SetActivationFunction(SIGMOID); CBufferFloat* temp = cLevels.getWeights(); if(!temp) return false; if(!temp.Fill(-10)) return false; //--- return true; }
Como resultado, o método Init coordena a inicialização de todos os componentes da camada e cria um módulo pronto para executar simultaneamente a convolução e gerar impulsos de disparo. Essa integração garante a operação coordenada da camada durante o processamento de dados financeiros, permitindo que os neurônios reajam apenas a oscilações relevantes e filtrem o ruído.
O método feedForward realiza a propagação para frente do sinal pela camada CNeuronSpikeConv. Primeiro, é chamado o método de mesmo nome do módulo convolucional cConv, que processa os dados de entrada e gera o sinal resultante da convolução.
bool CNeuronSpikeConv::feedForward(CNeuronBaseOCL *NeuronOCL) { if(!cConv.FeedForward(NeuronOCL)) return false; if(bTrain) if(!cLevels.FeedForward()) return false; //--- return FloatToSpike(); }
Quando a camada opera no modo de treinamento (bTrain==true), também é executada a propagação para frente do componente de geração de limiares cLevels, garantindo a adaptação adequada do limiar de cada neurônio.
A etapa final consiste em chamar a função FloatToSpike, que converte os valores obtidos em disparos discretos.
Como podemos observar, o algoritmo de propagação para frente é bastante simples e não dificulta a distribuição dos gradientes. A atualização dos parâmetros do modelo é realizada pelos componentes internos, o que preserva a clareza da arquitetura e simplifica o treinamento. Por isso, deixaremos os métodos de propagação reversa para que o leitor os examine por conta própria. O código completo da classe e de todos os seus métodos está disponível no anexo, permitindo examinar em detalhes a implementação e a integração dos neurônios de disparo.
Avançamos bastante hoje, e chegou o momento de fazer uma pausa para assimilar as ideias apresentadas. É importante dar tempo para que todas essas informações se organizem e os detalhes se consolidem na memória. No próximo artigo, retomaremos o desenvolvimento, continuaremos investigando os modelos neurais de disparos e mostraremos como esses algoritmos podem ser aplicados a fluxos financeiros reais, transformando a teoria em sinais práticos de trading.
Conclusão
Neste artigo, analisamos os fundamentos teóricos do framework SpikingBrain. Sua principal vantagem está na natureza orientada a eventos. Os neurônios são ativados apenas quando o limiar é atingido, o que reduz significativamente a probabilidade de falsos disparos e melhora a qualidade dos sinais. Ao contrário de arquiteturas clássicas como o Transformer, o framework permite preservar informações essenciais sobre movimentos relevantes do mercado sem sobrecarregar o sistema com um volume desnecessário de dados.
Além disso, o uso de limiares adaptativos e a possibilidade de integrar módulos pré-treinados conferem flexibilidade e escalabilidade ao modelo. A arquitetura de disparos reduz naturalmente o consumo de energia e de recursos computacionais, tornando-se especialmente atraente para tarefas de trading algorítmico e análise de grandes volumes de dados em tempo real.
Referências
Programas usados no artigo
| # | Nome | Tipo | Descrição |
|---|---|---|---|
| 1 | Study.mq5 | Expert Advisor | EA de treinamento offline de modelos |
| 2 | StudyOnline.mq5 | Expert Advisor | EA de treinamento online de modelos |
| 3 | Test.mq5 | Expert Advisor | EA para teste do modelo |
| 4 | Trajectory.mqh | Biblioteca de classes | Estrutura de descrição do estado do sistema e da arquitetura dos modelos |
| 5 | NeuroNet.mqh | Biblioteca de classes | Biblioteca de classes para criação de rede neural |
| 6 | NeuroNet.cl | Biblioteca | Biblioteca de código do programa OpenCL |
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/19709
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
Esse artigo foi escrito por um usuário do site e reflete seu ponto de vista pessoal. A MetaQuotes Ltd. não se responsabiliza pela precisão das informações apresentadas nem pelas possíveis consequências decorrentes do uso das soluções, estratégias ou recomendações descritas.
Previsão da distribuição condicional com uma MLP
Algoritmo do Bisão: Bison Algorithm (BIA)
Desenvolvendo um EA multimoeda (Parte 29): Aprimoramento do pipeline
Redes neurais em trading: sinais de negociação robustos em qualquer regime de mercado (Conclusão)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso