Diário de um Portfólio de Robôs (12): Consertei a Régua do Risco e Couberam 11 Robôs a Mais

A régua marcava toda posição aberta no pior preço do dia inteiro, sem saber a que horas ela existiu. Reconstruída com barras de 5 e 15 minutos, o mesmo teto passou a caber 61 robôs no lugar de 50. E em 3 de julho a era dos 34 terminou limpa.

Direto ao ponto. A régua que mede o risco das posições abertas olhava o dia inteiro de uma vez só, sem saber a que horas cada posição existiu, então uma perna que viveu das 8h às 10h era marcada na mínima das 22h. Reconstruí o dia com barras de 5 e 15 minutos e medi o portfólio antigo pelas duas réguas: o número mudou dois dólares, para o lado apertado. No candidato maior o risco medido caiu 32%, e por isso couberam 61 robôs onde antes cabiam 50, com o mesmo teto. Em 3 de julho a era dos 34 foi encerrada com a conta zerada e os 61 subiram, 14 deles já posicionados na primeira hora.

Eu queria mais robôs no portfólio e o teto de risco não deixava. Em vez de subir o teto, fui olhar a régua. Ela estava medindo grosso. Marcava toda posição aberta no pior preço do dia inteiro, sem saber a que horas aquela posição existiu de verdade, então uma perna comprada que viveu das 8h às 10h da manhã levava na cara a mínima que só apareceu às 22h. Quebrei o dia em barras de 5 e 15 minutos. Mesma janela, mesmos pares, mesmo teto, e passaram a caber 61 robôs.

Antes de acreditar nisso eu medi o portfólio que já existia pelas duas réguas, porque se a régua nova tivesse afrouxado o que estava lá ela ia para o lixo. Deu o contrário. Ela apertou dois dólares, e o alívio apareceu só onde tinha que aparecer, nos robôs que abrem e fecham posição dentro do mesmo dia. Foi esse alívio que comprou 11 robôs de diversificação sem eu encostar no limite.

Onde a história estava: no ar rodavam os 34 robôs do capítulo nove, e na bancada esperava um candidato de 50, já corrigido pela auditoria de código e já submetido ao walk-forward dos dois capítulos anteriores. Este capítulo é o dia em que os dois trocaram de lugar.

Por que não subi o teto

O teto é a quantidade de dinheiro que eu aceito ver evaporar antes de desligar tudo. É uma declaração, não um parâmetro de ajuste. Mexer nele para caber mais robô inverte a ordem das coisas, porque o portfólio passaria a definir o risco quando é o risco que precisa definir o portfólio, e subir o teto me daria os 11 robôs na hora junto com um risco maior que eu não tinha decidido correr. Essa troca eu não faço.

Só que a vontade de crescer também vinha do risco. Portfólio pequeno depende mais de cada robô continuar funcionando, e depender de poucos robôs é a forma mais discreta de concentrar risco achando que se está diversificando. O gate da esteira corta robôs até o risco caber no teto, então cada dólar de tombo fantasma no cálculo é cobrado em robô cortado, e um erro de medição para mais empobrece o portfólio de um jeito que nenhum gráfico denuncia.

A régua olhava o dia inteiro

O portão que decide o tamanho do portfólio mede uma grandeza só: o pior saldo negativo que o conjunto das posições abertas mostraria, dia a dia, ao longo da janela inteira de teste. É o drawdown das posições abertas do capítulo seis. Não aparece no extrato, e é ele que consome margem.

A versão anterior fazia assim, dia por dia. Pegava a mínima e a máxima daquele dia, olhava quais posições estiveram abertas em algum momento dele e marcava todas naquele extremo. Sem hora nenhuma. Uma posição que existiu das 8h às 10h era marcada como se tivesse visto a mínima das 22h, um preço que ela nunca chegou a ver.

Conservador de propósito. E conservadorismo não é defeito quando o assunto é dinheiro. O problema é quem paga a conta do excesso. Robô de tendência que segura posição por dias não sente nada, porque para ele o dia inteiro é mesmo o intervalo dele. Quem apanha é o grid e o robô que abre e fecha dentro do dia, e no meu portfólio isso são 18,5% dos trades no total e 33% dentro dos grids, o mesmo levantamento que a auditoria do capítulo oito fez dentro da amostra. Eles pagavam por um tombo que nunca atravessaram.

Linha do preco de um dia: a regua nova marca a posicao no pior preco entre 8h e 10h, a regua antiga marcava na minima das 22h

O limite de 100 mil barras

Puxei as barras de 5 e de 15 minutos dos quatro pares direto do terminal da corretora, a mesma origem dos dados diários. Isso importa muito. Se o intraday viesse de outro provedor, a diferença entre os feeds viraria ganho aparente de precisão. Aí apareceu o limite. O terminal entrega no máximo 100 mil barras por período, e pedido maior volta como parâmetro inválido, sem explicar nada. Cem mil barras de 5 minutos cobrem pouco mais de um ano, então elas só alcançavam março de 2025, e a janela do gate começa em 2024.

Resolvi paginando mês a mês e pondo as barras de 15 minutos por trás, desde junho de 2022. Por que 15 minutos atrás e não só 5 até onde desse: prefiro a janela inteira coberta com resolução menor a ter metade dela fina e a outra metade cega, caindo no dia inteiro. Depois disso, a conferência. Reconstruí a mínima e a máxima de cada dia a partir das barras intraday e comparei com a mínima e a máxima diárias do mesmo terminal: diferença de 0,0000%, cobertura de 100% dos dias. E eu não toquei no terminal que estava vivo, porque mudar o limite de barras pedia reiniciar a plataforma com os 34 robôs operando.

Como a régua nova marca

A ideia é fácil de dizer e chata de implementar. O dia é quebrado nos trechos em que o conjunto de posições abertas não muda, e cada abertura ou fechamento fecha um trecho e abre o seguinte. Dentro de um trecho, aquele conjunto é marcado só nas barras que ele de fato atravessa, mais os instantes de borda. A perna que viveu das 8h às 10h agora leva o pior preço entre 8h e 10h.

A trava contra o afrouxamento disfarçado está no que acontece quando falta dado: se um trecho não tem barra nenhuma, ou se a cobertura de barras daquele dia fica abaixo de 90%, o dia inteiro cai de volta na régua antiga. Falta de dado não vira permissão. Vira o número conservador de sempre.

O furo que a escada de grid expôs

Este pedaço eu não estava procurando. Montando o caso de teste que imita uma escada de grid, com uma perna fechando às 9h30 num dia que continua e outra abrindo às 12h no fechamento de uma terceira, descobri que a régua antiga tinha um buraco.

Ela sondava os conjuntos de posições só nos instantes de borda, nos momentos em que alguma coisa abre ou fecha. O conjunto que existe no interior, das 9h30 às 12h, nunca era medido sozinho. E nos instantes de borda a perna que acabava de fechar ainda entrava na soma, cancelando parte do tombo das que ficaram abertas. No caso de teste, com os valores calculados na mão, a régua antiga media 5 dólares de tombo onde o certo eram 10. Metade do valor certo.

Ou seja, ela era conservadora no geral e otimista justamente no padrão de posição mais comum dos grids, que são um quarto do meu portfólio. A varredura por trechos pega o interior junto. Foi de graça. Fechei o bloco com 17 casos de teste novos escritos com os valores na mão, os 252 do acervo e os 6 do golden run. Todos eles verdes.

O mesmo portfólio, duas réguas

Peguei o candidato de 50 robôs, montado inteiro sob a régua antiga, e medi de novo com a régua nova. Se o número caísse ali, a régua nova estaria apenas sendo generosa com um portfólio que ela não montou.

O número subiu dois dólares. A régua nova não devolveu nada do que a antiga cobrava naquele portfólio, e ainda cobrou um pouco a mais, que é a escada aparecendo. O resgate veio onde tinha que vir: o pior dia de exposição aberta de toda a janela caiu cerca de 7%, e é um dia de grid.

Aí eu virei a régua para o candidato maior. Medido pela régua antiga, o risco dos 61 estourava o limite do portão em quase 50%, e ele nem chegava a ser uma opção em cima da mesa. Medido pela régua fina, caiu 32%. Dessa vez coube. Os dois candidatos saturam o mesmo teto, cada um pela sua régua, que é o portão trabalhando como deveria, e todos esses números são de dentro da amostra, na janela de seleção, nos quatro pares.

Risco dos candidatos de 50 e de 61 robos em relacao ao limite do portao, medido pela regua do dia inteiro e pela regua de dentro do dia

Onde foram parar os 11 robôs

O portfólio que subiu tem 14 grids e 47 robôs de tendência, com 27,4 fatores de risco independentes na conta de diversificação. Comparado com o candidato de 50: 45 robôs continuaram, 5 saíram e 16 entraram. Três combinações de par e comportamento seguem magras, com dois robôs ou menos cada, e isso a precisão da régua não resolve, porque é falta de matéria-prima na pool.

Uma nota de disciplina. O walk-forward do capítulo anterior não foi re-rodado depois dessa mudança, de propósito: ele é pré-registrado e fechado, e a folga que ele mediu é uma razão entre duas medições feitas com a mesma régua dos dois lados. Re-rodar teste pré-registrado depois de já ter visto o resultado é o caminho mais curto para o autoengano que este projeto tenta evitar.

O dia D, e a conta zerada

Foram cerca de sessenta minutos, do pré-voo ao portfólio novo no ar. O pré-voo encontrou 21 dos 47 executáveis prontos, então gerei 36: 26 do portfólio e 10 do topo da fila de reposição, esses últimos para que uma troca futura não trave esperando o gerador abrir.

Faço questão de uma frase sobre os 34 que saíram. Eles não quebraram. Nenhum tinha estourado o teto, nenhum estava sangrando, e a era acabou por decisão minha: snapshot final, backup dos 109 negócios do período, todas as posições fechadas com verificação de que a conta zerou e cópia de segurança dos arquivos de configuração e do perfil. Encerrar limpo é o que permite comparar as duas eras depois, sem discussão sobre onde uma acaba e a outra começa.

O cutover é o runbook seguido na ordem, com o terminal fechado: os 61 presets gravados, o perfil com 61 gráficos regenerado, os robôs de grid com recuperação de estado por cima. Antes de subir, o portão pré-deploy confere que os 61 vão para o ar com os parâmetros e os executáveis que a esteira aprovou. O portão passou. Aí eu subi. Na primeira hora estavam 61 robôs carregados, 14 deles já com posição aberta, o drawdown zerado e nenhum robô perto do teto que herdou do Monte Carlo.

O robô que não virou executável

No meio da geração dos executáveis apareceu o imprevisto do dia. Um dos robôs selecionados usa um bloco de indicador cujo modelo para a plataforma de operação não existe na instalação do gerador. Ele simplesmente não exporta. E não dá para saber isso antes de tentar.

O tratamento já estava escrito na doutrina, e por isso não virou decisão improvisada: inviabilidade material tira o robô da lista, e entra o primeiro apto da fila de reposição na mesma célula, quer dizer, no mesmo par com o mesmo tipo de comportamento. Por que o primeiro da fila e não o de melhor resultado recente: desempenho recente é ruído, e este projeto já provou isso por três caminhos diferentes. Por que não pegar o substituto de menor risco, que caberia com mais folga: escolher pelo risco menor para fazer caber é o viés de seleção que o primeiro capítulo desmontou. O substituto que a regra apontou era um grid, e com ele dentro o risco do portfólio inteiro foi medido do zero outra vez e ficou melhor que o do arranjo original.

Os 25 alertas falsos do dia 0

A primeira hora no ar trouxe também um susto de instrumentação. O monitor encheu de aviso “fora da carteira”, 25 deles de uma vez, porque os identificadores da era antiga ainda têm negócios históricos gravados na conta. Nenhum era real.

Alerta falso em massa é pior do que alerta nenhum, porque em uma semana eu pararia de ler todos, inclusive o verdadeiro. O conserto foi ancorar a era: o monitor passou a contar negócios e drawdown a partir do instante exato do deploy, em hora do servidor. A primeira versão usava hora local e deixou os fechamentos do cutover vazarem para dentro da era nova, três horas de diferença que mudam o número do dia zero. É o mesmo fuso horário que já tinha cegado o painel por seis horas durante a auditoria. Depois da âncora, nenhum robô fora da carteira.

O que eu ainda não sei

O dia 0 do teste é 3 de julho de 2026, e o veredito sai em torno de 3 de setembro, pelo protocolo que ficou pré-registrado antes de qualquer robô subir. São três critérios: risco realizado dentro das bandas, execução fiel ao backtest medida por reconciliação semanal e número de robôs mortos dentro do esperado, que é cerca de 1,7 em dois meses. Nenhum dos três fala de lucro. Margem de erro eu aceito. Animal diferente, não.

O que a régua fina não resolve continua em cima da mesa. Onde falta barra intraday ela volta para o conservador, então o pedaço mais antigo da janela segue medido grosso. E o walk-forward do capítulo anterior já mostrou o limite maior: num chicote de regime a seleção sozinha não segura o tombo, e é para esse cenário que existem o disjuntor de drawdown e a máquina de troca. Precisão de medição compra robô a mais dentro do mesmo teto. Ela não compra imunidade a regime.

O próximo capítulo é o que aconteceu com esses 61 depois que o cronômetro começou a correr, incluindo o primeiro robô que o monitor pegou e a máquina de troca substituiu ao vivo. Veio antes do que eu esperava. E o motivo do corte não teve nada a ver com prejuízo. Acompanhe a série para não perder, porque o diário segue aberto enquanto o portfólio estiver operando.

Perguntas frequentes

Por que medir o risco pelo dia inteiro distorce o resultado?

Porque marcar toda posição aberta na mínima ou na máxima do dia atribui a ela um preço que ela pode nunca ter visto. O efeito recai sobre quem abre e fecha dentro do dia, que no meu portfólio são 18,5% dos trades e 33% dentro dos grids, medido dentro da amostra. E como o portão corta robôs até o risco caber no teto, o excesso vira robô cortado sem motivo.

A régua nova afrouxou o controle de risco?

Não, ela apertou. O candidato de 50 robôs, montado inteiro sob a régua antiga, mediu dois dólares a mais quando remedido pela régua nova. Existe também uma trava explícita: quando um trecho do dia não tem barra intraday, ou quando a cobertura do dia fica abaixo de 90%, o cálculo cai de volta na mínima e na máxima diárias. Falta de dado devolve o número conservador.

Por que um portfólio maior importa se o objetivo é controlar risco?

Porque portfólio pequeno depende mais de cada robô continuar funcionando, o que concentra risco enquanto parece diversificação. Os 61 robôs que subiram somam 27,4 fatores de risco independentes, contra os 50 do arranjo anterior, sem que o teto tenha mudado um centavo.

O que acontece quando um robô selecionado não pode ser instalado?

Ele sai por inviabilidade material e entra o primeiro apto da fila de reposição na mesma célula, ou seja, no mesmo par e com o mesmo tipo de comportamento. A escolha ignora resultado recente, porque desempenho recente é ruído, e ignora também qual substituto caberia com mais folga no teto, porque escolher pelo risco menor é viés de seleção.

Referências

  • Basel Committee on Banking Supervision (2013). Monitoring tools for intraday liquidity management. BIS, BCBS 248. Bancos passaram a medir exposição intradiária porque o retrato de fim de dia esconde o pico.
  • Chekhlov, A.; Uryasev, S.; Zabarankin, M. (2005). Drawdown Measure in Portfolio Optimization. International Journal of Theoretical and Applied Finance, 8(1), 13-58. O drawdown é função do caminho percorrido.
  • López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Sobre erro de medição no próprio código de backtest.

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