31 de outubro de 2026 · microestrutura

Fizemos backtest na Binance e paper trading na Bybit. A vantagem era o lag.

Fizemos backtest na Binance e paper trading na Bybit. A vantagem era o lag.

Tínhamos uma estratégia de momentum de BTC de 1 minuto que parecia honesta na Binance. Comissões taker, funding, um termo de impacto de raiz quadrada que já tínhamos tornado um pouco demasiado severo. Walk-forward que não nos envergonhava. A conta paper vivia na Bybit, porque era lá que estavam as chaves. Disse a mim mesmo que BTC é BTC. Na sexta-feira tinha uma estratégia que tinha estado a negociar um lead-lag que não conseguíamos preencher, e um Sharpe que pertencia a uma exchange onde não tínhamos conta.

Segunda-feira: um backtest limpo na Binance

O agente tinha cuspido algo quase aborrecido: retorno de 15 barras contra uma média lenta, long ou short na abertura da barra seguinte, fechar numa stop ou ao fim de doze minutos. Forçámo-lo para o BTCUSDT USD-M da Binance, de 2023 até ao início de 2026, e recusámo-nos a olhar para qualquer coisa bruta de custos.

Depois de 4.0 bps taker, funding horário e impacto, o Sharpe walk-forward ficou em 1.6. A vantagem líquida média por fill era 3.4 bps. O número de trades era suficientemente alto para eu deixar de mexer no bootstrap. A margem de latência que já acrescentamos para a nossa stack (do sinal à ordem, 40 milissegundos num bom dia) mal o mexeu. Lembro-me de ter ficado levemente irritado por não ser mais frágil.

Terça-feira: a conta paper começa a "escorregar"

O paper entrou ao vivo às 09:12 UTC. O mesmo código, os mesmos parâmetros, a mesma regra de "next open", apontado ao BTCUSDT linear da Bybit. A primeira tarde pareceu uma série de azar. Estávamos a preencher 2–8 bps pior do que o replay da Binance dos mesmos minutos, sempre na direção do trade. O blotter dizia slippage. Acreditei no blotter até as falhas se agruparem nos minutos em que a Binance já tinha começado a correr.

Durante a noite, o gap não reverteu à média da forma como um modelo de fill ruidoso reverte à média. Ficou ali. Uma compra na Bybit imprimiu a um preço que a Binance tinha mostrado um instante antes, depois a Bybit chegou, depois pagámo-lo. E os minutos que a estratégia queria eram os minutos em que os dois tapes discordavam. Nos minutos calmos, os closes estavam uns em cima dos outros e a estratégia não ligava. Estava a selecionar divergência e a chamar-lhe alpha.

3.4 bpsvantagem líquida média por fill na Binance
4.1 bpsgap mediano de close nos minutos em que realmente negociámos
1.6 → 0.4Sharpe walk-forward após um rerun nativo da Bybit

Quarta-feira: dois tapes, um relógio

Fomos buscar os dois feeds de last-trade, alinhámos pelos timestamps das exchanges, e fizemos uma pergunta indelicada: quando o BTC se movia pelo menos dois ticks, qual venue imprimia primeiro? Nas horas calmas a Binance liderava a Bybit em cerca de dois terços desses impulsos, lead mediano à volta de 40 milissegundos, o que cabe em muitas conversas de "nós acrescentámos latência" e fica fora de uma barra de 1 minuto. Durante o print do CPI de terça-feira o lead esticou-se para centenas de milissegundos, e durante alguns segundos feios os dois last prices estavam separados por $80. Fiquei ali com as duas ladders abertas, a ver a Bybit perseguir um filme que a Binance já tinha exibido.

Esse foi o sabor da semana, e não está no Sharpe. Pode-se saber, intelectualmente, que os last prices de cripto são locais à venue. É diferente ver a mesma moeda em duas janelas e perceber que uma delas vive no passado.

Depois fizemos o teste que eu deveria ter exigido na segunda-feira. Manter o sinal da Binance. Preencher na next open da Bybit. Esse é o conjunto de informação real da conta paper se se espreita o tape líquido e se negocia noutro sítio, e é também uma forma de lookahead que nunca se consegue em tamanho: está-se a usar um preço que a venue de execução ainda não imprimiu. A vantagem foi para 0.6 bps. Inverta-se (sinal Bybit, fill Binance) e cunha-se uma fantasia. A Binance na mesma venue ficou em 3.4. A "estratégia" era sobretudo estar no livro mais rápido.

Se a venue do sinal lidera a venue de execução, cada fill da barra seguinte no tape de investigação é um preço que a conta ainda não viu oferecido. Misturar esses relógios não é um parâmetro de slippage. É um fill inventado.

O gap de close de 1 minuto nos minutos em que negociámos tinha uma mediana de 4.1 bps. Incondicional, em todos os minutos, era cerca de 1.5. Claro. O sinal dispara quando alguém já começou a mexer. Tínhamos estado a medir a vantagem na amostra selecionada, que é exatamente onde vive o desacordo entre venues.

Costumava pensar que o pior bug de venue era o mapeamento de símbolos, BTCUSDT versus BTC-PERP, um join que duplica silenciosamente uma posição. Isso é contabilidade. Isto foi estar a ver dois livros durante o CPI e perceber que tinha investigado um mercado que não negocio.

Quinta-feira: o funding, os marks e as comissões também não eram o mesmo mercado

Quando se admite que os last prices são diferentes, tem de se admitir que o resto do contrato de market data também o é. Tínhamos copiado a tabela de comissões da Binance para uma conta paper da Bybit e depois perguntávamo-nos porque é que a linha de custos se desviava.

EntradaBacktest BinancePaper Bybit, nessa semana
Last priceBinance USD-MBybit linear
Comissão taker4.0 bps5.5 bps
Intervalo de fundinghorário00 / 08 / 16 UTC
Mark / índicecabaz Binancecabaz Bybit
Qty mín. / tick0.001 / 0.100.001 / 0.10
Matemática de liquidaçãonunca atingida, BTCmark diferente, mesmo assim nunca atingida

O tick e o lote coincidiram no BTC. Não generalizaria isso. No livro da SOL que espreitámos na quinta à noite, o tick size e o nocional mínimo diferiam ambos, e o gap de close nos minutos de trade era 11 bps. O funding era a fuga mais lenta. A Binance estava a pagar de hora a hora. A Bybit ainda estava no relógio de oito horas para aquele linear. Uma posição mantida através das 01:00 UTC recebia um encargo da Binance no ledger de investigação e silêncio no paper, depois um naco às 08:00 que o backtest já tinha gotejado. O carry coincidia ao longo de uma semana e discordava ao longo de uma tarde, que é exatamente o horizonte em que esta estratégia vivia.

As comissões eram quase aborrecidas, e mesmo assim comeram 1.5 bps de uma história de 3.4 bps. As pessoas tratam 4.0 versus 5.5 como uma nota de rodapé porque parece pouco ao lado de um movimento diário de 2%. Não é pouco ao lado de uma vantagem de 3.4 bps. Já sabíamos isso. Tínhamos apenas aplicado o conhecimento à tabela da venue errada.

Sexta-feira: um rerun nativo da Bybit

Reconstruir tudo em OHLCV da Bybit, stamps de funding da Bybit, 5.5 bps da Bybit. O mesmo code path, os mesmos cortes walk-forward, a mesma função de impacto. Sharpe 0.4. Vantagem líquida média 0.9 bps, que está dentro do ruído de uma estratégia taker de 1 minuto assim que se deixa de lhe oferecer o primeiro olhar da Binance.

Era um mercado diferente, não um mais ruidoso. O paper não tinha rejeitado o backtest porque o paper é "mais realista" em abstrato. O paper tinha estado a executar num livro que a investigação nunca viu. O 1.6 era internamente consistente. Era consistente acerca da exchange errada.

Deixámos a versão Binance no arquivo com uma nota no relatório: não façam paper desta conta contra este tape. A versão Bybit é a que continua a correr, num número sobre o qual ninguém escreveria um thread. Esse é o resultado correto. Ainda sinto um pouco a falta do 1.6, que é como se sabe que estava a fazer trabalho que não tinha merecido.

O que saltaríamos da próxima vez

O atalho era sociológico. A Binance é o tape que todos os vendors, todos os notebooks de investigação, todos os defaults de agente vos querem pôr na mão. A conta está onde quer que se tenha realmente conseguido abri-la. Esses dois factos parecem um pormenor operacional. São o backtest.

  1. Escolher primeiro a venue de execução. Construir o tape de investigação a partir dos last prices, stamps de funding, marks, ticks e escalão de comissões dessa venue. Se o default do vendor é a Binance, isso não é um default. É uma estratégia diferente.
  2. Se não se conseguir histórico da venue onde se vai fazer paper, não substituir por um tape líder e chamar slippage ao gap. Ou esperar, ou tratar o tape estrangeiro como um sinal atrasado e aplicar-lhe lag até poder ter sido visto no livro de execução.
  3. Quando se compara paper com backtest, separar o drift: gap de last price nos minutos de trade, linha de comissões, timestamps de funding, mark usado para as stops. O blotter de terça-feira misturou os quatro e rotulou-os de slippage.
  4. Correr o teste cruzado de propósito. Sinal em A, fill em B. Se é aí que vive toda a vantagem, não se tem uma estratégia. Tem-se um lead-lag no qual não se será preenchido em tamanho.

Ainda espreitaria a Binance quando estiver a negociar na Bybit? Para um sanity check discricionário, claro. Para um fill, não. A conta paper já nos disse o que vale esse espreitar. Vale os 4.1 bps que a outra sala imprimiu primeiro, e esses não os recebemos.

futuros de criptobacktestingpaper tradingmicroestrutura de mercadolead-lag
← Todos os artigos