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 por meio de uma ferramenta própria 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 é por falta de habilidade minha. É que o cálculo de PnL (lucro e perda) do PM é uma armadilha. A API oficial fornece números incorretos, e os sites de análise de terceiros também exibem rankings errados. Você escreve seu próprio script para calcular? Provavelmente também está errado.
Quão grande é a discrepância? O terceiro colocado no ranking, kch123, calculou uma perda de $3,5 milhões usando um método errado, enquanto o lucro real foi de $11,4 milhões. Não é uma diferença de alguns pontos percentuais — é que o símbolo de lucro e perda está invertido.
Este artigo detalha cada erro que cometi. Se você negocia, desenvolve ferramentas ou acompanha rankings, cedo ou tarde vai se deparar com eles.
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, diferença 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, dois tiveram o símbolo de lucro e perda invertidos.
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.
No arquivo JSONL de dados de negociações, 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.
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 com que eu subestimasse $133 na side de compra. Testando na Polygon, confirmei que um único txHash realmente pode ter 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.
Na API /activity, usar offset para paginação? Se passar de 3000 registros, 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 “max historical activity offset of 3000 exceeded”. Jogadores com dezenas de milhares de negociações não conseguem passar de 3000.
Usar o parâmetro end (com o timestamp da última entrada da página anterior - 1) para paginação não tem limite.
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 é menor que $10 (devido à volatilidade do valor de mercado das posições). Mas se a diferença for maior, pode ser por: janela de agregação do ranking, atraso na atualização do cache ou múltiplas wallets proxy vinculadas ao usuário.
Na prática, ao usar 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 diferença for grande, primeiro verifique se a paginação está completa (erro 4) e se está usando os campos corretos (erros 1-2).
Depois de testar várias abordagens, a mais confiável que validei é usar a API de dados para somar fluxo de caixa. Sem campos pré-calculados, apenas somando as entradas e saídas de fundos a partir dos registros brutos.
Fórmula:
PnL = SOMA (negociações onde side=VENDER) + SOMA (REDEEM) + SOMA (MERGE) + SOMA (REBAIXA_DO_MAKER) + SOMA (REWARD) - SOMA (negociações onde side=COMPRAR) - SOMA (SPLIT) + valor de mercado das posições
· TRADE COMPRAR: gastar USDC para comprar token (saída)
· TRADE VENDER: vender token para recuperar USDC (entrada)
· REDEEM: resgatar USDC de posições vencedoras (entrada)
· SPLIT: criar tokens a partir de USDC (saída)
· MERGE: fundir tokens de volta em USDC (entrada)
· REBAIXA_DO_MAKER: comissão de maker (entrada)
· REWARD: recompensas ou airdrops (entrada)
· Fonte de dados:
GET /activity?user=<endereço>&limit=500, paginar com end, somar por tipo após obter todos os registros.
· Valor de mercado das posições:
GET /positions?user=<endereço>, calcular size × preço atual.
· Validação cruzada:
Comparar o resultado com a API de ranking do Polymarket (lb-api.polymarket.com/profit?window=all&address=X). Diferença menor que $10 é aceitável. Discrepâncias vêm da volatilidade do valor de mercado.
Após calcular pelo método de fluxo de caixa, validar com a API do ranking:
swisstony: fluxo de caixa +$5,601,000, ranking +$5,601,000, diferença < $10
kch123: fluxo de caixa +$11,396,000, ranking +$11,396,000, diferença < $10
gmanas: fluxo de caixa +$5,024,000, ranking +$5,024,000, diferença < $10
As diferenças entre os três endereços estão dentro de $10, sendo causadas pela volatilidade do valor de mercado.
Depois de validar o método, apliquei para analisar centenas de endereços de destaque, e os resultados foram outros.
SOMA(cashPnl) de /positions → não funciona, não inclui lucros realizados, pode inverter sinais
Soma do campo makerPnl → não funciona, não condiz com fluxo de caixa na cadeia
Calculado após deduzir por txHash → não funciona, perde negociações reais acima de $100
Paginação por offset + soma → não funciona, dados truncados, erro acima de 3000
Método de fluxo de caixa na API de dados → atualmente o mais confiável, com diferença menor que $10
Para quem faz quant, o primeiro passo não é encontrar alpha. É garantir que seus cálculos estão corretos.
Tudo acima vem de experiências reais, não de teoria. A API do PM pode mudar a qualquer momento, então recomenda-se validar periodicamente com a API de ranking.
Link do artigo original
Clique para conhecer as vagas na BlockBeats
Participe do grupo oficial da BlockBeats no Telegram:
Telegram assinatura: https://t.me/theblockbeats
Telegram grupo de discussão: https://t.me/BlockBeats_App
Conta oficial no Twitter: https://twitter.com/BlockBeatsAsia
Related Articles
Ghost Fills da Polymarket cai do pico de 30% para 0,17% após o lançamento das carteiras de depósito
Aquisição lucrativa de conta de US$ 1,6 milhão $170K no valor de apostas de vitória do Spurs na 77 centavos na Polymarket
Dicas Oficiais de Membro do Polymarket Sinalizam Lançamento do Token POLY Muito Em Breve
Roundhill apresenta nova data de vigência para o primeiro ETF de mercado de previsões do mundo, marcado para 11 de maio
As compras de contas da Polymarket de US$ 103.000 impulsionam uma diferença de -10,5 no Jogo 1 dos playoffs da NBA contra o Timberwolves
Clear Street se torna o primeiro FCM institucional a firmar parceria com a Kalshi em mercados de previsão