Há uma pergunta a que todos os backtests se esquivam: se o mesmo código recebesse os mesmos dados de mercado em tempo real, teria feito o mesmo? Não consegues responder com mais backtesting. Só podes responder executando a estratégia com dados em tempo real e semântica de execução real e, depois, verificando — operação a operação — se os dois mundos coincidem. Fazemos essa verificação todos os dias, automaticamente, e tem sido a ferramenta mais produtiva para encontrar bugs em toda a plataforma.
Dia 1: construir o espelho
Cada estratégia promovida corre no seu próprio nó isolado em tempo real, consumindo streams reais das exchanges: cotações em tempo real para as execuções, spreads reais, horários de sessão reais. Não há estado partilhado entre estratégias (aprendemos isso da maneira mais difícil — um nó partilhado permitia que as consultas de posições de uma estratégia se misturassem com as de outra). Cada execução é registada com o valor do sinal que a originou.
Todas as manhãs: reproduzir e comparar
Uma tarefa diária recolhe o intervalo de paper trading de cada estratégia, executa o mesmo código no motor de backtesting durante o mesmo período, com dados do catálogo, e emparelha as execuções uma a uma: mesmo lado, mesma tolerância temporal, mesma dimensão. O resultado não é uma correlação nem uma impressão. É uma tabela: correspondentes, apenas em paper, apenas na reprodução. Uma estratégia saudável regista 54 de 55 execuções correspondentes. Uma estratégia com problemas indica-te exatamente qual foi a operação divergente e quando ocorreu.
O que falhou, pela ordem em que falhou
- Execuções durante o aquecimento. O nó em tempo real fornecia dados históricos para aquecer os indicadores — e as estratégias com handlers de barras personalizados negociavam alegremente com base nesses dados. Os backtests nunca viam essas entradas fantasma. A solução foi uma salvaguarda na camada de submissão, não uma correção da estratégia, porque, caso contrário, todas as estratégias herdariam o bug.
- Aquecimento sequencial de múltiplas pernas. Uma estratégia transversal aqueceu um instrumento de cada vez; cada perna via as restantes vazias e o instrumento de referência nunca era inicializado. Em tempo real, não negociava; na reprodução, funcionava bem. Zero operações correspondentes — mas só a comparação o deixou claro.
- Ciclos de falha por precisão dos ticks. Os ticks aggTrade em tempo real chegam com uma precisão diferente da esperada pelo instrumento no sandbox. O nó entrava num ciclo de falhas devido a uma asserção que o backtest nunca poderia acionar, porque as barras do catálogo já estão normalizadas.
- Amnésia após reiniciar. Os reinícios do processo voltavam a executar a lógica de entrada para posições que já existiam — numa estratégia de rebalanceamento, um reinício transformava-se silenciosamente num rebalanceamento. Em negociação em tempo real, isto não é uma nota de rodapé sobre paridade; é um sinal de alarme com dinheiro em jogo.
Repara no padrão: nenhum destes casos é um bug do sinal. São todos bugs nos limites de execução — aquecimento, estado, precisão, reinícios. É precisamente o tipo de falha a que os backtests são estruturalmente cegos, porque, num backtest, o motor de backtesting é o limite de execução.
As assimetrias que mantemos de propósito
Os dois mundos não são deliberadamente idênticos. O backtest incorpora no PnL meio spread modelado mais um impacto de raiz quadrada; no paper trading, paga-se o spread real no preço de execução e não se aplica nenhum modelo de impacto. Acrescentar o spread modelado ao paper trading (ou o spread real aos backtests) seria contabilizar em duplicado. Paridade significa as mesmas decisões e execuções dentro da tolerância — não um PnL idêntico bit a bit. Saber quais as diferenças fundamentadas e quais são bugs é grande parte da disciplina.
Um backtest é uma hipótese. O paper trading é a experiência. A paridade da reprodução é o caderno de laboratório que te impede de te enganares a ti próprio.
Se executas estratégias e não comparas regularmente o comportamento em tempo real com o comportamento reproduzido, há uma categoria de bugs que nunca viste. Encontramos um aproximadamente de duas em duas semanas, e cada um deles era invisível dentro do backtest.
← Todos os artigos

