Polymarket PnL正確計算:為什麼你算的盈虧可能是錯的?

robot
概要作成中

原文タイトル:《Polymarket PnL 精密計算:なぜあなたの損益計算はすべて間違っている可能性があるのか》
原文作者:Leo、暗号分析師

原文作者:律動BlockBeats

原文出典:

転載:火星财经

私はPolymarketで自作の自動取引を半年間行ってきたが、最大の落とし穴は戦略の失敗ではなく、自分がいくら儲けたかすら正しく計算できていなかったことだ。

私が下手なわけではない。問題はPMのPnL計算自体が落とし穴だということだ。公式APIが提供する数字は誤っているし、サードパーティの分析サイトが表示するランキングも誤っている。自分でスクリプトを書いて計算?それもほぼ間違っている可能性が高い。

偏差はどれほど離れているのか?ランキング第3位のkch123は誤った方法で計算し、損失を$350万と出したが、実際の利益は$1140万だった。差は数ポイントではなく、損益の符号すら逆になっている。

この記事では、私が経験した落とし穴を一つ一つ解説する。取引を行う人、ツールを作る人、ランキングを見る人、いずれも早晩直面するだろう。

落とし穴1:cashPnlは決済済みの利益を含まない

最も直感的な方法:/positionsインターフェースからcashPnl(現金損益)フィールドを合計する。

ランキング上位15のアドレス3つで実測:

swisstony:cashPnl合計 +$3.5万、実際のランキング +$560万、差は158倍

kch123:cashPnl合計 -$352万、実際のランキング +$1140万、符号が逆

gmanas:cashPnl合計 -$264万、実際のランキング +$502万、符号が逆

この3つのアドレスのうち、2つは損益の符号が逆になっている。

原因:/positions APIが返すcashPnlは、既にクローズまたは償還された実現損益(realized PnL)を含んでいないためだ。勝ったポジションは自動的にUSDCに償還されると、そのポジションはAPIのレスポンスから消える。残るのは未決済のポジションであり、これが多くの場合、含み損を抱えている。

あなたは全ての損益を計算していると思っているかもしれないが、実際には未決済部分だけを取得しているに過ぎない。

落とし穴2:makerPnlフィールドとオンチェーンのキャッシュフローが一致しない

取引データのJSONLにはmakerPnl(マーケットメイカーの損益)というフィールドがあるが、名前からして損益計算用だと思うだろう。だが、信じてはいけない。

私はマーケットデータを観察していて、SUM(makerPnl)で算出した数字とオンチェーンのキャッシュフローの結果とでは、桁違いの差があることに気づいた。具体的な倍率はシナリオによって異なるが、方向性は一貫している:makerPnlの内部計算ロジックは、実際のUSDCの流動と一致していない。

どれだけ偏差が大きくても、結論は同じ:このフィールドを使って損益を計算すべきではない。

落とし穴3:txHashだけで重複を除去してはいけない

これが最も直感に反する。

同じtxHash(取引ハッシュ)が複数のレコードとして出てきた場合、普通は「重複データだから除外しよう」と考えるだろう。しかし、そうしてはいけない。PMのCLOB(チェーン上のリミットオーダーブック)は、一つの取引内で複数のmaker注文をマッチさせることができる。同じtxHashの複数レコードは、実際にはそれぞれが独立した執行(fill)である。

私は以前、txHash +資産で重複除去を行ったが、その結果、BUY側の損益が$133少なくなった。Polygonチェーンで検証したところ、一つの取引ハッシュには複数のUSDC Transferイベントが存在し、それぞれが実際の取引に対応していることが確認できた。

結論:txHashだけで重複除去を行うのは誤り。損益を計算するには、/activityの生データをそのまま合計すべきだ。

落とし穴4:offsetによるページングには上限がある

/activityインターフェースのページングでoffset(オフセット)を使うと、3000件を超えると直接400エラーになる。ドキュメントには記載されていない。

上記の3つのアドレスで検証済み:GET /activity?offset=3100はHTTP 400を返し、「最大の過去活動オフセットは3000」とエラーメッセージが出る。トッププレイヤーは何万件もの取引を行っているため、3000件では全然足りない。

代わりに、endパラメータ(前ページの最後の取引のタイムスタンプ-1)を使ったカーソルページングは上限なし。

落とし穴5:ランキングの損益口径の違い

あるアドレスの損益を計算し、ランキングと比較すると、少し差が出る。

大半の場合、その差は$10以内(ポジションの時価総額のリアルタイム変動による)だが、差が大きい場合、その原因として考えられるのは:ランキングの集計ウィンドウ、キャッシュの更新遅延、または複数のproxy walletをユーザーが紐付けているケースなどだ。

実測では、キャッシュフロー法で計算した単一アドレスの損益は、lb-apiの返す値とほぼ一致している。もし差が大きい場合は、まずページングの完全性(落とし穴4)や誤ったフィールドの使用(落とし穴1-2)を確認すべきだ。

正しいやり方

さまざまな方法を試した結果、最も信頼できるのはData APIのキャッシュフロー集計だ。事前に計算されたフィールドに頼らず、原始的な取引記録から資金の流入出を直接算出する。

計算式:

損益 = SUM(売り取引) + SUM(償還) + SUM(マージ) + SUM(メーカーリベート) + SUM(報酬) - SUM(買い取引) - SUM(スプリット) + ポジションの時価総額

· TRADE BUY:USDCを使ってトークンを購入(支出)

· TRADE SELL:トークンを売ってUSDCを回収(収入)

· REDEEM:勝ったポジションのUSDC償還(収入)

· SPLIT:USDCをトークンに鋳造(支出)

· MERGE:トークンをUSDCに合併(収入)

· MAKER_REBATE:メーカーのリベート(収入)

· REWARD:報酬・エアドロップ(収入)

· データ取得:

GET /activity?user=&limit=500をendでページングし、全て取得後にタイプ別に合計。

· ポジションの時価総額:

GET /positions?user=、size×現在価格。

· クロス検証:

計算結果とPolymarketのランキングAPI(lb-api.polymarket.com/profit?window=all&address=X)を比較し、差が<$10なら合格。差はポジションの時価総額のリアルタイム変動による。

検証:ランキング上位15の実測

キャッシュフロー法で計算後、ランキングAPIとクロス検証:

swisstony:キャッシュフロー +$560.1万、ランキング +$560.1万、差 <$10

kch123:キャッシュフロー +$1139.6万、ランキング +$1139.6万、差 <$10

gmanas:キャッシュフロー +$502.4万、ランキング +$502.4万、差 <$10

これらのアドレスの誤差はすべて$10以内であり、差はポジションの時価総額のリアルタイム変動による。

この方法を使って、私は何百ものトップアドレスの実損益を分析した。これは別次元の話だ。

まとめ

SUM(cashPnl) from /positions → 不可、既に決済済みの利益を含まず、符号も逆になる可能性あり

makerPnlフィールドの合計 → 不可、オンチェーンのキャッシュフローと一致しない

txHashだけで重複除去 → 不可、$100超の取引も削除されてしまう

offsetページング+合計 → 不可、データが切り捨てられ、3000超でエラー

Data APIのキャッシュフロー集計 → 現時点で最も信頼できる、<$10

量的分析を始める第一歩は、アルファを探すことではない。まずは自分の計算が正しいことを確認することだ。

これらはすべて実盤での失敗から得た教訓であり、理論的な推論ではない。PMのAPIは随時仕様変更される可能性があるため、定期的にランキングAPIと照合して計算結果を検証することを推奨する。

原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • コメント
  • リポスト
  • 共有
コメント
コメントを追加
コメントを追加
コメントなし