Cálculo preciso do PnL na Polymarket: por que o seu lucro e prejuízo podem estar incorretos?

Título original: 《Cálculo preciso de PnL na Polymarket: Por que seus lucros e perdas podem estar totalmente errados》
Autor original: Leo, analista de criptomoedas

Tenho trabalhado com automação de negociações na Polymarket há seis meses, e o maior erro que cometi não foi uma estratégia falha, mas sim não conseguir calcular corretamente quanto ganhei ou perdi.

Não sou incompetente. O problema está na própria fórmula de cálculo de PnL da PM. Os números fornecidos pela API oficial estão incorretos, e os rankings exibidos por sites de análise de terceiros também estão errados. Você escreve seu próprio script? Provavelmente também está errado.

Quão grande é a discrepância? O terceiro colocado no ranking, kch123, calculou uma perda de US$ 3,5 milhões usando um método errado, enquanto o lucro real foi de US$ 11,4 milhões. Não é uma questão de alguns pontos percentuais — o símbolo de lucro e perda está invertido.

Este artigo detalha cada erro que cometi. Se você faz negociações, desenvolve ferramentas ou acompanha rankings, cedo ou tarde enfrentará esses problemas.

Erro 1: cashPnl não inclui lucros realizados já liquidados

A abordagem mais intuitiva: usar a interface /positions, somar o campo cashPnl (lucro/perda em dinheiro).

Testando com os três endereços no top 15 do ranking:

swisstony: soma de cashPnl +$35 mil, ranking real +$5,6 milhões, discrepância de 158 vezes

kch123: soma de cashPnl -$3,52 milhões, ranking real +$11,4 milhões, símbolo invertido

gmanas: soma de cashPnl -$2,64 milhões, ranking real +$5,02 milhões, símbolo invertido

Para esses três endereços, os sinais de lucro e perda estão invertidos em dois casos.

Razão: a API /positions retorna cashPnl sem incluir os lucros realizados que já foram liquidados. Quando uma posição vencedora é automaticamente resgatada em USDC, ela desaparece da resposta da API. O que fica são posições não liquidadas — geralmente com prejuízo flutuante.

Você acha que está calculando todo o lucro e perda, mas na verdade só está considerando a parte não liquidada.

Erro 2: o campo makerPnl não condiz com o fluxo de caixa na cadeia

No arquivo JSONL de dados de negociação há um campo makerPnl (lucro/perda do maker), que parece ser para calcular PnL. Mas não confie nele.

Percebi que, ao somar o makerPnl no dado de market making, o resultado difere de uma magnitude do fluxo de caixa na cadeia. A multiplicidade exata pode variar dependendo do cenário, mas a direção é sempre a mesma: a lógica interna do makerPnl não condiz com o fluxo real de USDC.

Por maior que seja a discrepância, a conclusão é a mesma: não use esse campo para calcular PnL.

Erro 3: não deduzir por txHash individualmente

Isso é contra a intuição.

Se um txHash (hash da transação) aparece várias vezes, a reação natural é: dados duplicados, remover.

Mas não pode fazer isso. O CLOB ( livro de ordens on-chain ) da PM pode combinar várias ordens maker em uma única transação na cadeia, e múltiplas entradas com o mesmo txHash representam execuções reais distintas.

Antes, eu deduzia por txHash + ativo, e isso fez eu subestimar US$ 133 na parte de compra. Verificando na Polygon, uma única transação realmente contém múltiplos eventos de transferência de USDC, cada um correspondendo a uma negociação real.

Conclusão: não deduza apenas por txHash. Para calcular PnL, some diretamente os dados brutos de /activity.

Erro 4: limite na paginação por offset

Na API /activity, usar offset para paginação? Se passar de 3000, dá erro 400. O documento não informa isso.

Testei com os três endereços: GET /activity?offset=3100 retorna HTTP 400, com a mensagem de erro “max historical activity offset of 3000 exceeded”. Jogadores com dezenas de milhares de transações, 3000 não é suficiente.

Usar o parâmetro end (passando o timestamp da última entrada da página anterior - 1) para paginação por cursor não tem limite.

Erro 5: diferenças na métrica de PnL do ranking

Depois de calcular o PnL de um endereço, ao comparar com o ranking, há uma pequena diferença.

Na maioria dos casos, a discrepância é inferior a US$ 10 (devido à volatilidade do valor de mercado das posições). Mas se a diferença for maior, as razões podem incluir: janela de agregação do ranking, atraso na atualização do cache ou múltiplas carteiras proxy vinculadas ao usuário.

Na prática, usando o método de fluxo de caixa, o PnL de um endereço individual bate quase exatamente com o valor retornado pela API lb-api. Se a sua diferença for grande, verifique se a paginação foi completa (erro 4) e se usou os campos corretos (erros 1-2).

Método correto

Depois de testar várias abordagens, a mais confiável que validei é a soma direta dos dados brutos de /activity, sem usar campos pré-calculados, apenas somando as entradas de transações originais.

Fórmula:

PnL = SOMA (negociações com side=SELL) + SOMA (REDEEM) + SOMA (MERGE) + SOMA (REBATE_MAKER) + SOMA (REWARD) - SOMA (negociações com side=BUY) - SOMA (SPLIT) + valor de mercado das posições

· TRADE BUY: gastar USDC para comprar tokens (saída)

· TRADE SELL: vender tokens para recuperar USDC (entrada)

· REDEEM: resgatar USDC de posições vencedoras (entrada)

· SPLIT: criar tokens a partir de USDC (saída)

· MERGE: consolidar tokens de volta em USDC (entrada)

· REBATE_MAKER: comissão de maker (entrada)

· REWARD: recompensas/audições (entrada)

· Fonte de dados:

GET /activity?user=<endereço>&limit=500, paginar com end, somar por tipo após obter todos os dados.

· Valor de mercado das posições:

GET /positions?user=<endereço>, tamanho × preço atual.

· Validação cruzada:

Comparar o resultado com o API de ranking da Polymarket (lb-api.polymarket.com/profit?window=all&address=X), diferença < US$ 10 é aceitável. A discrepância vem da volatilidade do valor de mercado.

Validação: top 15 do ranking, teste real

Após calcular pelo método de fluxo de caixa, validar com o API do ranking:

swisstony: fluxo de caixa +$5,601,000, ranking +$5,601,000, diferença < US$ 10

kch123: fluxo de caixa +$11,396,000, ranking +$11,396,000, diferença < US$ 10

gmanas: fluxo de caixa +$5,024,000, ranking +$5,024,000, diferença < US$ 10

As diferenças entre os três endereços estão dentro de US$ 10, devido à volatilidade do valor de mercado.

Depois de validar o método, apliquei-o para analisar o lucro e perda de centenas de endereços de destaque. E aí, a história mudou completamente.

Resumo

SOMA(cashPnl) de /positions → Não funciona, não inclui lucros realizados, o símbolo pode estar invertido.

Soma do campo makerPnl → Não funciona, não condiz com o fluxo de caixa na cadeia.

Calculado deduzindo por txHash → Não funciona, acima de US$ 100, elimina execuções reais.

Paginação por offset + soma → Não funciona, dados truncados, erro >3000.

Método de fluxo de caixa na API → Atualmente o mais confiável, com diferença inferior a US$ 10.

O primeiro passo na quantificação não é encontrar alpha. É garantir que seus cálculos estejam corretos.

Tudo acima vem de experiências reais, não de teoria. A API da PM pode mudar a qualquer momento, por isso recomenda-se validar periodicamente seus resultados com o ranking.

Link original

Clique para conhecer as vagas na BlockBeats

Participe do grupo oficial da BlockBeats:

Telegram: https://t.me/theblockbeats

Telegram: https://t.me/BlockBeats_App

Twitter oficial: https://twitter.com/BlockBeatsAsia

Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
  • Recompensa
  • Comentar
  • Republicar
  • Partilhar
Comentar
Adicionar um comentário
Adicionar um comentário
Nenhum comentário
  • Fixar