Às 08:00 UTC de uma terça-feira, uma plataforma de cripto alterou o tamanho do tick de um contrato perpétuo de preço intermédio. A nossa estratégia de basis nem se apercebeu. O sinal continuou a detetar o mesmo diferencial entre o mercado à vista e os futuros, os limites de risco mantiveram-se e o backtest continuou a apresentar os mesmos resultados.
A negociação em simulação apercebeu-se disso por ela. O adaptador de ordens arredondou para baixo uma ordem limite de compra, até ao preço permitido mais próximo. A ordem ficou um tick abaixo do nível modelado no backtest. O mercado tocou no preço antigo, a ordem simulada foi executada e a ordem em simulação ficou por executar. Ao almoço, o inventário da estratégia estava desequilibrado.
O incidente parecia um pequeno erro de arredondamento. Na verdade, era um problema de fronteira do modelo: a estratégia conhecia os preços, mas o backtest desconhecia a grelha de preços da plataforma.
Estávamos a negociar um sinal simples de basis: comprar no mercado à vista e vender um perpétuo quando o prémio dos futuros ultrapassava um limiar. As ordens eram passivas, porque a vantagem esperada da basis era pequena. Bastavam alguns ticks para determinar se a entrada rendia o suficiente para cobrir as comissões e a saída posterior.
O que mudou quando mudou o tamanho do tick?
Antes da atualização, o perpétuo aceitava preços em incrementos de 0,01. Depois, passou a aceitar incrementos de 0,05 na banda de preços relevante. O sinal calculou um preço-alvo de venda de 42,318.03, válido segundo a regra antiga. Segundo a nova regra, esse preço era inválido.
A bolsa rejeitava preços inválidos, mas o nosso adaptador tinha uma alternativa: arredondava a venda para baixo, até 42,318.00. Esse preço também era inválido. Uma segunda alternativa voltava a arredondar, desta vez para 42,318.05, que era válido, mas menos agressivo para um vendedor. A ordem já não podia ser vendida ao preço modelado. A lógica tinha sido escrita para outro mercado e transformava silenciosamente uma rejeição numa ordem com preço ajustado.
Essa ordem levantava duas questões distintas. Primeiro, que preço pode a plataforma aceitar? Segundo, como deve a estratégia reagir quando o preço pretendido não está na grelha? A bolsa responde à primeira. A estratégia ou a política de execução tem de responder à segunda.
| Intenção da ordem | Regra da grelha | Sentido habitual do arredondamento | O que pode alterar |
|---|---|---|---|
| Ordem limite de compra | O preço tem de ser múltiplo do tick | Para baixo, para não ultrapassar o limite | Menor probabilidade de execução |
| Ordem limite de venda | O preço tem de ser múltiplo do tick | Para cima, para não ficar abaixo do limite | Menor probabilidade de execução |
| Ordem limite executável | Também tem de respeitar os limites de preço | Depende do preço máximo aceitável | Se atravessa o spread |
Não existe uma regra de arredondamento universalmente correta. Arredondar uma compra para baixo respeita o limite de preço do comprador, mas pode reduzir a probabilidade de execução. Arredondar para cima pode tornar a ordem executável de imediato, alterando as comissões e o impacto. Para a nossa entrada passiva de basis, alterar a ordem silenciosamente foi a decisão errada. A estratégia tinha definido um alvo; o adaptador alterou a sua economia.
Porque é que o backtest continuava a parecer saudável?
O nosso simulador histórico de ordens tratava os preços limite como valores contínuos. Se a mínima da barra atingisse o preço de compra, ou a máxima atingisse o preço de venda, contabilizava uma execução. Já é uma aproximação generosa para uma ordem passiva, porque uma transação ao preço limite não revela a posição na fila. Mas a alteração do tick tornou o problema mais básico: a ordem não podia sequer existir àquele preço.
Reproduzimos as mesmas decisões aplicando a nova grelha a partir do momento em que entrou em vigor. Várias execuções desapareceram. Algumas ordens foram arredondadas para preços que atravessavam o spread e passaram a pagar comissões de taker em vez de maker. A trajetória da posição divergiu e, por isso, também mudaram as coberturas e saídas posteriores. Uma regra que parecia ser apenas metadados alterou toda a sequência de transações.
E a atualização não era uma surpresa escondida num gráfico. A plataforma tinha publicado uma alteração às regras do instrumento, com uma data e hora de entrada em vigor. Armazenávamos cuidadosamente os dados de mercado, mas os metadados dos instrumentos ficavam numa cache atualizada no arranque. O backtest usava as regras de hoje para todas as datas históricas; a negociação em simulação usava regras desatualizadas até o processo ser reiniciado. Nenhum dos ambientes representava o que a plataforma permitia em cada momento.
Como deve um backtest modelar alterações no tamanho do tick?
Atribua versões às regras dos instrumentos, com intervalos de validade, tal como a outras entradas disponíveis em cada momento. No mínimo, guarde a data e hora de entrada em vigor e os valores necessários para validar uma ordem: tamanho do tick, incremento da quantidade, quantidade mínima e eventuais bandas de preços. O simulador deve carregar o conjunto de regras disponível no momento da decisão simulada.
Depois, torne explícito o tratamento das ordens. Se um preço-alvo for inválido, rejeite-o, arredonde-o segundo uma política documentada ou recalcule o alvo na grelha. Registe o que aconteceu. Um backtest que corrige automaticamente todas as ordens pode ser útil para estimar uma política de execução específica, mas não deve apresentar essa política como se fosse uma execução da bolsa.
Nas ordens passivas, um preço válido segundo o tick é apenas a primeira condição para haver execução. Continua a ser necessário modelar se o mercado negociou além do seu preço, a fila à sua frente, os cancelamentos e o escalão de comissões que teria obtido.
Adicionámos duas verificações. Uma valida cada ordem gerada segundo as regras do instrumento disponíveis naquele momento e falha de forma explícita se o preço ou a quantidade forem inválidos. A outra compara a ordem final normalizada pelo adaptador do backtest com a do adaptador de simulação: lado, preço, quantidade, validade temporal e intenção quanto à comissão. Se houver divergências, a execução não é considerada comparável.
Depois disso, reproduzimos a alteração de terça-feira. O backtest deixou de contabilizar execuções a 42,318.03 após a atualização da grelha. A negociação em simulação e a simulação tomaram a mesma decisão para cada preço-alvo inválido, mesmo quando essa decisão era não enviar a ordem.
O sinal não tinha falhado. Tinham ficado desatualizadas as suas premissas sobre o instrumento que podia negociar. Uma estratégia pode adaptar-se a um novo tamanho do tick, desde que o sistema de investigação trate as regras da plataforma como parte do mercado que está a simular.
← Todos os artigos


