No mês passado, uma estratégia gerada produziu uma curva de patrimônio com um drawdown de 63%. Profundo, feio e, depois, uma recuperação limpa nas 6 semanas seguintes — o tipo de formato que faz um pesquisador olhar com atenção e concluir que dá para suportar reduzindo o tamanho das posições. Rodei a estratégia novamente em um motor de margem que conhece os níveis de margem de manutenção. A conta foi liquidada no dia 41, no meio daquele drawdown, e tudo à direita do dia 41 era ficção.
Essa é a classe de erro de backtest mais cara que conheço, porque não distorce seus retornos em alguns pontos-base. Ela remove da simulação um estado absorvente. Uma estratégia que pode chegar a zero e uma que não pode são estratégias diferentes, e um backtest que nunca verifica a margem não consegue dizer qual delas você tem.
Vejo 3 maneiras de fazer isso errado.
Erro 1: tratar a alavancagem como um número pelo qual multiplicar os retornos
O formato mais comum. Você calcula uma série de retornos a partir dos sinais, decide operar com alavancagem de 10x e multiplica. Às vezes é um pouco mais sofisticado — o tamanho da posição é equity * leverage / price —, mas o estado da conta continua sendo apenas um escalar que sobe e desce. Sem saldo de margem, sem limite de valor nocional, sem condição de falha.
O estrago é sutil, por isso passa pelas revisões. O Sharpe é invariante à escala, então seu número principal não muda quando você altera a alavancagem de 3x para 30x, e o pesquisador conclui que a alavancagem é um controle gratuito para trocar volatilidade por retorno. O drawdown máximo escala linearmente e fica abaixo de 100% por acidente aritmético, porque uma série de retornos multiplicados se aproxima de zero assintoticamente e nunca o ultrapassa. Multiplique um dia de -9% por 12 e, na versão correta, você tem -108%; na ingênua, tem "-108%, mas a curva de patrimônio continua positiva", dependendo de ter composto ou somado os retornos. Já vi os dois casos.
O que falta é entender que a alavancagem não é aplicada aos seus retornos. Ela é aplicada à sua garantia, e a garantia é uma quantidade finita que a corretora monitora a cada segundo. Quando ela cai abaixo do requisito de manutenção, a posição deixa de ser sua.
O sinal: se sua simulação não consegue produzir uma perda total em nenhum nível de alavancagem, ela não está modelando alavancagem.
Erro 2: calcular o preço de liquidação apenas com base na alavancagem
O segundo nível de sofisticação acrescenta uma verificação de liquidação, geralmente assim: com alavancagem de 20x, um movimento adverso de 5% elimina a margem; então, liquide em preço de entrada × 0.95 para uma posição comprada. Simples, intuitivo e errado em 4 aspectos diferentes ao mesmo tempo.
As corretoras de perpétuos não usam sua configuração de alavancagem para decidir quando a posição será encerrada. Elas usam uma taxa de margem de manutenção que aumenta conforme o valor nocional da posição, seguindo uma tabela por níveis. Formato aproximado para BTCUSDT USDⓈ-M, sujeito a alterações conforme as corretoras revisam os níveis:
| Valor nocional da posição (USDT) | Taxa de margem de manutenção | Alavancagem máxima |
|---|---|---|
| 0 – 50,000 | 0.40% | 125x |
| 50,000 – 600,000 | 0.50% | 100x |
| 600,000 – 3,000,000 | 1.00% | 50x |
| 3,000,000 – 12,000,000 | 2.50% | 20x |
| 12,000,000 – 70,000,000 | 5.00% | 10x |
Assim, o movimento adverso que você consegue absorver em uma posição comprada isolada é aproximadamente 1/L − MMR, e não 1/L. Com alavancagem de 20x no segundo nível, são 5% − 0.5% = 4.5%. Meio por cento parece arredondamento. Com BTC a 84,000, são 420 dólares de variação no preço; em uma hora volátil, 420 dólares fazem a diferença entre ser tirado por um pavio e continuar na posição. Cada pavio vira cara ou coroa, e você enviesou todos a seu favor.
Depois vêm as taxas. A taxa taker de entrada é descontada da sua margem no instante em que sua ordem é executada: 0.045% sobre um valor nocional de 500,000 são 225 USDT debitados de um saldo de margem de 25,000, o que desloca o preço de liquidação antes que a posição sequer tenha feito qualquer coisa. O funding faz o mesmo continuamente e, sobre o valor nocional alavancado, pesa muito mais do que os pesquisadores esperam:
Uma posição que fica parada por 30 dias — sem movimento adverso, sem operações — consumiu quase um quinto da garantia e deixou seu preço de liquidação consideravelmente mais perto. O terceiro e o quarto aspectos do erro: os níveis mudam conforme você aumenta a posição, então uma posição que começa no nível de 0.5% e é aumentada com novas entradas até chegar ao nível de 1.0% tem um preço de liquidação pior que o calculado na entrada; e a margem cruzada agrupa as garantias entre posições, então a sobrevivência da sua posição comprada em BTC depende do que sua posição vendida em ETH está fazendo. Se você simula margem cruzada como um conjunto de posições isoladas e independentes, está modelando ao contrário a estrutura de correlação da sua própria conta.
Erro 3: resolver a liquidação usando o preço errado, no momento errado e com a execução errada
Digamos que você acertou o nível de disparo. Agora: qual preço cruza esse nível, quando você verifica e a que preço sua posição é executada?
A liquidação é acionada pelo preço de marcação, um índice de vários mercados à vista com um componente de base suavizado, projetado deliberadamente para resistir a um pavio em uma única corretora. Seu stop-loss, dependendo de como foi configurado, provavelmente é acionado pelo último preço negociado. Esses 2 valores divergem exatamente quando isso mais importa. Durante uma cascata, o último preço do perpétuo pode se descolar do preço de marcação em 1–2% por dezenas de segundos. Um backtest que calcula tanto o stop quanto a liquidação usando a mínima da mesma OHLCV está modelando uma corretora que não existe.
Os 2 erros aparecem aqui, e um não anula o outro. Usando o último preço, você liquida em pavios que a corretora ignorou. Usando o preço de marcação, você deixa passar o caso em que o próprio preço de marcação se moveu — uma descolagem do índice em uma corretora à vista é uma forma real de ser liquidado a um preço que nunca foi registrado no perpétuo em que você operava.
Depois vem a execução. Motores ingênuos encerram a posição no preço de liquidação e contabilizam a perda como se fosse um stop. O que realmente acontece: o motor de liquidação assume a posição pelo preço de falência — o nível em que sua margem é exatamente zero, pior que o nível de disparo — e cobra também uma taxa de compensação da liquidação, que varia conforme o nível e fica perto de 1% do valor nocional nos níveis inferiores. Com alavancagem de 20x, 1% do valor nocional equivale a 20% da margem restante. Se o motor executar abaixo do preço de falência, o fundo de seguro cobre a diferença; em algumas corretoras, se o fundo se esgotar, as perdas socializadas atingem o lado lucrativo do livro. Sua perda realizada não é o drawdown até o preço de liquidação. É maior, e o excedente é máximo justamente nos dias em que o livro estava raso o suficiente para piorar a execução.
E a questão do momento, que surge com a mecânica intrabar, importa aqui mais do que nunca. Se uma barra de 1-minute inclui tanto seu take-profit quanto seu nível de liquidação, um backtest que verifica as saídas antes da margem vai contabilizar o lucro sem hesitar. A corretora verifica a margem a cada atualização do preço de marcação, aproximadamente uma vez por segundo, antes de qualquer outra coisa que você quisesse que acontecesse.
O que o motor precisa acompanhar
Nada disso precisa ser exótico. Precisa manter estado. A conta é um objeto com saldo, não uma série de retornos, e a cada barra ela é atualizada na ordem em que a corretora faria isso:
- Saldo da carteira e PnL não realizado, separadamente. A razão de margem é a margem de manutenção dividida pelo saldo de margem, que inclui o PnL não realizado. Confundir os dois faz uma posição perdedora parecer ter mais garantia do que realmente tem.
- A tabela de níveis de cada símbolo, com versões por data. Os níveis são revisados. Um backtest de 2023 executado com os níveis de 2026 tem um viés de antecipação sutil — geralmente favorável, já que as corretoras em geral flexibilizaram os requisitos para os principais ativos ao longo do tempo.
- Uma série de preços de marcação, não apenas klines. Se você não consegue obter o histórico de preços de marcação, informe isso nos resultados e use uma estimativa conservadora. Nunca substitua silenciosamente pelo último preço.
- A verificação de margem vem primeiro na ordem de eventos da barra, antes de stops, alvos, sinais ou rebalanceamentos.
- Execuções pelo preço de falência mais a taxa de compensação, usando a taxa da mesma linha da tabela de níveis que contém a MMR.
- Um estado terminal absorvente. Quando o patrimônio chega a zero, a execução termina. Sem redefinir a base, sem "presumir que o operador faz um aporte", sem continuar a série com um novo valor nocional.
Esse último ponto é o que mais gera discussão. Sempre tem alguém que observa que uma mesa de verdade depositaria mais garantia, então encerrar a simulação é rigoroso demais. Talvez. Mas "essa estratégia funciona se você continuar colocando dinheiro depois que ela quebra" é uma afirmação que merece ser apresentada com essas palavras e testada de propósito, com os aportes como entrada explícita, em vez de ser embutida como padrão. Quando você a escreve com clareza, a maioria das pessoas percebe que não era isso que queria dizer.
O resultado prático de tudo isso: ao executar a mesma estratégia no papel contra a corretora ao vivo, a razão de margem informada pela corretora e a calculada pelo seu simulador devem acompanhar uma à outra com diferença de 1 ou 2 pontos-base ao longo do dia. Dá para verificar essa concordância a cada minuto, em todas as posições abertas, sem custo. É o teste de paridade mais barato de toda a pilha, e quase ninguém o executa — e, quando os 2 valores divergem, a corretora está certa e você tem um erro que vale a pena encontrar antes que o drawdown o encontre.
← Todos os artigos


