LançamentoAnálise · No radarHabr AI→ original

Trader transforma RAG e RandomForest em sinais BUY/SELL: 62% de acerto em 59 registros

Um desenvolvedor transformou um RAG de notícias em LLMs locais em um pipeline que emite sinais BUY/SELL/NEUTRAL para ações da Bolsa de Moscou. As notícias são vinculadas a tickers e convertidas em features diárias, enquanto um RandomForest calibrado entrega uma probabilidade e a lista de notícias que sustentam o sinal. Em 59 registros, a precisão média foi de 62%, mas o teste tem apenas 45 exemplos. O próprio autor chama a avaliação de preliminar.

Processado por IA de Habr AI; editado por Hamidun News
Trader transforma RAG e RandomForest em sinais BUY/SELL: 62% de acerto em 59 registros
Fonte: Habr AI. Colagem: Hamidun News.
Ouvir artigo
Ficha técnica e números-chave
ParâmetroDados
Fonte originalHabr AI ↗
Editor-chefe
Dado-chave #1Esportes e ocorrências policiais são descartados por um filtro antes das etapas pesadas de LLM
OllamaNUM_PARALLEL=6 e dois modelos na VRAM aceleraram o pipeline em 1,5–2 vezes
Dado-chave #3O decaimento temporal das notícias derrubou a precisão de 52% para 36%

Muita gente sabe acoplar um LLM a um feed de notícias e obter um «analista inteligente». Bem mais raro é alguém mostrar com honestidade o que acontece depois: quando não se trata de resumir notícias, mas de prever o preço. O autor de um projeto no Habr deu continuidade ao seu experimento com RAG e o levou até sinais de trading com explicações. Veja o que vale a pena aproveitar dessa história.

Um pipeline no lugar de três tarefas concorrentes

A primeira versão do sistema executava em paralelo três tarefas em segundo plano: classificação, extração de entidades e enriquecimento. Cada uma carregava seu próprio modelo na memória da GPU, e o Ollama descarregava e carregava pesos o tempo todo. Quando a base cresceu de 12 para 37 mil artigos, isso ficou caro demais.

A solução é simples: um único pipeline. O artigo passa por classificação, filtro de lixo, avaliação do impacto no mercado, NER, sumarização e embedding. Se o filtro decide que a notícia é sobre esporte ou cultura, ela é marcada como skipped, e nem mais um segundo de GPU é gasto com ela. A lição é universal: primeiro uma triagem barata, depois o modelo caro.

As configurações do Ollama também foram ajustadas à mão. O autor permitiu manter dois modelos na memória (Qwen 14B e BGE-M3), definiu paralelismo 6 e prendeu tudo a uma única Tesla P100. Com o valor 8, a memória chegava ao teto e as requisições caíam por timeout. A segunda placa não é usada de propósito: quando as camadas se espalham entre GPUs, a velocidade cai de 3 a 5 vezes por causa da transferência de dados via PCIe.

Da notícia ao sinal

Exemplo: o NER encontra «Sber» no texto. Um dicionário de sinônimos, alimentado pela API da Bolsa de Moscou, o converte no ticker SBER. Para cada dia e ticker são calculadas features: a soma das direções das notícias (+1 para positiva, −1 para negativa), o número de notícias, a volatilidade de 5 e 20 dias e o volume médio negociado. Em seguida, um RandomForest com calibração Platt scaling entrega BUY, SELL ou NEUTRAL e uma probabilidade, e a API retorna ainda a lista de notícias que influenciaram a decisão. No Streamlit, isso vira um terminal com candles e evidências expansíveis.

Um detalhe curioso: para o Alfa-Bank, que não é negociado em bolsa, foi criado um ticker fictício, ALFAMOCK. As notícias se acumulam antecipadamente e, depois do IPO, o ticker será simplesmente substituído.

Onde tudo quebra

O mais valioso do artigo é a análise das falhas. A tentativa de adicionar decaimento temporal tornou a feature fracionária (0,85 em vez de 1), e a precisão caiu de 52% para 36%. Com 55 registros, isso é apenas ruído, então a ideia foi adiada até haver mais de 200 registros.

Outro caso: o VKCO recebeu BUY com 64% de confiança em meio a notícias neutras. O modelo simplesmente aprendeu que o mercado sobe em 55% dos casos. O autor rejeitou um filtro rígido do tipo «sem pressão, logo NEUTRAL» por considerá-lo um disfarce do sintoma e planejou features de dominância, também só após acumular dados. A dívida técnica está registrada e documentada.

A validação usa o método walk-forward: a janela de treino desliza no tempo para não acertar por acaso um período «sortudo». O esquema-alvo é de 30 dias de treino e 7 de teste, mas por enquanto funciona uma versão reduzida 14/3/3. O resultado é uma precisão média de 62% (mediana de 67%) em 45 exemplos de teste.

O que fazer com isso

Não encare os 62% como uma estratégia de trading: a amostra é minúscula, comissões e slippage não foram consideradas, e o modelo pode facilmente aprender ruído. O valor do projeto está em outro lugar. É um bom modelo de arquitetura: um filtro inicial para economizar GPU, saída explicável com fontes, probabilidades calibradas e registro honesto das decisões em ADRs. Se você está montando um pipeline semelhante com modelos locais, vale adotar a abordagem de ajuste do Ollama e o hábito de medir o efeito de cada feature antes de mantê-la. O código da parte pública está aberto no GitHub.

História

Perguntas frequentes sobre a notícia

O que se sabe sobre Um pipeline no lugar de três tarefas concorrentes?

A primeira versão do sistema executava em paralelo três tarefas em segundo plano: classificação, extração de entidades e enriquecimento. Cada uma carregava seu próprio modelo na memória da GPU, e o Ollama descarregava e carregava pesos o tempo todo. Quando a base cresceu de 12 para 37 mil artigos, isso ficou caro demais. A solução é simples: um único pipeline. O artigo passa por classificação, filtro de lixo, avaliação do impacto no mercado, NER, sumarização e embedding.

O que se sabe sobre Da notícia ao sinal?

Exemplo: o NER encontra «Sber» no texto. Um dicionário de sinônimos, alimentado pela API da Bolsa de Moscou, o converte no ticker SBER. Para cada dia e ticker são calculadas features: a soma das direções das notícias (+1 para positiva, −1 para negativa), o número de notícias, a volatilidade de 5 e 20 dias e o volume médio negociado. Em seguida, um RandomForest com calibração Platt scaling entrega BUY, SELL ou NEUTRAL e uma probabilidade, e a API retorna ainda a lista de notícias que influenciaram a decisão.

Onde tudo quebra?

O mais valioso do artigo é a análise das falhas. A tentativa de adicionar decaimento temporal tornou a feature fracionária (0,85 em vez de 1), e a precisão caiu de 52% para 36%. Com 55 registros, isso é apenas ruído, então a ideia foi adiada até haver mais de 200 registros. Outro caso: o VKCO recebeu BUY com 64% de confiança em meio a notícias neutras. O modelo simplesmente aprendeu que o mercado sobe em 55% dos casos.

ZK
Zhemal Khamidun — CPO da Alpina Digital, gerente de produto do AlpinaGPT. Cria produtos de IA desde 2019. O Hamidun News é um projeto pessoal que virou um agregador em produção com mais de 6.000 leitores.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
O que você acha?
Carregando comentários…