Direto ao ponto
Peguei os robôs com melhor desempenho no histórico recente e rodei numa era que eles nunca tinham visto. O portfólio perdeu cerca de 1.690 dólares e ficou no vermelho em 3 dos 5 anos. E 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. Selecionar pelo desempenho passado teve valor out-of-sample negativo.
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. Parecia ótimo. Antes de pôr capital, faltava um teste, e 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. Os 62 robôs foram gerados e otimizados sobre o período de 2024 a 2026. Então peguei esses mesmos 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.
O resultado ano a ano veio assim:
| 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, e três dos cinco anos negativos. Não é acidente de um punhado de operações, é uma sentença sobre dezenas de milhares de decisões. O Ret/CDaR, que dentro da janela recente era altíssimo, virou levemente negativo. O portfólio “ótimo” não tinha vantagem nenhuma fora do próprio quintal.
Não foi o prejuízo que me incomodou. Foi o que ele significava. O número bonito que eu tinha não era vantagem. Era memória do regime recente, e regime de mercado não é promessa, é fase.
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 ele 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 |
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 ativamente piorou o portfólio. Não é um caso isolado meu: 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. Eu só bati de novo na mesma parede, agora com os meus robôs.
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, e é por isso que eu paro de escolher e passo a usar todos.
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, não do mercado. 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 ainda é uma escolha dentro de um conjunto que, no fundo, aposta quase tudo na mesma direção. Limpa a redundância, não cria diversidade.
- Sortear 15 ao acaso (12,9) parece burrice, mas tem uma virtude escondida: não tem viés de seleção. O sorteio não tenta adivinhar quem é bom, então não cai na armadilha de premiar o artefato. 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 coração 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. 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 da amostra em vez de corrigir. 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
Não usei retorno puro nem Sharpe para rankear. Usei retorno sobre CDaR, o Conditional Drawdown at Risk. Antes da fórmula, vale dizer por que não fui pelas 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, mas troca um defeito por outro: ele é um único ponto, o pior instante de toda a série. Um número que depende de um dia é refém da sorte daquele dia, e não serve para rankear com confiança.
O CDaR fica no ponto certo entre os dois. Primeiro defino o drawdown da conta no instante t como a distância até o topo histórico:
D_t = \max_{s \le t} E_s - E_tAqui 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]}\,duEm palavras, eu pego só os piores momentos da conta, por exemplo os 5% piores, e tiro a média deles. A diferença para o drawdown máximo é que não dependo de um único recorde, dependo da cauda inteira, o que torna a régua estável. A diferença para o Sharpe é que eu conto só o lado que machuca, a queda, e ignoro a oscilação saudável para cima. 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 não medi a tabela com uma única divisão 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 os números da tabela são medianas sobre muitas dobras, e não 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: 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. 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, e passar num não diz nada sobre o outro.
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. Eu não estou pescando vantagem, estou pescando o artefato que melhor casou com o regime recente. E artefato não viaja para a era seguinte. Robô de setup raramente tem vantagem permanente. Ele tem vantagem condicionada a um regime, e essa vantagem some quando o regime vira. Combinar robôs de forma robusta protege o portfólio, mas não fabrica uma vantagem que não existe.
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. Mas isso me empurrou para uma pergunta bem mais incômoda, que eu vinha evitando. 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. O resultado foi um mapa dos caminhos que não levam a lugar nenhum, e é 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. 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, não com o 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. Escolhê-los concentra o portfólio no artefato que não se repete. Por isso o 1/N, que usa todos com peso igual, tende a vencer a seleção fina fora da amostra.
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. Diferente do Sharpe, que pune oscilação, o CDaR pune justamente o que quebra um trader: cair fundo e demorar a recuperar. Por isso eu ranqueio por retorno sobre CDaR.
Então backtest não serve para nada?
Serve, mas para a função certa. O backtest e o gauntlet de robustez são ótimos para eliminar lixo, o robô que claramente não sobrevive. Eles 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.
