Diário de um Portfólio de Robôs (2): O Portfólio Ótimo que Afundou numa Era que Nunca Viu

Peguei o portfólio com o melhor número dentro da janela de teste e rodei numa era que ele nunca viu. Afundou. E selecionar os melhores robôs pelo passado foi pior do que usar todos.

Atualizado em 07/08/2026

Direto ao ponto. Peguei os robôs com melhor desempenho no histórico recente e rodei numa era que eles nunca tinham visto, e o portfólio perdeu cerca de 1.690 dólares, com 3 dos 5 anos no vermelho. Quando comparei formas de selecionar lado a lado, usar todos os robôs com peso igual rendeu Ret/CDaR de 23,4 fora da amostra, contra 5,2 de escolher os 15 melhores pelo passado. A seleção fina custou dinheiro.

No capítulo anterior eu falei que o foco do projeto é montar um portfólio e que a primeira régua é bater a divisão igual de capital, o 1/N. Aqui começa a parte que dói. Eu tinha em mãos um portfólio com o melhor número possível dentro da janela de teste, montado a partir de 62 robôs gerados sobre o histórico recente, e ele parecia ótimo. Faltava um teste. Era justamente o que eu vinha adiando.

O teste que eu estava com medo de rodar

O teste é simples de descrever e desconfortável de encarar, e os 62 robôs que entraram nele foram gerados e otimizados sobre o período de 2024 a 2026. Então peguei esses mesmos 62 robôs com peso igual e rodei tick a tick numa era que eles nunca tinham visto, de 2014 a 2018, sem nenhum custo embutido, ou seja, no melhor cenário possível para eles. É o equivalente honesto de um walk-forward levado ao extremo, com o sistema julgado num pedaço de mercado que não participou em nada da sua construção. Cinco anos que nenhum deles conhecia.

Separei o resultado ano a ano, um por linha, para enxergar se a perda estava concentrada num ano ruim ou espalhada pelo caminho inteiro.

Ano Resultado (US$) Situação
2014 +263 positivo
2015 −774 negativo
2016 −940 negativo
2017 −532 negativo
2018 +293 positivo
Total −1.690 drawdown máx. 3.334

Net de 1.690 dólares no vermelho, ao longo de cerca de 33.814 trades. Drawdown máximo de 3.334 dólares. Três dos cinco anos no negativo. Dezenas de milhares de decisões repetiram o mesmo veredito por cinco anos seguidos. O Ret/CDaR, que dentro da janela recente era altíssimo, virou levemente negativo, e o portfólio “ótimo” ficou sem vantagem nenhuma fora da janela onde nasceu.

Resultado ano a ano dos 62 robos rodados em 2014 a 2018, negativo em tres dos cinco anos

O que me incomodou foi o significado do número. Aquele Ret/CDaR alto era memória do regime recente, e regime de mercado é fase, com hora para começar e hora para acabar.

Escolher os melhores robôs foi pior do que a sorte

Aí eu fui mais fundo. Em vez de só constatar que o portfólio caiu, quis saber qual forma de montar o portfólio aguenta melhor fora da amostra. Testei quatro abordagens sobre os mesmos 62 robôs, medindo o Ret/CDaR mediano numa validação cruzada honesta, com seis dobras, cerca de 31.026 carteiras avaliadas e um bootstrap de 8.000 reamostragens. O resultado está abaixo, e vai contra a intuição de quase todo mundo que monta portfólio.

Forma de montar o portfólio Ret/CDaR fora da amostra
Todos os 62, peso igual (1/N) 23,4
Remover os redundantes por correlação 17 a 18
15 robôs sorteados ao acaso 12,9
15 melhores pelo desempenho passado 5,2
Ret sobre CDaR fora da amostra: usar todos 23,4 contra 5,2 de escolher os 15 melhores

Leia de baixo para cima. Escolher os 15 melhores robôs pelo desempenho passado deu o pior resultado fora da amostra, pegar 15 robôs no sorteio foi mais que o dobro melhor que isso, e usar todos com peso igual foi o melhor de todos, com folga. A seleção fina, aquilo que parece ser exatamente o trabalho do gestor, teve valor negativo. Ela piorou o portfólio. DeMiguel, Garlappi e Uppal (2009) já tinham mostrado que nenhum dos 14 modelos de otimização supera o 1/N de forma consistente fora da amostra, e os meus 62 robôs reproduziram o resultado deles.

Esse padrão tem nome e número na literatura de robustez: a probabilidade de overfitting do meu conjunto, medida por validação cruzada combinatória sobre os 53 robôs elegíveis (Bailey e López de Prado, 2014), deu 0,91. Em palavras, o robô que parece o melhor no histórico tem cerca de 91% de chance de não ser o melhor fora da amostra. Ranquear por backtest, nesse regime, é quase sortear. Então eu paro de escolher e uso todos.

Probabilidade de overfitting do backtest igual a 0,91, ranquear por backtest nao prediz o futuro

Por que cada abordagem deu esse número

Vale destrinchar a tabela, porque cada linha falha por um motivo diferente, e entender o motivo é o que evita repetir o erro.

  • Os 15 melhores pelo passado (5,2) concentram o portfólio justamente nos robôs que mais se ajustaram a 2024-26. São os campeões da fase. Quando a fase passa, são os primeiros a virar.
  • Remover os redundantes por correlação (17) é uma ideia boa de verdade, porque corta clones que não diversificam nada, mas continua sendo uma escolha dentro de um conjunto que concentra quase tudo na mesma direção. Limpa a redundância. A concentração fica de pé.
  • Sortear 15 ao acaso (12,9) parece burrice e tem uma virtude escondida, que é a ausência total de viés de seleção. O sorteio não tenta adivinhar quem é bom, então não cai na armadilha de premiar o artefato, e perde só por usar menos robôs que o conjunto inteiro.
  • Usar todos com peso igual (23,4) junta as duas coisas, zero viés de seleção e diversificação máxima. E tem um ponto mais fundo, que é o centro de tudo isto: o erro com que eu estimo quem é o melhor robô é tão grande que tentar usar essa estimativa destrói mais valor do que agrega.

Aqui aparece a pergunta que todo mundo faz: por que então não otimizar os pesos de cada robô, em vez de dividir igual? A resposta tem nome desde 1989. Michaud chamou a otimização de média-variância de maximizadora de erro, porque o otimizador pega as suas estimativas de retorno e risco e despeja peso nos ativos que parecem melhores, que são exatamente os que têm o maior erro de estimativa para cima. Ele amplifica o ruído. Com poucos anos de dado e dezenas de robôs, os retornos médios e a matriz de covariância vêm cheios de erro, e o 1/N, que não estima nada, sai na frente justamente por não ter o que errar.

Como eu medi isso, e por que com CDaR

Rankeei por retorno sobre CDaR, o Conditional Drawdown at Risk, e antes da fórmula vale dizer por que descartei as duas réguas mais comuns.

O Sharpe divide retorno por desvio-padrão e tem dois problemas para o meu caso. Ele pune oscilação dos dois lados, então um robô que sobe rápido demais é tratado como arriscado do mesmo jeito que um que cai, e ainda assume um mundo mais ou menos normal, quando o que me preocupa são justamente as caudas. O drawdown máximo resolve o foco, porque olha só a queda, e troca um defeito por outro: ele é um único ponto, o pior instante de toda a série. Um número assim é refém de um dia só.

O CDaR fica no ponto certo entre os dois, e a construção dele começa pelo drawdown da conta no instante t, que é a distância até o topo histórico:

D_t = \max_{s \le t} E_s - E_t

Aqui E é a equity (o saldo) e D_t é o quanto a conta está abaixo do seu maior valor já atingido. O CDaR num nível de confiança alfa é a média dos piores drawdowns dessa série:

\mathrm{CDaR}_\alpha = \frac{1}{1-\alpha}\int_{\alpha}^{1} D_{[u]}\,du

Em palavras, eu pego só os piores momentos da conta, por exemplo os 5% piores, e tiro a média deles, de forma que a régua passa a depender da cauda inteira e um único recorde deixa de mandar sozinho no número. Contra o Sharpe, a diferença é que eu conto só o lado que machuca. Só a queda. A métrica final é o retorno acumulado dividido por esse número, e foi com ela que a tabela foi medida. A referência formal é Chekhlov, Uryasev e Zabarankin (2005).

Tem ainda um detalhe de método que muda tudo. Eu medi a tabela com muitas divisões entre treino e teste, porque uma divisão só é um sorteio, e nele você pode ter tido sorte ou azar naquele recorte específico. Usei validação cruzada combinatória e purgada, que monta muitas combinações de treino e teste e remove a contaminação entre amostras vizinhas, aqueles trades colados no tempo que vazariam informação de um lado para o outro. Por isso a tabela traz medianas sobre muitas dobras, e nenhum número dela é um resultado único que eu poderia ter escolhido a dedo.

Por que o número bonito não sobreviveu

A explicação tem duas camadas, e as duas valem para qualquer pessoa que gera robô. A primeira é sobre o que o gauntlet de robustez realmente prova. Monte Carlo, perturbação de parâmetros e validação out-of-sample dentro do período atacam um inimigo só, o curve-fit grosseiro, o robô que só funciona naquela sequência exata de trades. Eles matam o lixo aleatório. Mas todos esses testes perturbam o sistema dentro da mesma era, e nenhum deles testa a virada de regime. Por isso um robô passa no gauntlet inteiro e ainda assim morre quando o mercado muda de comportamento. São dois eixos diferentes.

A segunda camada é sobre seleção. Quando eu escolho os 15 melhores pelo passado, estou escolhendo justamente os robôs que mais se ajustaram àquela fase específica de mercado, e o que eu levo para casa é o artefato que melhor casou com o regime recente. Artefato não viaja para a era seguinte. Robô de setup raramente tem vantagem permanente, e a que ele tem vem condicionada a um regime, e some junto com o regime. Combinar robôs de forma robusta protege o portfólio. A vantagem tem que existir antes.

O que isso mudou no projeto

Esse capítulo matou uma ideia que eu carregava sem questionar, a de que o trabalho era achar os melhores robôs. O dado disse o contrário. Daqui em diante o padrão honesto virou usar todos com peso igual e parar de fingir que sei escolher o vencedor pelo retrovisor. Isso me empurrou para uma pergunta pior. Se selecionar pelo regime recente é só memória, onde está a vantagem que de fato sobrevive? Foi atrás dessa resposta que eu entrei num debate longo, de várias rodadas, sobre onde mora o edge no forex, e o resultado foi um mapa dos caminhos que não levam a lugar nenhum. É sobre ele o próximo capítulo.

Acompanhe a série para não perder. O próximo sai em poucos dias.

Perguntas frequentes

O que é o teste cross-era?

É rodar um sistema construído numa época de mercado dentro de outra época completamente diferente, que não participou da sua otimização, e serve para separar vantagem real de ajuste ao regime recente. Robô que ganha no histórico onde nasceu e perde numa era anterior estava casado com aquela fase de mercado.

Por que escolher os melhores robôs piora o portfólio?

Porque os robôs com melhor desempenho passado costumam ser os que mais se ajustaram àquela fase específica de mercado, e escolhê-los concentra o portfólio no artefato que não se repete. Nos meus 62 robôs, o 1/N com peso igual mediu 23,4 fora da amostra contra 5,2 da seleção fina.

O que é CDaR e por que usar no lugar do Sharpe?

O CDaR (Conditional Drawdown at Risk) é a média dos piores drawdowns da conta, e pune só o que quebra um trader, que é cair fundo e demorar a recuperar. O Sharpe pune oscilação para os dois lados. Por isso eu ranqueio por retorno sobre CDaR.

Então backtest não serve para nada?

Serve, para a função certa. O backtest e o gauntlet de robustez eliminam bem o lixo, o robô que claramente não sobrevive, e são fracos para escolher o vencedor entre os sobreviventes. Usar o backtest para rankear e selecionar é onde mora boa parte do overfitting.

Referências

  • DeMiguel, V.; Garlappi, L.; Uppal, R. (2009). Optimal Versus Naive Diversification: How Inefficient Is the 1/N Portfolio Strategy? Review of Financial Studies, 22(5), 1915-1953.
  • Chekhlov, A.; Uryasev, S.; Zabarankin, M. (2005). Drawdown Measure in Portfolio Optimization. International Journal of Theoretical and Applied Finance, 8(1), 13-58. Definição formal do CDaR.
  • Michaud, R. O. (1989). The Markowitz Optimization Enigma: Is ‘Optimized’ Optimal? Financial Analysts Journal, 45(1), 31-42. A otimização de média-variância como maximizadora de erro de estimativa.
  • Bailey, D. H.; López de Prado, M. (2014). The Probability of Backtest Overfitting. SSRN 2326253 / Journal of Computational Finance.
  • López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Validação cruzada combinatória e purgada (CPCV), base do método de medição usado aqui.

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

Flávio Araújo
Flávio 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: 171