5 de setembro de 2026 · risco

O teu backtest nunca foi liquidado: margem, mark price e a linha de alavancagem que ignoraste

O teu backtest nunca foi liquidado: margem, mark price e a linha de alavancagem que ignoraste

No mês passado, uma estratégia gerada produziu uma curva de capital com uma queda máxima de 63%. Profunda, feia, mas seguida de uma recuperação limpa ao longo das 6 semanas seguintes — o tipo de padrão que leva um investigador a olhar com atenção e a concluir que é suportável se reduzir a exposição. Voltei a executá-la num motor de margem que sabe o que é um escalão de margem de manutenção. A conta foi liquidada no dia 41, a meio daquela queda, e tudo o que vinha depois do dia 41 era ficção.

É o tipo de erro de backtest mais caro que conheço, porque não distorce os retornos em alguns pontos base. Apaga da simulação um estado absorvente. Uma estratégia que pode ir a zero e outra que não pode são estratégias diferentes, e um backtest que nunca verifica a margem não consegue dizer-te qual delas tens.

Continuo a ver 3 formas de fazer isto mal.

Erro número 1: tratar a alavancagem como um número pelo qual multiplicas os retornos

É a forma mais comum. Calculas uma série de retornos a partir dos teus sinais, decides que vais operá-la com alavancagem de 10x e multiplicas. Às vezes, a abordagem é um pouco mais sofisticada — o tamanho da posição é equity * leverage / price —, mas o estado da conta continua a ser apenas um escalar que sobe e desce. Sem saldo de margem, sem limite ao valor nominal, sem condição de falha.

Os estragos são subtis, e é por isso que passam nas revisões. O Sharpe é invariante à escala, por isso o teu valor de referência não muda quando passas de 3x para 30x, e o investigador conclui que a alavancagem é um botão gratuito que troca volatilidade por retorno. A queda máxima escala linearmente e fica abaixo de 100% por acidente aritmético, porque uma série de retornos multiplicados aproxima-se de zero assintoticamente sem nunca o ultrapassar. Multiplica um dia de -9% por 12 e, na versão rigorosa, obténs -108%; na versão ingénua, «-108%, mas a curva de capital continua positiva», dependendo de teres composto ou somado os retornos. Já vi ambas as versões.

O que falta é perceber que a alavancagem não se aplica aos teus retornos. Aplica-se ao teu colateral, e o colateral é uma quantidade finita que a plataforma acompanha a cada segundo. Assim que fica abaixo do requisito de manutenção, a posição deixa de ser tua.

O sinal de alerta: se a tua simulação não consegue produzir uma perda total com nenhum nível de alavancagem, não está a modelar a alavancagem.

Erro número 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, normalmente assim: com alavancagem de 20x, um movimento adverso de 5% elimina a margem, portanto liquida-se a posição longa no preço de entrada × 0.95. É simples, intuitivo e está errado em 4 aspetos diferentes ao mesmo tempo.

As plataformas de perps não usam a alavancagem que definiste para decidir quando a posição chega ao fim. Usam uma taxa de margem de manutenção que aumenta por escalões consoante o valor nominal da posição, numa tabela. Esta é uma aproximação da estrutura BTCUSDT USDⓈ-M, que muda quando as plataformas a atualizam:

Valor nominal da posição (USDT)Taxa de margem de manutençãoAlavancagem máxima
0 – 50,0000.40%125x
50,000 – 600,0000.50%100x
600,000 – 3,000,0001.00%50x
3,000,000 – 12,000,0002.50%20x
12,000,000 – 70,000,0005.00%10x

Assim, o movimento adverso que uma posição longa isolada consegue suportar é aproximadamente 1/L − MMR, e não 1/L. Com alavancagem de 20x no segundo escalão, são 5% − 0.5% = 4.5%. Meio ponto percentual parece um arredondamento. Com o BTC a 84,000, são 420 dólares de diferença no preço; numa hora de grande volatilidade, esses 420 dólares podem fazer a diferença entre uma sombra que te liquidou e outra que não. Cada sombra é um cara ou coroa, e enviesaste todas a teu favor.

Depois há as comissões. A comissão taker de entrada sai da tua margem assim que a ordem é executada: 0.045% sobre um valor nominal de 500,000 são 225 USDT debitados de um saldo de margem de 25,000 USDT. Isso altera o preço de liquidação antes de a posição ter feito seja o que for. O funding tem o mesmo efeito, continuamente, e sobre um valor nominal alavancado é muito maior do que os investigadores esperam:

4.55%movimento adverso efetivo até à liquidação com alavancagem de 20x, incluindo a comissão de entrada
0.60%custo diário do funding sobre a margem com alavancagem de 20x, 0.01%/8h
18%da margem perdida num mês sem variação

Uma posição que fica parada durante 30 dias — sem movimentos adversos nem transações — já consumiu quase um quinto do colateral, aproximando significativamente o preço de liquidação. O terceiro e o quarto erros: as posições passam de escalão à medida que aumentas a exposição, por isso, se começares no escalão de 0.5% e reforçares até chegares ao de 1.0%, o preço de liquidação será pior do que o que calculaste à entrada; e a margem cruzada partilha o colateral entre posições, por isso a sobrevivência da tua posição longa em BTC depende do que está a acontecer com a tua posição curta em ETH. Se simulas a margem cruzada como um conjunto de posições isoladas e independentes, estás a modelar ao contrário a estrutura de correlação da tua própria conta.

Erro número 3: resolver a liquidação com o preço errado, no momento errado e à execução errada

Imagina que acertaste no nível de ativação. Agora: que preço o ultrapassa, quando verificas e a que preço executas a ordem?

A liquidação é ativada pelo mark price, calculado a partir de um índice de várias plataformas spot com uma componente de base suavizada, concebido de propósito para resistir a uma sombra numa só plataforma. O teu stop-loss, dependendo de como o configuraste, provavelmente é ativado pelo último preço negociado. Estes dois preços divergem precisamente quando mais importa. Durante uma cascata, o último preço do perp pode afastar-se 1–2% abaixo do mark durante dezenas de segundos. Um backtest que calcula o stop e a liquidação a partir do mesmo mínimo OHLCV está a modelar uma plataforma que não existe.

Os 2 erros estão presentes aqui e não se anulam. Se usares o último preço, serás liquidado em sombras que a plataforma ignorou. Se usares o mark price, não detetas o caso em que o próprio mark se moveu: uma divergência no índice de uma plataforma spot é uma forma real de seres liquidado a um preço que nunca chegou a ser registado no perp que estavas a negociar.

Depois há a execução. Os motores ingénuos fecham a posição ao preço de liquidação e registam a perda como se fosse um stop. Na realidade, o motor de liquidação assume o controlo da posição ao preço de falência — o nível em que a tua margem chega exatamente a zero, pior do que o nível de ativação — e cobra ainda uma comissão de liquidação, dependente do escalão e próxima de 1% do valor nominal nos escalões inferiores. Com alavancagem de 20x, 1% do valor nominal corresponde 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 plataformas, se o fundo se esgotar, as perdas socializadas atingem também o lado lucrativo do livro de ordens. A perda realizada não é a queda até ao preço de liquidação. É maior, e o excesso atinge o máximo precisamente nos dias em que o livro tinha pouca liquidez e a situação era pior.

A questão do momento, ligada à mecânica intrabar, também se aplica aqui, e com consequências mais graves do que o habitual. Se uma barra de 1-minute incluir tanto o teu take-profit como o teu nível de liquidação, um backtest que verifica as saídas antes da margem registará alegremente o lucro. A plataforma verifica a margem a cada atualização do mark price, aproximadamente uma vez por segundo, antes de tudo o que gostarias que acontecesse.

O que o motor tem de acompanhar em vez disso

Nada disto precisa de ser complexo. Precisa de manter o estado. A conta é um objeto com um saldo, não uma série de retornos, e é atualizada em cada barra pela ordem que a plataforma seguiria:

  1. Saldo da carteira e PnL não realizado, separadamente. O rácio de margem é a margem de manutenção dividida pelo saldo de margem, que inclui o PnL não realizado. Confundi-los faz uma posição perdedora parecer ter mais colateral do que realmente tem.
  2. A tabela de escalões de cada símbolo, versionada por data. Os escalões são revistos. Um backtest de 2023 executado com os escalões de 2026 introduz um viés subtil de antecipação — geralmente favorável, uma vez que as plataformas têm vindo, de modo geral, a flexibilizar os requisitos para os principais ativos ao longo do tempo.
  3. Uma série de mark price, não apenas klines. Se não conseguires obter o histórico de mark price, indica-o nos resultados e usa uma aproximação conservadora. Nunca substituas silenciosamente pelo último preço.
  4. Verifica a margem primeiro na ordem dos eventos da barra, antes dos stops, dos alvos, dos sinais ou do reequilíbrio.
  5. Execuções ao preço de falência, mais a comissão de liquidação, com a taxa da comissão obtida da mesma linha de escalão que a taxa de margem de manutenção.
  6. Um estado terminal absorvente. Quando o capital próprio chega a zero, a execução termina. Sem redefinir a base, sem «assumir que o investidor acrescenta capital», sem continuar a série com um novo valor nominal.

É este último ponto que gera mais discussões. Alguém acaba sempre por dizer que uma mesa real depositaria mais colateral, por isso terminar a simulação é irrealisticamente severo. Talvez. Mas «esta estratégia funciona se continuares a injetar dinheiro depois de ir à falência» é uma afirmação que merece ser feita nesses termos e testada de propósito, com os reforços de capital como variável de entrada explícita, em vez de ser introduzida às escondidas como predefinição. Quando a escreves com honestidade, a maioria descobre que não era bem isso que queria dizer.

A vantagem prática de tudo isto: quando executas a mesma estratégia em simulação, em paralelo com a plataforma real, o rácio de margem apresentado pela corretora e o calculado pelo teu simulador devem acompanhar-se com uma diferença de 1 ou 2 pontos base ao longo de todo o dia. Podes verificar essa concordância a cada minuto, em todas as posições abertas, sem custos. É o teste de paridade mais barato de toda a infraestrutura e quase ninguém o faz — e quando os 2 valores divergem, a plataforma tem razão e tens um erro que vale a pena encontrar antes que a queda máxima o encontre por ti.

futuros perpétuosalavancagemliquidaçãomotor de margembacktesting
← Todos os artigos