Originaltitel: „Polymarket PnL präzise berechnen: Warum deine Gewinn- und Verlustrechnung möglicherweise komplett falsch ist“
Originalautor: Leo, Krypto-Analyst
Ich habe ein halbes Jahr lang automatisierten Eigenentwicklungs-Handel bei Polymarket betrieben, der größte Fehler war nicht eine Strategie, die versagt hat, sondern dass ich nicht einmal richtig berechnen konnte, wie viel ich tatsächlich verdient habe.
Es liegt nicht an meiner Unfähigkeit. Es ist, weil die PnL-Berechnung von PM selbst eine Fallgrube ist. Die offiziellen API-Zahlen, die dir angezeigt werden, sind falsch, die Rankings auf Drittanbieter-Websites ebenfalls. Du schreibst dein eigenes Skript? Wahrscheinlich auch falsch.
Wie groß ist die Abweichung? Der Drittplatzierte im Ranking, kch123, hat mit falscher Methode einen Verlust von 3,5 Mio. USD berechnet, tatsächlicher Gewinn sind 11,4 Mio. USD. Es sind keine ein paar Prozentpunkte – die Gewinn- und Verlustsymbole sind sogar umgekehrt.
In diesem Beitrag werde ich jeden Fehler, den ich gemacht habe, aufschlüsseln. Für Trader, Tool-Entwickler und Ranking-Analysten – früher oder später wird man darauf stoßen.
Der naheliegende Ansatz: Die /positions-API aufrufen, alle cashPnl (Bargeld-Gewinn/-Verlust) Felder summieren.
Praktische Tests mit den Top 15 Adressen im Ranking:
swisstony: cashPnl Summe +35.000 USD, tatsächliches Ranking +5,6 Mio. USD, Differenz um den Faktor 158
kch123: cashPnl Summe -3,52 Mio. USD, tatsächliches Ranking +11,4 Mio. USD, Vorzeichen umgekehrt
gmanas: cashPnl Summe -2,64 Mio. USD, tatsächliches Ranking +5,02 Mio. USD, Vorzeichen umgekehrt
Bei diesen drei Adressen sind zwei Gewinn- und Verlustsymbole direkt vertauscht.
Ursache: Die /positions-API gibt das cashPnl nicht für bereits geschlossene/ eingelöste Positionen zurück. Wenn eine Gewinnposition automatisch in USDC eingelöst wird, verschwindet diese Position aus der API-Antwort. Es verbleiben nur noch offene Positionen – meist mit unrealisiertem Verlust.
Du denkst, du berechnest den gesamten Gewinn/Verlust, aber in Wirklichkeit hast du nur den noch offenen Teil erfasst.
In den JSONL-Handelsdaten gibt es ein Feld makerPnl (Market Maker Gewinn/Verlust), der Name deutet an, dass es für die PnL-Berechnung gedacht ist. Aber glaub nicht daran.
Ich habe beobachtet, dass die Summe von makerPnl in den Marktdaten um eine Größenordnung von den tatsächlichen on-chain Cashflows abweicht. Die genaue Differenz hängt vom Szenario ab, aber die Richtung ist immer gleich: Die interne Logik von makerPnl stimmt nicht mit den tatsächlichen USDC-Flows überein.
Egal wie groß die Abweichung ist – das Fazit bleibt: Dieses Feld nicht für die PnL-Berechnung verwenden.
Das ist das Gegenteil der Intuition.
Wenn eine txHash (Transaktions-Hash) mehrere Einträge hat, denkt man: Das sind doppelte Daten, man sollte sie entfernen.
Aber so funktioniert es nicht. Das CLOB (On-Chain-Limit-Orderbuch) bei PM kann in einer Transaktion mehrere Maker-Orders ausführen. Mehrere Einträge mit demselben txHash sind echte, unabhängige Fills.
Ich habe früher nach txHash + Asset dedupliziert, dabei wurden auf der Polygon-Chain 133 USD an Trades nicht mitgezählt. Bei der Überprüfung auf Polygon gibt es tatsächlich mehrere unabhängige USDC-Transfer-Events pro txHash, jeder entspricht einem echten Trade.
Fazit: Nicht nur nach txHash deduplizieren. Für die PnL-Berechnung direkt die Rohdaten von /activity summieren.
Bei der Paginierung der /activity-API mit offset (Versatz)? Überschreitet man 3000 Einträge, gibt es direkt einen 400-Fehler. Das steht nicht in der Dokumentation.
Alle drei Adressen wurden überprüft: GET /activity?offset=3100 liefert HTTP 400, die Fehlermeldung lautet „max historical activity offset of 3000 exceeded“. Top-User haben oft Zehntausende Transaktionen, 3000 sind viel zu wenig.
Mit dem end-Parameter (letzte Zeile minus 1) als Cursor gibt es keine Begrenzung.
Wenn du das PnL einer Adresse berechnest und es mit dem Ranking vergleichst, gibt es manchmal Abweichungen.
In den meisten Fällen sind es weniger als 10 USD (durch Schwankungen im Marktwert der Positionen). Aber wenn die Differenz deutlich größer ist, könnten Gründe sein: Das Ranking nutzt unterschiedliche Zeitfenster, Cache-Refresh-Verzögerungen oder der Nutzer hat mehrere Proxy-Wallets verbunden.
In meinen Tests stimmt die PnL, die ich mit der Bargeldfluss-Methode berechnet habe, sehr genau mit den lb-api-Antworten überein. Wenn die Abweichung groß ist, prüfe zuerst, ob das Paginieren vollständig ist (Fehler 4) und ob du die richtigen Felder benutzt hast (Fehler 1-2).
Nach verschiedenen Ansätzen habe ich die zuverlässigste Methode verifiziert: die Bargeldfluss-Zusammenfassung via Data API. Ohne Vorberechnungen, direkt aus den Rohdaten der Transaktionen den Geldfluss ermitteln.
Formel:
PnL = SUM(Trades mit side=SELL) + SUM(Redeem) + SUM(Merge) + SUM(Maker_Rebate) + SUM(Reward) - SUM(Trades mit side=BUY) - SUM(Split) + Positionswert
· Trades BUY: USDC ausgeben, um Token zu kaufen (Ausgabe)
· Trades SELL: Token verkaufen, USDC zurückerhalten (Einnahme)
· Redeem: Gewinn-Position in USDC einlösen (Einnahme)
· Split: USDC in Token umwandeln (Ausgabe)
· Merge: Token in USDC umwandeln (Einnahme)
· Maker_Rebate: Maker-Rückvergütung (Einnahme)
· Reward: Belohnungen / Airdrops (Einnahme)
· Datenquelle:
GET /activity?user=
&limit=500, mit end paginieren, alles abrufen und nach Typ summieren.· Positionswert:
GET /positions?user=
, Größe × aktueller Preis.· Quervergleich:
Vergleiche die berechneten Ergebnisse mit der Polymarket-Ranking-API (lb-api.polymarket.com/profit?window=all&address=X). Differenz < $10 gilt als akzeptabel. Abweichungen kommen durch Schwankungen im Positionswert.
Nach der Berechnung mit der Bargeldfluss-Methode, Cross-Check mit der Ranking-API:
swisstony: Bargeldfluss +5,6 Mio. USD, Ranking +5,6 Mio. USD, Differenz < $10
kch123: Bargeldfluss +11,4 Mio. USD, Ranking +11,4 Mio. USD, Differenz < $10
gmanas: Bargeldfluss +5,02 Mio. USD, Ranking +5,02 Mio. USD, Differenz < $10
Alle drei Adressen weichen weniger als 10 USD voneinander ab, die Differenz ist auf Schwankungen im Positionswert zurückzuführen.
Nachdem die Methode funktioniert, habe ich sie auf Hunderte von Top-Adressen angewandt, um deren echte Gewinne und Verluste zu analysieren. Das ist eine andere Geschichte.
SUM(cashPnl) aus /positions → Funktioniert nicht, da es geschlossene Gewinne nicht einschließt, Vorzeichen können sich umkehren.
Summe des makerPnl-Feldes → Funktioniert nicht, stimmt nicht mit den on-chain Cashflows überein.
Nach Deduplication nach txHash → Funktioniert nicht, bei Beträgen über 100 USD werden echte Fills gelöscht.
Offset-Paginierung + Summierung → Funktioniert nicht, Daten werden abgeschnitten, bei mehr als 3000 Einträgen Fehler.
Data API Bargeldfluss-Methode → Derzeit die zuverlässigste, < $10 Abweichung.
Der erste Schritt beim Quant-Trading ist nicht, Alpha zu finden. Sondern sicherzustellen, dass die eigene Berechnung korrekt ist.
Alle oben genannten Fehler basieren auf realen Erfahrungen, nicht auf theoretischer Überlegung. Da die PM-API jederzeit Änderungen vornehmen kann, empfiehlt es sich, regelmäßig mit der Ranking-API zu cross-checken.
Original-Link
Klick hier, um mehr über die Jobangebote bei律动BlockBeats zu erfahren
Willkommen im offiziellen Telegram-Community von律动BlockBeats:
Telegram Abonnement-Gruppe: https://t.me/theblockbeats
Telegram Diskussionsgruppe: https://t.me/BlockBeats_App
Twitter Offiziell: https://twitter.com/BlockBeatsAsia
Verwandte Artikel
Vitalik sagt voraus, dass sich Prognosemärkte auf dezentrale Oracles verlagern, und fordert als Nächstes eine private Stimmabgabe
US-Medienrecherche: Polymarket hat seinen Hauptsitz in Panama bei einer Anwaltskanzlei und hatte zuvor FTX-Dienstleistungen angeboten
MicroStrategy plant, Bitcoin zu verkaufen, um STRC-Dividenden zu finanzieren, und weicht von der „Never Sell“-Politik ab
Polymarket: Wal kauft 133.000 US-Dollar Thunder-Spread-Wette im NBA-Western-Semifinale Spiel 1 zu 50¢
Polymarket-Teammitglied lässt Hinweise fallen: Start des POLY-Tokens steht kurz bevor