Direto ao ponto. O teste de dois meses que decide se este portfólio vai para dinheiro real rodava havia sete dias sem ninguém gravar o número que dá a nota. Descobri por acidente, checando um susto com ordem solta depois de uma queda de internet, e o painel mostrava 0,00 de rebaixamento porque a equity estava no topo naquele minuto. Reconstruído dia a dia, o pior tombo em aberto da era foi de 29,12 dólares e o da equity total, 62,73, os dois verdes contra o teto de 700. E o alerta vermelho que mandava tirar um robô era falso.
Um portfólio em conta demo só serve para alguma coisa se, no fim do prazo, existir um número para comparar com a régua combinada antes de começar. O meu prazo é de dois meses, o veredito cai em meados de setembro e, sete dias depois da largada, a régua existia e a conta rodava. Ninguém gravava o número.
A nota desse teste é o pior tombo das posições abertas, aquele do capítulo seis, e tirei o retorno da régua de propósito, porque dois meses dizem quase nada sobre retorno e dizem bastante sobre risco. E o tombo em aberto é a única medida do projeto que não dá para recuperar depois: o que já fechou eu remonto do registro de negócios quando quiser, enquanto o flutuante das posições vivas a plataforma informa só neste instante.
O susto era com ordem solta
Na noite de 20 de julho fiquei sem internet e reiniciei o computador, e no dia seguinte abri o painel, vi dois alertas vermelhos mandando retirar um robô e pedi uma checagem geral, com medo de ordem solta pendurada em algum canto. A carteira estava limpa.
Nas oito reconexões daquela noite o servidor da corretora respondeu sempre a mesma coisa: 40 posições e 2 ordens, e o número nunca mudou, então nenhuma ordem duplicada existiu do lado de lá. Nenhuma posição nasceu na janela da queda, entre 19h49 e 20h44. Das 46 posições abertas, as 46 tinham origem registrada como robô, todas com lote 0,01 e nenhuma com identificador fora da carteira, e as 19 sem stop loss eram todas de grid, que opera a cesta por resultado agregado e dispensa stop por robô. Fim do susto.
O teste rodava sem instrumento
Só que a checagem achou outra coisa, bem pior, sem relação nenhuma com a queda de internet: o teste demo é julgado por bandas que registrei antes de começar, verde até 700 dólares de tombo, retirada acima de 900 sustentado, parede em torno de 1.200. A nota do teste é o tombo.
E o tombo não estava sendo gravado. A leitura ao vivo do painel devolve o rebaixamento do instante em que alguém abre a tela, então com a equity no topo ela mostra 0,00, que foi o que apareceu naquela manhã. O arquivo histórico grava uma linha por dia, sempre às 19h30, sem coluna de drawdown. Duas fontes, nenhum registro do pior momento.
Um tombo de 850 dólares às três da manhã que se recuperasse às oito não deixaria rastro nas duas fontes, e seria justamente o evento mais importante dos dois meses, o que diria que este portfólio encosta em 850 antes de respirar. Em setembro eu não teria número para comparar com a banda. E a assimetria é o que torna isso urgente: o tombo do que já fechou eu remonto quando quiser, porque cada negócio ficou gravado com preço e horário, enquanto o disjuntor de 700 dólares governa o flutuante das posições vivas, do qual a plataforma informa só o valor deste instante. A única medida que decide o teste era a única não recuperável.
Reconstruir, em vez de amostrar
O instinto de engenheiro aqui é gravar de minuto em minuto. Cortei na hora. Precisa rodar a cada seis horas, e dá para exigir tão pouco porque a solução certa torna a frequência irrelevante.
A rotina nova reconstrói. Ela pega todos os negócios da era, os fechados pareados pelo identificador da posição e os que ainda estão abertos, e remarca cada dia contra as barras de cinco minutos guardadas pelo terminal, com a mesma régua oficial que mediu o pior caso do portfólio na hora do deploy. Como cada execução remede a era inteira do zero, quatro execuções por dia entregam o mesmo número que uma a cada cinco minutos. A primeira execução recuperou os sete dias perdidos.
Por que reconstruir e não amostrar? Porque amostrar cria dependência do relógio: se o registrador cair, ou se a máquina reiniciar como reiniciou naquela noite, o pedaço perdido some para sempre. Reconstruir depende só do histórico de preços existir. E como o terminal descarta barras antigas depois de um limite de cem mil, a rotina grava também um log que só cresce, para o número sobreviver ao dia em que essas barras expirarem.
Com o instrumento no ar, o número apareceu. Na era de 54 robôs, em seis dias úteis, o pior tombo em aberto foi de 29,12 dólares, no dia 20 de julho, e o pior rebaixamento da equity total foi de 62,73, no dia 16. Os dois verdes contra o teto de 700. Gravo as duas medidas de propósito, porque são grandezas diferentes e é fácil confundir uma com a outra, e o 0,00 do painel dizia só que naquele minuto a conta estava no topo.
O alerta vermelho era falso
Volto aos dois alertas. O painel mandava retirar um robô de tendência alegando 5,59 vezes a frequência de trades do backtest dele, acima do corte de 3,0 que eu mesmo configurei, enquanto a reconciliação, rodada no mesmo minuto sobre os mesmos negócios, dizia 3,2 vezes e classificava o robô como normal. Certos na aritmética, errados na conclusão.
O primeiro erro era o numerador. O painel contava fechamentos. Um fechamento de posição aberta antes da âncora da era não representa decisão desta era, e o robô acusado tinha três fechamentos com apenas duas entradas, porque uma das posições vinha do dia 13. Isso sozinho empurrava a razão de 3,7 para 5,59.
O segundo erro não se conserta contando melhor. A régua julgava uma razão com mínimo de três trades, e esse robô espera 0,107 trade por dia útil, um a cada nove dias, o que dá 0,54 trade esperado na era inteira. Essa frequência esperada sai do backtest que aprovou o robô, portanto é medida dentro da amostra. Dois trades onde se esperava meio já são quatro vezes.
E o alarme roda sobre a carteira inteira. Ele mede os 54 todo dia. A 5% de significância, 2,7 alarmes falsos por rodada são o esperado por puro acaso. O robô acusado dava p-valor de 0,035 sozinho, o que parece forte até você fazer a conta do conjunto: 1 - (1 - 0.035)^{54} \approx 0.85. O 0,035 é o p-valor de um robô, o 54 é quantos o alarme mede junto e o 0,85 é a chance de aparecer pelo menos um alarme desses com todos saudáveis. Pelo controle de falsas descobertas de Benjamini e Hochberg a 5%, nenhum achado ficava de pé.
O conserto tem duas partes. A contagem passou a usar as entradas da era, e o alarme agora só acusa quando a razão estoura a banda e o p-valor fica abaixo de 0,01. Depois disso o painel ficou com zero alerta. Para calibrar uma retirada de verdade: a que executei em 9 de julho estava em 10,9 vezes, com 1,50 trade por dia contra 0,14 esperado. Outra ordem de grandeza.
Razão alta não é evidência quando o esperado é menos de um evento. A régua que escrevi para pegar bug de parâmetro ou de símbolo estava, na prática, sorteando um robô saudável a cada duas semanas, e Harvey, Liu e Zhu mediram o mesmo efeito na literatura de fatores, onde centenas de testes simultâneos produzem descobertas que não sobrevivem à correção de multiplicidade.
O robô que nunca ligou
A mesma varredura achou o contrário do falso positivo. Um robô de tendência registrava erro de indicador seguido de recusa de abrir posição em 22 de 22 sinais desde 13 de julho. Ele nunca ligou. O monitor lia isso como robô sem trades, e essa é a parte cara: o veredito de setembro sairia calculado sobre 53 robôs achando que eram 54.
Não era o indicador nem o par. Quinze robôs do portfólio usam indicadores de perfil de mercado e operam normalmente, um deles no mesmo par e com o mesmo indicador, e a diferença estava num modo de cálculo: o robô quebrado era o único configurado num dos modos, enquanto todos os que funcionam usam outro. Foram 22 sinais e 22 recusas.
Consertar exigiria mexer no indicador ou nos parâmetros da estratégia, e qualquer uma das duas coisas descaracteriza o robô frente ao backtest que o aprovou, ou seja, um robô alterado depois da aprovação perde a validação que o colocou na carteira. Então ele sai por inviabilidade material, o mesmo tratamento que dei a uma estratégia que o gerador não conseguia exportar. Segunda vez no projeto.
A troca aconteceu no mesmo dia. Entrou a primeira estratégia apta da mesma célula, mesmo comportamento, mesmo par e mesma direção, com o executável já pronto na fila pré-compilada, e conferi de propósito que ela usa o modo de cálculo que funciona. Com a troca, o pior caso do conjunto ficou em 685,83 dólares, abaixo do teto de 700, e 5,17 melhor que os 691 de antes.
Quatro robôs abriram a mesma venda
O último achado do dia não gerou ação nenhuma no portfólio vivo, e foi o que mais mudou a esteira depois: das 46 posições abertas, 20 estavam em USDJPY, quase todas vendidas com o par subindo, e o grid acionou o primeiro hedge da era. Quatro grids diferentes tinham aberto a mesma venda, no mesmo minuto, no mesmo preço de 162,364, em 16 de julho.
A primeira pergunta foi se estavam todos no padrão de fábrica. Nenhum deles estava. Os 15 grids do portfólio têm parâmetros genuinamente distintos, e os quatro acusados diferem entre si em 4 a 7 dos 13 ajustes. O problema é mais sutil que cópia.
Fui ler o código do robô. O sinal de entrada é função de apenas três ajustes: o tempo gráfico, quantos candles consecutivos na mesma direção disparam a ordem e se a entrada vai a favor ou contra esse movimento. Todo o resto, do período do indicador de volatilidade ao espaçamento das ordens da cesta e aos limites globais de resultado, governa apenas a gestão depois que a posição já existe. Os quatro compartilham a mesma trinca. Por construção eles abrem sempre a mesma direção, na mesma barra, no mesmo instante. Isso é identidade matemática.
A contagem honesta fica assim: 15 grids produzem 11 sinais de entrada distintos, e o gargalo está no iene, onde 7 grids carregam só 3 entradas. No instante da entrada, esses quatro são um robô só com quatro vezes o tamanho. Eles só se separam depois.
A estação da esteira que corta clones compara histórico de resultado, e é aí que ela cega: a gestão diferente faz o resultado divergir o bastante para os quatro parecerem independentes na correlação. O número efetivo de fatores de risco independentes, que eu calculo justamente da correlação dos resultados, herda essa cegueira e conta quatro onde existe um, e Meucci descreve a medida junto com a condição de independência que ela pressupõe.
Isso virou regra da esteira no mesmo dia. Nasceu uma estação de de-clone por entrada: de dois grids do mesmo par que compartilham a trinca de sinal, ela mantém o mais ativo e corta o resto. Estratégias compiladas são imunes por construção. Entraram 27 testes novos, e a suíte da esteira ficou em 391 testes verdes.
No gate do deploy a mudança foi menor, de propósito: a conferência passou a avisar quais grids abrem juntos, sem barrar a montagem. Por que avisar e não barrar? Porque a era que está no ar nasceu antes da regra e carrega quatro robôs redundantes conhecidos, então barrar travaria toda troca legítima dela até o fim do teste, inclusive a do robô quebrado que eu tinha acabado de trocar. O corte acontece na próxima montagem. Medido no pool inteiro: 26 grids dessa família geram 18 assinaturas de entrada distintas, com 8 robôs redundantes que a esteira antiga deixaria passar.
No portfólio vivo não mexi em nada. A doutrina proíbe trocar robô por desempenho recente, e os quatro grids do iene fizeram exatamente o que estavam configurados para fazer.
O que ainda não sei
A era que vale hoje tem 54 robôs, foi re-ancorada em 14 de julho de 2026 e partiu de um saldo-base de 9.866,82 dólares na conta demo. O veredito do teste cai em meados de setembro, em torno do dia 14, quando eu comparo o pior tombo medido com as bandas registradas antes de começar. Essa data não promete resultado.
O que mudou nesses dias é que agora existe instrumento. O número que dá a nota está sendo reconstruído quatro vezes por dia, sobrevive a queda de energia e a reinício de máquina, e dispensa alguém estar na frente da tela na hora do tombo. Sete dias que pareciam perdidos voltaram na primeira execução.
O que eu não sei continua bem maior. Seis dias úteis medidos em verde dizem quase nada sobre dois meses, e o tombo que decide ainda não aconteceu. Não sei quanto o de-clone por entrada vai mudar a composição da próxima montagem, porque os 8 robôs redundantes que ele apontou estão no pool, e pool é matéria-prima. E um segundo robô, com o mesmo código de erro de forma intermitente, fica em observação sem ação até o teste acabar.
O próximo capítulo é o balanço do primeiro mês deste portfólio, com os números que a reconstrução gravou dia a dia, e vou publicar o que aparecer lá, incluindo o tombo que eu não gostaria de ver. Este projeto foi construído para eu não me enganar, e seria estranho começar a dourar justo agora que existe medida. O teste está correndo, o instrumento existe e a data do veredito está marcada. O resultado eu conto quando ele chegar, verde ou vermelho.
Perguntas frequentes
Por que reconstruir o drawdown em aberto?
Porque a plataforma informa só o flutuante do instante: se ninguém estiver medindo às três da manhã, o pior momento da noite some, e reconstruir os negócios da era contra as barras de cinco minutos guardadas pelo terminal recupera o pior tombo de qualquer dia passado. Na primeira execução voltaram sete dias.
Por que o alarme acusa robô saudável?
Porque ele julga uma razão. Um robô que espera 0,54 trade em toda a era vira uma razão enorme com dois trades reais, e quando 54 robôs são medidos juntos, 2,7 alarmes falsos por rodada a 5% de significância já são o esperado por acaso.
O que é inviabilidade material?
É quando o robô deixa de operar como foi aprovado e o conserto exigiria alterar o indicador ou os parâmetros da estratégia, sendo que qualquer alteração depois da aprovação descaracteriza o robô frente ao backtest que o validou. O robô sai e entra o próximo apto da mesma célula.
Como quatro robôs abrem a mesma posição?
Porque só três ajustes definem o sinal de entrada desse grid: o tempo gráfico, quantos candles consecutivos disparam a ordem e a direção da entrada, e todos os outros governam a gestão da cesta depois que a posição existe. A correlação de resultado não enxerga isso, porque a gestão separa o resultado depois da entrada.
Referências
- Benjamini, Y.; Hochberg, Y. (1995). Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing. Journal of the Royal Statistical Society B, 57(1), 289-300. O controle que apliquei aos 54 robôs medidos juntos.
- Harvey, C. R.; Liu, Y.; Zhu, H. (2016). …and the Cross-Section of Expected Returns. SSRN 2249314 / Review of Financial Studies, 29(1), 5-68. Centenas de testes simultâneos produzem achados que não sobrevivem à correção de multiplicidade.
- Meucci, A. (2009). Managing Diversification. SSRN 1358533 / Risk, 22(5), 74-79. A medida do número efetivo de fatores de risco independentes.
- Diário de um Portfólio de Robôs (10): A Auditoria que Achou 14 Bugs com o Portfólio Já no Ar
- Diário de um Portfólio de Robôs (9): No Ar em Simulado, e Por Que a Validação Operacional é Metade do Trabalho
- Diário de um Portfólio de Robôs (16): O Payroll Levou 92 Dólares, e 73 Estavam em Aberto
- Diário de um Portfólio de Robôs (14): Dez Robôs Perderam Juntos, e a Régua Dizia que Eram Independentes
Presente para Leitores: Robô de Gradiente Linear Gratuito
Estou liberando o acesso ao meu setup pessoal de Gradiente Linear sem custo nenhum. É só clicar e me pedir o arquivo.
Quem escreve: Flávio Araújo
Trader algorítmico há mais de 13 anos, MBA em Mercado de Capitais e Derivativos. Mantém um laboratório próprio que já rodou mais de 20 milhões de backtests e analisou mais de 20 mil estratégias, e opera um portfólio de robôs acompanhado publicamente no blog. LinkedIn · Instagram · YouTube
