Diário de um Portfólio de Robôs (14): Dez Robôs Perderam Juntos, e a Régua Dizia que Eram Independentes

A semana ruim estava dentro das bandas, mas os dez maiores perdedores eram do mesmo par e a régua de diversificação via correlação 0,02. A pergunta virou estação nova da esteira e trocou o portfólio de 61 para 54 robôs.

Direto ao ponto. Uma semana ruim do portfólio em simulado estava dentro de tudo o que eu tinha pré-registrado: pior tombo de 116 dólares contra uma banda de 434. Só que os dez maiores perdedores da semana eram todos do mesmo par, e a minha régua de diversificação enxergava aquele bloco como fatores de risco quase independentes, correlação 0,02. Ela media o extrato de fechamentos, e o risco morava na posição aberta. A pergunta virou estação nova da esteira, cortou 11 robôs por redundância e trocou o portfólio inteiro no mesmo dia, de 61 para 54 robôs.

No nono dia do teste em conta simulada eu abri o painel para entender uma semana ruim, e a resposta técnica foi chata. Estava tudo dentro do previsto. O pior tombo desde o começo daquele portfólio era de 116 dólares, contra uma banda pré-registrada de 434 para dois meses inteiros, e o retorno negativo de 96 dólares nem entra como critério, porque dois meses de resultado são ruído. Um robô tinha sido retirado no período, contra 1,7 esperados. Verde em tudo.

Aí eu li o extrato robô a robô. Os dez maiores perdedores da semana eram todos do mesmo par, libra contra dólar, apanhando juntos no mesmo movimento, com 87 dólares de prejuízo somado entre eles. E a régua de diversificação que eu tinha construído na esteira olhava para aquele bloco e enxergava robôs praticamente independentes, correlação de 0,02 entre os resultados. Uma das duas leituras estava errada, e era a minha. Nenhuma das checagens automáticas que eu construí exatamente para isso levantou a mão. Quem achou o buraco fui eu, lendo um extrato ruim num domingo à tarde.

A semana ruim estava dentro das bandas

O teste de dois meses tem bandas escritas antes de qualquer observação, e a nota dele é o tamanho do tombo. Retorno eu tirei de propósito. Sobram o buraco contra a banda, os robôs retirados contra o esperado e o ritmo de operações contra o backtest. Nos três, o portfólio estava onde deveria. A checagem ainda pegou um bug meu no alerta de frequência, que inflava todas as razões em 1,7 vez.

Por que o extrato de fechamentos dilui o que importa

O mecanismo é simples de contar. Um robô de tendência opera pouco e segura posição por dias. Quando eu meço a correlação entre dois robôs pelo resultado fechado, semana a semana, eu só enxergo os dias em que cada um encerrou alguma coisa, então dois robôs que seguraram a mesma direção durante seis dias e encerraram em dias diferentes caem em células distintas do calendário e a conta devolve correlação perto de zero. Na conta da corretora, os dois estavam expostos ao mesmo movimento, ao mesmo tempo, o tempo todo.

Esse viés tem nome e tem idade. Scholes e Williams (1977) mostraram que estimar co-movimento com observações que não acontecem no mesmo instante enviesa a medida para baixo, e o viés aperta justamente no ativo que negocia com pouca frequência. Robô que fecha pouco é o ativo que negocia pouco. O erro morava na junta entre duas estações da esteira. A estação que decide quem entra media resultado fechado. A estação que decide quanto cabe media a posição aberta, aquele drawdown flutuante do capítulo seis. Duas perguntas, dois relógios, e o buraco no meio.

A mesma semana medida de dois jeitos: em cima, os dias de fechamento dos dez maiores perdedores, esparsos e com correlação 0,02; embaixo, as horas com posição aberta, sobrepostas na mesma ponta do dólar.

A pergunta nova: vocês seguram o mesmo lado ao mesmo tempo?

A primeira decisão foi adicionar a pergunta e deixar a antiga em paz. Por que adicionar em vez de substituir? Porque a correlação dos resultados fechados continua sendo a única régua que enxerga quem se comporta igual atravessando regimes diferentes. A pergunta nova é mais literal. Em quantas horas do histórico esses dois robôs estiveram com posição aberta do mesmo lado?

Para responder isso eu tive que descer do dia para a hora. A medida monta uma grade horária e, em cada hora, converte a posição de cada robô para a ponta do dólar, que é o lado da moeda em que ele está posicionado. Comprado em dólar contra iene é comprado em dólar. Comprado em euro contra dólar é vendido em dólar. Com todo mundo na mesma moeda, a comparação entre dois robôs vira uma conta de tempo.

\text{co-ponta}(i,j)=\frac{T_{\text{mesmo lado}}-T_{\text{lado oposto}}}{T_{\text{ambos abertos}}}

Termo a termo. T de mesmo lado é quantas horas os dois passaram na mesma ponta do dólar, T de lado oposto é quantas horas passaram em pontas contrárias, e o denominador é o total de horas em que ambos tinham posição aberta. Perto de zero, os dois se ignoram. Em mais 1, são o mesmo robô com nomes diferentes. Em menos 1, um protege o outro. Para separar redundância de coincidência de agenda, cada medida é comparada contra um portão de acaso: eu embaralho a linha do tempo de cada robô com um deslocamento circular, que preserva o ritmo e a duração das operações dele, e vejo quanta sobreposição o puro acaso produz sozinho.

A primeira medição me contrariou

Rodei a medida sobre os 61 robôs que estavam no ar, com o histórico deles. O primeiro número já foi feio: 36 pares acima de 0,8, que na prática é a mesma posição carregada duas vezes. A concentração incomodou mais. Em 5% das horas, 27 dos 61 robôs estavam na mesma ponta do dólar, com pico de 34, contra 24 que a coincidência de agenda produziria sozinha. E o número quase não muda se eu esticar a janela para 2019, então isso é traço do portfólio.

Agora a parte que me contrariou. O bloco de libra, o mesmo que me fez levantar a pergunta, tem co-ponta médio de +0,10, porque lá dentro havia comprado e vendido misturados. O bloco mais colado do portfólio inteiro era outro, euro contra iene, em +0,32, cruzando pares diferentes. A minha intuição acertou o mecanismo e errou o endereço. O agrupamento perigoso se forma pela ponta do dólar, e atravessa o par. A régua nasceu de uma suspeita minha e começou me corrigindo.

Onde a régua nova vale, e onde ela não vale

Se a ponta ignora o par, o passo óbvio seria policiar tudo, inclusive entre pares. Decidi o contrário, por causa da tese. Estar comprado em dólar contra quatro moedas ao mesmo tempo é exposição de fator deliberada, é o desenho do portfólio, e cortar robô por causa disso seria desmontar a própria tese com a minha mão. Esse risco conjunto continua onde sempre esteve, no teto de risco da estação 4, que soma a conta inteira. A régua nova caça a redundância literal: mesmo par, mesmo lado, mesma hora.

Com o escopo fechado, sobraram 465 pares comparáveis e 29 deles ficaram acima de 0,8: uma família de robôs de grade de iene grudada entre 0,95 e 0,998, dois robôs de dólar canadense em 1,00 cravado, um par de libra em 0,956. Nomes diferentes, gráficos diferentes, a mesma posição. E dentro de cada par a aglomeração mal passa do que o acaso produz, o que fecha o raciocínio: o excesso que apareceu na primeira medição morava no cruzamento entre pares, que é a exposição que eu escolhi ter.

A terceira decisão foi a que dói. A pergunta passou a cortar, e virou a estação 2c da esteira, logo depois da curadoria. Duas ressalvas honestas. A linha que separa colado de aceitável é decisão minha de capital, do mesmo tipo do teto de 700 dólares, porque a distribuição real desce suave e não tem vale nenhum onde a natureza aponte o lugar certo, e escolher essa linha otimizando em cima do mesmo dado seria overfit com outro nome. A segunda ressalva é o recorte: o corte vale para os robôs do construtor de estratégias, e os de grade ficam de fora por decisão minha.

Auditar antes de deixar a régua cortar

Régua que corta robô muda o portfólio que vai para o mercado. Antes de deixar a estação nova tirar um robô sequer, mandei caçar bug nela em três frentes, a minha própria revisão e mais dois auditores independentes, com 40 verificações conferidas contra conta feita na mão. O motor numérico passou. Dos seis bugs que apareceram, o pior foi o mais familiar: a janela da estação nova terminava um dia antes da janela da estação de capital, a mesma classe de erro que uma auditoria anterior já tinha pego no cálculo do risco em aberto. Refiz a rodada e nenhum corte mudou. O bug continua sendo bug. Só não estava mordendo aquele lote.

A parte que mais me ensinou foi a auditoria dos testes. O auditor pegou o meu código, quebrou de propósito e rodou a bateria: três propriedades centrais do corte continuavam verdes com o código deliberadamente errado, ou seja, nunca tinham sido testadas. A suíte foi de 63 para 88 testes. Encadeia direto com o capítulo oito: teste que passa só prova alguma coisa depois que alguém mostra que ele falharia com o código errado.

Funil da esteira com a estação nova: 204 robôs na pool, 93 depois da curadoria e 54 no ar depois do corte de 11 por ponta, com 691 dólares de risco medido e 26,4 fatores de risco independentes.

54 robôs no lugar de 61

Com a estação nova plugada, rodei a esteira inteira de novo. A pool de 204 robôs virou 93 depois da curadoria, a estação nova cortou 11 por redundância de ponta, e o portfólio final fechou em 54 robôs. O risco medido pela régua oficial deu 691 dólares, dentro do teto de 700, contra os 708 que o portfólio anterior carregava depois da última troca. E o número que fecha o argumento é a diversificação: 26,4 fatores de risco independentes, com menos robôs no ar. Cortar 11 robôs aumentou o número de fatores independentes. Era redundância mesmo.

Um detalhe me deu confiança. Entre os cortados estava o robô que eu tinha retirado ao vivo poucos dias antes, por operar com frequência muito acima do backtest. Ele aparecia colado com um robô de grade de dólar canadense entre 0,89 e 0,97. Duas réguas diferentes, uma de execução ao vivo e outra de redundância histórica, apontaram o mesmo robô sem se falarem.

Trocar o portfólio inteiro parece contraditório. O de 61 robôs não tinha falhado o teste, estava verde nas bandas, com tombo de 116 contra 434. A troca foi por metodologia, o mesmo movimento que eu já tinha feito ao sair de 34 para 61 robôs, e no registro daquele dia eu escrevi que não confiava mais no portfólio em produção, porque confiar aqui quer dizer saber que a régua que montou aquilo enxergava um eixo só. O portfólio velho foi encerrado com a conta zerada em 9.892,71 dólares, que viraram o saldo base da contagem nova, e ele fecha a passagem dele com 72,36 dólares negativos em 9 dias.

A troca que não aterrissou

Aqui vem a parte que eu preferiria não escrever. Três dias depois, uma checagem de rotina mostrou que a troca não tinha chegado até o fim. A plataforma subiu com o perfil antigo carregado na memória: o terminal iniciou às 19:56:17 e o arquivo com os 54 gráficos só foi gravado no disco às 19:56:33, dezesseis segundos depois, então o que voltou foram os 61 gráficos que ainda estavam lá. Por um dia e meio quem operou foi o portfólio velho, com 12 robôs cortados ainda entrando. E a minha verificação dizia 54, porque ela lê o disco.

O que denunciou foram sete robôs fora da carteira aparecendo com posição depois da troca, mais o registro de inicialização da plataforma dizendo que tinha carregado 61. Virou regra no runbook: a única prova do que a memória carregou está nesse registro, e ele é conferido depois de toda troca. O conserto foi refazer a subida na ordem certa, fechar as posições órfãs e reancorar o teste, com saldo base novo de 9.866,82 dólares. O custo do erro foi de cerca de 32 dólares. Em conta simulada.

O que eu ainda não sei

Não sei se cortar por ponta melhora resultado. Tudo o que eu mostrei aqui é medição sobre o histórico dos mesmos robôs que a esteira já tinha usado para escolher, ou seja, é in-sample, e o valor disso para frente continua sem prova. O que está provado é que existia redundância literal no portfólio, que a régua antiga não podia enxergar por construção, e que remover essa redundância aumentou a diversificação medida. Vale a mesma lição do capítulo sete: a esteira controla risco, e nada aqui promete um centavo a mais de retorno.

A lição maior do dia está na forma da correção. A tentação era remendar o caso, tirar dois ou três robôs de libra na mão e seguir a vida, e aí o portfólio da próxima safra nasceria com o mesmo ponto cego, porque o processo continuaria sem a pergunta. Transformar a pergunta em estação da esteira custou um domingo e uma auditoria. Agora ela é feita sozinha, em toda safra. Corrigir o caso resolve o caso. Corrigir o processo resolve os casos que ainda não aconteceram.

O próximo capítulo é sobre o instrumento que faltava. Sete dias depois dessa troca, uma checagem feita por outro motivo mostrou que o teste de dois meses estava rodando sem ninguém anotar a nota dele. Acompanhe a série para não perder.

Perguntas frequentes

Por que a correlação dos resultados não basta para medir diversificação?

Porque ela é calculada sobre resultados fechados, e robô de tendência encerra posição em dias diferentes. Dois robôs podem segurar a mesma direção por seis dias seguidos e, como fecharam em dias distintos, aparecer com correlação perto de 0,02. Scholes e Williams (1977) já tinham mostrado que medir co-movimento com observações não sincronizadas enviesa a medida para baixo.

Por que trocar um portfólio que estava passando no teste?

Porque a troca foi por metodologia. O portfólio de 61 robôs estava verde nas bandas, com tombo de 116 dólares contra 434, mas tinha sido montado por uma régua cega num eixo. Com a estação nova, a esteira devolveu 54 robôs, risco medido de 691 dólares dentro do teto de 700 e diversificação medida de 26,4 fatores de risco independentes.

Referências

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: 183