Atualizado em 07/08/2026
Direto ao ponto. Antes de pôr dinheiro real, rodei uma auditoria multi-agente contra o meu próprio código de risco, e ela pegou um bug que quase me fez subir um portfólio grande demais. O risco em aberto estava sendo medido num único instante por dia, às 23h59. Isso escondia o pânico intraday. Medido certo, os 60 robôs “aprovados” furavam o meu teto de risco por 574 dólares (o pior caso real era 1.274, contra os 679 que o bug mostrava). O conserto cortou o portfólio de 60 para 34 robôs.
No capítulo anterior eu mostrei a esteira, a máquina que monta o portfólio. Este é sobre a última checagem antes do deploy, a que mira justamente a própria máquina. Porque o backtest mais robusto do mundo não vale nada se a régua que mede o risco estiver errada. E a minha estava.
Auditei o meu próprio código antes de pôr dinheiro
Montei uma auditoria adversarial em camadas: sete auditores olhando dimensões diferentes do código, cada achado depois verificado por outro agente que tentava derrubá-lo, e no fim um crítico de completude perguntando o que tinha ficado de fora. Foram 21 agentes, mais de um milhão de tokens e mais de quatrocentas chamadas de ferramenta. Tudo com um foco só. Eu não estava caçando o bug que trava o programa. Esse é fácil, ele aparece. Estava caçando o bug perigoso de verdade: o que faz o risco parecer menor do que é. Esse não dá erro nenhum. Ele só te convence a arriscar mais do que deveria.
Isso inverte a direção de quem audita. Falha técnica que derruba o robô é chata, mas honesta, porque você percebe. A falha que subestima o risco é silenciosa e cara, porque ela passa por todos os testes que dizem “rodou” e ainda te empurra para uma posição maior. Por isso a auditoria foi desenhada para procurar exatamente na direção que machuca.
O bug: o risco em aberto medido só às 23h59
Três dimensões independentes da auditoria convergiram para o mesmo ponto. A minha rotina que somava o saldo flutuante das posições abertas só contava uma posição se ela estivesse aberta exatamente às 23h59 de cada dia. Era um retrato diário, tirado sempre no mesmo horário. E esse retrato era cego para duas coisas grandes: os 18,5% de trades que abrem e fecham no mesmo dia, que chegam a 33% nos grids, e o próprio dia em que cada trade fecha. Nada disso entrava na conta do risco.
O efeito era todo na direção ruim. Como os trades intraday e os dias de fechamento sumiam, o saldo aberto medido ficava menor do que o real, e o bug subestimava justamente a grandeza que o meu teto de risco governa. Isso me faria deployar mais robôs do que cabia. É o pior tipo de erro de medição. Ele mente para baixo no número que decide o tamanho da posição.
A prova: os 60 aprovados furavam o teto
Refiz a conta por fora. Marquei cada posição em todo dia em que ela ficava aberta, não só às 23h59. Os mesmos 60 robôs que a esteira tinha aprovado, com o número certo, davam um pior caso de 1.274 dólares, contra os 679 que o bug mostrava. O drawdown da conta sozinho pulou de 453 para 850, e o pior saldo aberto de 644 para 954. Somando, eles estouravam o teto de 700 por cerca de 574 dólares. O bug escondia perto de 595 dólares de risco. Eu estava a um passo de subir um portfólio que não cabia na conta. Com dinheiro real.
Os verificadores discordaram entre si
A parte mais rica foi quando os próprios verificadores brigaram. Faço questão de mostrar essa briga. Um deles marcou cada posição no pior preço do dia, o low ou o high, um teto bem conservador que virava o veredito de vez. Outro rebateu com um caso concreto: no crash do iene de 5 de agosto de 2024, marcar 53 posições compradas que já tinham fechado de madrugada no fundo que só veio depois é um teto falso, porque aquelas posições nunca viram aquele preço. Os dois tinham razão em parte. A verdade fina exige dado intraday de 5 ou 15 minutos, que eu ainda não tinha plugado, e sem ele o lado seguro para dinheiro real é o conservador, mesmo sabendo que ele pode exagerar um pouco. Antes pecar para o lado que protege.
O fix e o portfólio honesto: 34 robôs
O conserto foi marcar a posição em todo dia em que ela fica aberta, da abertura ao fechamento, de forma conservadora, e nos dois lugares onde o cálculo acontecia, senão o atalho de cache discordaria da conta direta. Junto entraram outros achados menores que a auditoria pegou: feriados sem preço que faziam o risco daquele dia sumir, e a trava do lote, porque o gate é linear no tamanho da posição e o lote do backtest tem que ser o mesmo do ao vivo. Travei tudo com 223 testes. Três deles novos, só para garantir que um trade intraday e o dia de fechamento agora aparecem no flutuante.
Com o número certo, o gate cortou o portfólio de 60 para 34 robôs para caber: pior caso de 689 dólares, abaixo do teto de 700, com folga. São 12 grids e 22 robôs de tendência, com 19 a 22 fatores de risco independentes, espalhados por quatro pares. Quem cortou para 34 foi a régua certa do risco. Eu não escolhi nenhum. A minha decisão ali foi simples. O conservador já serve para começar. Recuperar alguns robôs refinando a cauda do iene com dado intraday ficou na pauta. Não vale atrasar o deploy por isso.
A lição, e o próximo capítulo
A lição cabe numa frase. O drawdown que te quebra é o das posições abertas, e ele acontece dentro do dia, não às 23h59. Medir o risco em aberto num único retrato diário esconde justo o pânico intraday, que é quando o iene desaba, e esconde na direção que te faz deployar grande demais. Encadeia com o capítulo seis, em que o risco em aberto virou a restrição que manda, e com o sete, em que a auditoria adversarial pega o próprio código que você acabou de escrever, confiante de que estava certo. Com o portfólio honesto de 34 robôs na mão, finalmente chegou a hora de pôr no ar. É o assunto do próximo capítulo. Também não foi nada trivial.
Acompanhe a série para não perder. O próximo sai em poucos dias.
Perguntas frequentes
Qual era o bug do risco em aberto?
O código contava uma posição no risco em aberto só se ela estivesse aberta exatamente às 23h59 de cada dia. Isso ignorava os 18,5% de trades que abrem e fecham no mesmo dia, até 33% nos grids, e o dia de fechamento de cada um. O saldo aberto medido saía menor do que o real. É justamente a grandeza que define o tamanho seguro do portfólio.
Por que esse tipo de bug é o mais perigoso?
Porque ele não dá erro. Um bug que trava o programa você percebe na hora. Um bug que faz o risco parecer menor do que é passa por todos os testes. E ainda te convence a arriscar mais. É silencioso e caro. Por isso a auditoria foi desenhada para procurar exatamente na direção que subestima o risco.
Por que marcar no pior preço do dia é conservador, e às vezes falso?
Marcar cada posição no pior preço do dia dá um teto seguro, mas pode exagerar, porque uma posição que fechou de madrugada nunca viu o fundo que veio à tarde. A medição fina exige dado intraday de 5 ou 15 minutos. Sem ele, o lado seguro para dinheiro real é o conservador, aceitando que ele superestima um pouco em vez de subestimar.
Por que o portfólio caiu para 34 robôs?
Porque, com o risco medido certo, os 60 robôs aprovados estouravam o teto de 700 dólares por cerca de 574. O gate cortou um a um, sempre o robô de pior relação entre encher o tombo e diversificar, até o pior caso caber no teto, em 689 dólares. Ninguém escolheu o número 34. Ele saiu da régua correta do risco.
Referências
- Bailey, D. H.; Borwein, J. M.; López de Prado, M.; Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. SSRN 2308659 / Notices of the AMS. Sobre como erros de medição inflam o desempenho aparente.
- López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Sobre a fragilidade de pipelines de backtest e a necessidade de validação independente do próprio código.
- Brunnermeier, M. K.; Pedersen, L. H. (2009). Market Liquidity and Funding Liquidity. Review of Financial Studies, 22(6), 2201-2238. Por que o risco das posições abertas, e não o resultado fechado, governa a margem.
- Diário de um Portfólio de Robôs (18): O Recorde da Era, e a Conta que Ainda Está Abaixo de Onde Começou
- Diário de um Portfólio de Robôs (17): O Saldo a 16 Dias do Veredito, e o Tombo que eu Anotei Menor do que Foi
- 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 (15): O Teste de Dois Meses Rodou Sete Dias Sem Ninguém Medir a Nota
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
