Diário de um Portfólio de Robôs (8): A Auditoria que Escondia Risco e Cortou o Portfólio de 60 para 34

Antes do deploy, uma auditoria multi-agente pegou um bug no meu próprio código: o risco em aberto medido só às 23h59 escondia o pânico intraday. Medido certo, os 60 robôs furavam o teto, e o portfólio caiu para 34.

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, o que 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, não 679). 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, 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 apostar mais do que deveria.

É uma inversão importante 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. Tudo isso simplesmente não entrava na conta do risco.

Linha do dia: trades intraday em vermelho que somem do retrato de risco tirado as 23h59

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. Ou seja, o bug subestimava justamente a grandeza que o meu teto de risco governa, e a subestimava de um jeito que me faria deployar mais robôs do que cabia. É o pior tipo de erro de medição, o que mente para baixo no número que decide o tamanho da aposta.

A prova: os 60 aprovados furavam o teto

Para confirmar, refiz a conta de forma independente, marcando as posições em todo dia que ficavam abertas, 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, não 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, com dinheiro real, um portfólio que não cabia na conta.

Pior caso do portfolio: 679 com o bug contra 1.274 medido certo, furando o teto de 700

Os verificadores discordaram entre si

A parte mais rica foi quando os próprios verificadores brigaram, e é uma honestidade que eu faço questão de mostrar. 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. Para dinheiro real, o lado seguro é 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 apostas independentes, espalhados por quatro pares. Não foi escolha minha cortar para 34, foi a régua certa do risco que decidiu. E 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, mas não vale atrasar o deploy por isso.

Corte de 60 para 34 robos: 22 de tendencia e 12 de reversao, binding 689 abaixo de 700

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, e ele 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 resultado era um saldo aberto medido menor do que o real, justo 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 apostar mais. É silencioso e caro, e 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. O número 34 não foi escolhido, ele emergiu 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.

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.

Quero meu Robô Gratuito
🔒 Acesso Direto no WhatsApp
⚠️ Aviso de risco: O conteúdo do Invista Já é educacional e informativo sobre algotrading e estratégias quantitativas e não constitui recomendação ou consultoria de investimento, nem oferta ou solicitação de compra ou venda de qualquer ativo. Operações no mercado financeiro envolvem risco de perda, inclusive do capital investido, e resultados passados não garantem resultados futuros. Avalie seu perfil de risco e, se necessário, consulte um profissional certificado antes de investir.

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

Flavio Araújo
Flavio Araújo

Engenheiro com MBA em Mercado de Capitais e Derivativos. Atua há mais de 10 anos no Mercado Financeiro, com 6 anos dedicados ao Algotrading e estratégias quantitativas. Especialista em validação de robustez e automação de investimentos.

Artigos: 164