31 de Agosto de 2026 · mercados de previsão

O que dá errado ao fazer backtest de mercados de previsão: um diário de 8 dias

O que dá errado ao fazer backtest de mercados de previsão: um diário de 8 dias

Mercados de previsão parecem a coisa mais fácil do mundo para fazer backtest. O preço fica entre [0, 1]. O pagamento é um dólar ou nada. Sem alavancagem, sem funding, sem basis, sem esquisitices de swap perpétuo às 00:00 UTC. Já tínhamos um backtester que lidava com perps de cripto, incluindo taxas, funding e impacto, e o plano era passar dois dias adaptando-o e depois começar a gerar estratégias.

Levou 8 dias. Aqui está o registro, mais ou menos em ordem, incluindo o dia em que a curva de patrimônio parecia incrível — e era mesmo.

Dia 1: o adaptador que deveria ser trivial

O mapeamento inicial era direto e parecia simples. Um mercado é um instrumento. O preço de YES é o preço. Comprar YES é assumir uma posição comprada; comprar NO é assumir uma posição vendida. A resolução é um fechamento forçado a 1.00 ou 0.00. É só alimentar a mesma série horária de preços no mesmo loop de eventos e pronto.

Esse mapeamento aguenta cerca de 90 minutos de contato com dados reais. A primeira coisa a desmoronar foi a série de retornos. Toda a nossa camada de risco — dimensionamento de posições, volatilidade-alvo, relatório de Sharpe — pressupunha retornos logarítmicos de um instrumento contínuo. Um mercado que vai de 0.04 a 0.00 tem retorno logarítmico indefinido e uma perda total bem definida. E um mercado cotado a 0.04 três dias antes da resolução é um objeto completamente diferente de outro cotado a 0.04 quatro minutos antes, embora as duas linhas indiquem 0.04.

Acabamos reparametrizando toda a série em função do tempo até a resolução, em vez do relógio, e tratando o PnL como terminal, não marcado a mercado. Foi a decisão certa, e ela invalidou todo o código de relatórios que vinha depois.

Dia 2: a fórmula das taxas é a estratégia

Na Kalshi, a taxa de negociação não é um desconto em pontos-base. Ela é quadrática em relação ao preço: aproximadamente 0.07 × contracts × P × (1−P), arredondada para cima ao centavo por ordem. Isso significa que a taxa é maior justamente onde um mercado de cara ou coroa é mais interessante, e quase nula nos extremos.

PreçoTaxa por contratoVantagem necessária (pontos de prob.)Taxa como % do valor apostado
5¢0.33¢0.336.7%
10¢0.63¢0.636.3%
25¢1.31¢1.315.3%
50¢1.75¢1.753.5%
75¢1.31¢1.311.8%
90¢0.63¢0.630.7%
95¢0.33¢0.330.35%

Leia a terceira coluna como o que realmente importa: para empatar ao comprar a 50¢ e manter até a resolução, sua estimativa de probabilidade precisa superar a do mercado em 1.75 pontos. Não 1.75% em termos relativos. Em termos absolutos. Se você sair antes da resolução em vez de manter a posição, paga essa taxa duas vezes, além do spread.

3.5%taxa de ida a 50¢, como parte do valor apostado
1.75ppvantagem de probabilidade para empatar nesse preço
1resolução por instrumento, no total

O CLOB da Polymarket historicamente tem um perfil de taxas bem diferente, próximo de zero na própria negociação, o que transfere todo o custo para o spread e a profundidade. Assim, a mesma lógica de estratégia tem uma economia completamente diferente conforme a plataforma, e qualquer comparação entre plataformas que use um único modelo de taxas é ficção. Agora usamos uma função de taxas por plataforma, não um valor escalar.

Se você ler uma única linha de um relatório de backtest de mercados de previsão, leia a linha das taxas em pontos de probabilidade. Uma estratégia que alega ter uma vantagem de previsão de 1.2 ponto em mercados a 50¢ dá prejuízo na Kalshi antes de qualquer outro custo. Isso precisa estar visível na primeira página, sem o leitor ter que deduzir.

Dia 3: o livro é uma escada e é curto

Nosso modelo de impacto era uma função de raiz quadrada calibrada com livros de ofertas de perps de BTC. O formato está errado. Com tick de 1¢ num instrumento de $1, há apenas 99 níveis de preço possíveis em todo o livro, e um mercado com liquidez mediana pode ter algumas centenas de contratos no nível mais alto e, depois, um salto.

Aqui está um retrato de um mercado de dados econômicos que estávamos amostrando, lado YES, cerca de 30 horas antes da resolução:

NívelQuantidade (contratos)Custo acumulado da compra
42¢310310 a 42.0¢ em média
43¢85395 a 42.2¢ em média
45¢140535 a 42.9¢ em média
49¢6001,135 a 46.1¢ em média

Uma ordem de 1,000 contratos — quinhentos dólares em risco, um erro de arredondamento em cripto — desloca o preço efetivo em quatro centavos. Quatro centavos são mais que o dobro da taxa. Não há função suave para ajustar aqui; você percorre o livro nível por nível ou inventa os números. Apagamos o modelo de raiz quadrada para essa classe de ativos e escrevemos um código que percorre o livro literalmente, mais lento e correto.

Em algum momento, percebi que estava irritado porque esses mercados são "pequenos demais para importar". São pequenos porque o que está sendo precificado é uma única pergunta do mundo real, com prazo definido, e não há tanta gente com opinião sobre os pedidos iniciais de auxílio-desemprego nos EUA numa quarta-feira. O tamanho é o mercado. Reclamar disso é como reclamar que uma mesa de pôquer só tem lugar para 9 pessoas.

Dia 4: o dia em que a curva de patrimônio ficou linda

Sharpe de 4.1 em 1,400 mercados. Suave. Todo pesquisador deveria sentir um frio na barriga ao ver isso; eu senti, só que uns 40 minutos depois de já ter tirado uma captura de tela.

O bug estava no reamostrador. O histórico de preços de mercados ilíquidos chega com timestamps irregulares, então reindexamos tudo numa grade horária uniforme. O último ponto de cada série arquivada é o valor de liquidação, 1.00 ou 0.00. Nossa reindexação usava preenchimento pelo vizinho mais próximo sem restringir a direção, então, em qualquer mercado cuja última negociação tivesse ocorrido horas antes da resolução, o valor de liquidação se propagava para trás pelo intervalo. O modelo lia a resposta de amanhã na linha de hoje, justamente nos mercados ilíquidos em que podia aumentar a posição sem esbarrar nos limites de profundidade.

O preenchimento pelo vizinho mais próximo funciona num instrumento contínuo. Num instrumento cuja última observação é a verdade final, ele vira uma máquina de lookahead. Agora verificamos que todo preenchimento só avance no tempo e que a linha de liquidação esteja marcada e excluída de qualquer cálculo de atributos. Essa verificação tem 9 linhas e é o código mais valioso que escrevemos na semana inteira.

Dias 5–6: 1,412 mercados, cerca de 180 apostas

O tamanho da amostra em mercados de previsão é uma armadilha com cara amigável. Você resolve 1,412 mercados, sente que tem 1,412 observações e calcula um t-stat de acordo. Mas 14 jogos da NFL no mesmo domingo compartilham o mesmo sistema meteorológico, a divulgação de relatórios de lesões e um fluxo comum de apostadores. Cinquenta e um mercados eleitorais estaduais compartilham uma única oscilação nacional. "X vai acontecer até 31 de março" e "X vai acontecer até 30 de junho" são a mesma aposta, com vencimentos diferentes, e resolvem juntos.

Agrupamos os mercados por fonte do evento subjacente e data de resolução e chegamos a uma contagem efetiva independente perto de 180. Isso não basta para distinguir uma vantagem real do ruído nos tamanhos de efeito que estávamos analisando, e nenhuma quantidade de bootstrap por mercado resolve o problema, porque o bootstrap precisa reamostrar grupos, não linhas. Errar nisso infla silenciosamente sua significância por um fator de 2 ou 3.

Dia 7: a resolução também é uma distribuição de probabilidade

As coisas que não tínhamos modelado, descobertas do jeito difícil:

Adicionamos um termo de custo de manutenção e uma variação aleatória da data de resolução ao simulador. Nenhum dos dois é preciso. Ambos são melhores do que pressupor implicitamente que a resolução ocorre com certeza exatamente na data indicada.

Dia 8: o que deixaríamos de lado e o que faríamos primeiro

  1. Deixe de lado toda a estrutura baseada em retornos. Não adapte uma camada de risco com volatilidade-alvo a um instrumento com pagamento terminal. Escreva uma camada de dimensionamento de apostas que trabalhe com probabilidade e valor apostado. Perdemos 2 dias tentando fazer a antiga funcionar.
  2. Construa a função de taxas antes da estratégia. Trace a curva da vantagem de equilíbrio para cada plataforma em que pretende negociar e deixe-a visível acima da sua mesa. Ela elimina cerca de metade das ideias antes mesmo de custarem uma execução de backtest.
  3. Percorra o livro desde o primeiro dia. Qualquer modelo paramétrico de impacto importado de um mercado contínuo estará errado de um jeito que favorece você.
  4. Agrupe antes de contar. Decida a chave de agrupamento para calcular o tamanho efetivo da amostra ao mesmo tempo que define o universo, não depois de encontrar um Sharpe de que goste.
  5. Verifique a direção do preenchimento. Uma linha por junção. Se uma série termina na verdade final, trate o preenchimento para trás como um bug por definição, em vez de algo que você espera perceber numa revisão.

Os 8 dias valeram a pena, em grande parte porque os mercados de previsão eliminam a ambiguidade que torna tão fácil se enganar com backtests de cripto. Não há taxa de funding para ignorar nem convenção de preço de marcação para discutir. Só uma pergunta, um prazo e uma resposta. Quando o backtest está errado aqui, dá para apontar exatamente onde.

mercados de previsãobacktestingtaxasmicroestrutura de mercadoengenharia de dados
← Todos os artigos