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

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

我在 Polymarket 自研自动化交易半年,踩过的最大坑不是策略失灵,是连自己赚了多少钱都算不对。
ポリマーケットで自作の自動取引を半年間行ってきたが、最も大きな落とし穴は戦略の失敗ではなく、自分がいくら稼いだかすら正しく計算できていなかったことだ。

不是我菜。是 PM 的 PnL 计算本身就是雷区。官方 API 给你的数字是错的,第三方分析网站展示的排名也是错的。你自己写脚本算?大概率还是错的。
私が下手なわけではない。PMのPnL計算自体が落とし穴だ。公式APIが提供する数字は誤っているし、サードパーティの分析サイトが表示するランキングも誤っている。自分でスクリプトを書いて計算?おそらくほぼ間違っている。

偏差有多离谱?排行榜第 3 名 kch123,用错误方法算出来亏 $350 万,实际盈利 $1140 万。不是差几个百分点——是盈亏符号都反了。
偏差はどれほどひどいのか?ランキング第3位のkch123は誤った方法で計算し、3,500,000ドルの損失と出たが、実際の利益は1,140万ドルだった。誤差は数ポイントの差ではなく、損益の符号さえ逆になっていた。

这篇把我踩过的每个坑拆开讲。做交易的、写工具的、看排行榜的,迟早会遇到。
この記事では、私が経験した各落とし穴を詳しく解説する。取引をする人も、ツールを作る人も、ランキングを見る人も、いずれ直面するだろう。

坑 1:cashPnl 不包含已结算的盈利
落とし穴1:cashPnlは既に決済された利益を含まない

最直觉的做法:拉 /positions 接口,求和 cashPnl(现金盈亏)字段。
最も直感的な方法:/positions APIを呼び出し、cashPnl(現金損益)フィールドの合計を求める。

拿排行榜前 15 的三个地址实测:
実測:ランキング上位15のアドレス3つで検証:

**swisstony:**cashPnl 求和 +$3.5 万,排行榜实际 +$560 万,差 158 倍
**swisstony:**cashPnlの合計 +3.5万ドル、実際のランキングは +560万ドル、差は158倍

**kch123:**cashPnl 求和 -$352 万,排行榜实际 +$1140 万,符号反转
**kch123:**cashPnlの合計 -352万ドル、実際は+1140万ドル、符号が逆

**gmanas:**cashPnl 求和 -$264 万,排行榜实际 +$502 万,符号反转
**gmanas:**cashPnlの合計 -264万ドル、実際は+502万ドル、符号が逆

三个地址,两个盈亏符号直接反了。
この3つのアドレスのうち、2つは損益の符号が逆になっている。

原因:/positions 接口返回的 cashPnl 不包含已 closed/redeemed 的 realized PnL。赢了的仓位被自动赎回成 USDC 后,这个 position 就从 API 响应里消失了。留下来的是未结算的持仓——往往以浮亏为主。
原因:/positions APIが返すcashPnlには、既にクローズまたは償還された実現損益が含まれていない。勝ったポジションは自動的にUSDCに償還され、その後そのポジションはAPIのレスポンスから消える。残るのは未決済のポジションで、多くは含み損の状態。

你以为在算全部盈亏,其实只拿到了未结算的部分。
あなたは全ての損益を計算しているつもりだが、実際には未決済部分だけを取得している。

坑 2:makerPnl 字段与链上现金流不一致
落とし穴2:makerPnlフィールドとオンチェーンのキャッシュフローが一致しない

交易数据 JSONL 里有个 makerPnl(做市盈亏)字段,看名字就是给你算 PnL 用的。别信。
取引データのJSONLにはmakerPnl(マーケットメイカーの損益)フィールドがあるが、その名前は損益計算用だと示しているだけ。信用しないこと。

我在做市数据中观察到,SUM(makerPnl) 算出来的数字跟链上现金流核算结果差了一个数量级。具体倍数可能因场景不同而变化,但方向一致:makerPnl 的内部计算逻辑跟实际 USDC 流动对不上。
マーケットメイカーのデータを観察したところ、SUM(makerPnl)で計算した数字はオンチェーンのキャッシュフローの結果と1桁違いだった。具体的な倍率はシナリオによって異なるが、方向性は一致している:makerPnlの内部計算ロジックは実際のUSDCの流れと一致しない。

不管偏差多大,结论一样:不要用这个字段算 PnL。
偏差がどれほど大きくても、結論は同じ:このフィールドを使って損益を計算しないこと。

坑 3:不能按 txHash 单独去重
落とし穴3:txHash(取引ハッシュ)だけで重複除去してはいけない

这个最反直觉。
これは最も直感に反する。

同一个 txHash(交易哈希)出现了多条记录,正常人第一反应:重复数据,去重。
同じtxHashの取引が複数記録されている場合、普通の人は最初に思う:重複データなので除外。

不能这么做。PM 的 CLOB(链上限价订单簿)在一笔链上交易里可以撮合多个 maker 订单,同一个 txHash 下的多条记录是真实的独立 fill。
しかしこれをやってはいけない。PMのCLOB(オンチェーンの指値注文簿)は、一つの取引内で複数のメイカー注文を成立させることができる。同じtxHashの複数記録は、それぞれが実際の独立した埋め合わせ(fill)である。

我之前按 txHash + asset 去重,BUY 侧少算了 $133。上 Polygon 链验证,一个交易哈希里确实有多个独立的 USDC Transfer event,每条都对应一笔真实成交。
以前はtxHash +資産で重複除去していたが、買い側の損益を13.3万ドル少なく見積もっていた。Polygonチェーンで検証したところ、一つの取引ハッシュには複数のUSDC送金イベントがあり、それぞれが実際の取引に対応している。

结论:不能按 txHash alone 去重。要算 PnL,直接对 /activity 原始数据求和。
結論:txHashだけで重複除去してはいけない。損益を計算するには、/activityの生データを直接合計する。

坑 4:offset 翻页有天花板
落とし穴4:offsetによるページングには上限がある

/activity 接口翻页,用 offset(偏移量)?超过 3000 条直接 400 报错。文档里没写。
/activity APIのページングでoffset(オフセット)を使う?3000件を超えると直接HTTP 400エラーになる。ドキュメントには記載なし。

上面三个地址全部验证过:GET /activity?offset=3100 返回 HTTP 400,错误信息 max historical activity offset of 3000 exceeded。头部玩家动辄上万笔交易,3000 条根本不够。
上記の3つのアドレスで検証済み:GET /activity?offset=3100はHTTP 400を返し、「最大履歴アクティビティオフセットは3000を超えています」とのエラー。トッププレイヤーは何万件もの取引を行っており、3000件では足りない。

用 end 参数(传上一页最后一条的时间戳 - 1)做游标翻页,没有上限。
endパラメータ(前ページの最後のタイムスタンプ-1)を使ったカーソルページングには上限がない。

坑 5:排行榜 PnL 口径差异
落とし穴5:ランキングのPnL計算基準の違い

你算完一个地址的 PnL,去排行榜一对比,差了一点。
あるアドレスの損益を計算し、ランキングと比較すると少し差が出る。

大多数情况下差距在 $10 以内(来自持仓市值的实时波动)。但如果差距明显更大,可能的原因包括:排行榜的聚合窗口、缓存刷新延迟、或者用户绑定了多个 proxy wallet。
ほとんどの場合、差は10ドル以内(ポジションの時価評価のリアルタイム変動による)。しかし、差が明らかに大きい場合、その原因としては、ランキングの集計ウィンドウ、キャッシュの更新遅延、またはユーザーが複数のプロキシウォレットを紐付けている可能性がある。

实测中,用现金流法算出的单地址 PnL 跟 lb-api 返回值高度一致。如果你的结果差距较大,先检查翻页是否完整(坑 4)、是否用了错误字段(坑 1-2)。
実測では、キャッシュフロー法で計算した単一アドレスの損益は、lb-apiの返す値と非常に一致している。もし結果に大きな差がある場合は、まずページングが完全か(落とし穴4)、誤ったフィールドを使っていないか(落とし穴1-2)を確認。

正确做法
正しい方法

试了各种歪路之后,我验证下来最可靠的方法是 Data API 现金流汇总。不用任何预计算字段,直接从原始交易记录算资金进出。
いろいろ試行錯誤した結果、最も信頼できるのはData APIのキャッシュフローの合計を使う方法だ。事前計算されたフィールドを使わず、生の取引記録から資金の出入りを直接計算する。

公式:
式:

PnL = SUM(TRADE where side=SELL) + SUM(REDEEM) + SUM(MERGE) + SUM(MAKER_REBATE) + SUM(REWARD) - SUM(TRADE where side=BUY) - SUM(SPLIT) + 持仓市值
PnL = 売り取引の合計 + 償還の合計 + マージの合計 + メイカーリベートの合計 + 報酬の合計 - 買い取引の合計 - スプリットの合計 + ポジションの時価評価

· TRADE BUY:花 USDC 买 token(支出)
· TRADE SELL:売 token 回収 USDC(収入)
· REDEEM:赢的仓位赎回 USDC(収入)
· SPLIT:USDC 鋳造成 token 对(支出)
· MERGE:token対合併回USDC(収入)
· MAKER_REBATE:Maker 返佣(収入)
· REWARD:奖励/空投(収入)

· 数据来源:
· データソース:

GET /activity?user=

&limit=500,用 end 翻页,全量拉取后按类型求和。
GET /activity?user=<アドレス>&limit=500で、endパラメータを使ってページングし、全データを取得後、種類ごとに合計。

· 持仓市值:
· ポジションの時価評価:

GET /positions?user=

,size × curPrice。
GET /positions?user=<アドレス>、size × 現在価格

· 交叉验证:
· クロスチェック:

拿计算结果跟 Polymarket 排行榜 API(lb-api.polymarket.com/profit?window=all&address=X)对比,差 <$10 就算过。差距来自持仓市值的实时波动。
計算結果をPolymarketのランキングAPI(lb-api.polymarket.com/profit?window=all&address=X)と比較し、差が10ドル未満なら合格とする。差はポジションの時価評価のリアルタイム変動による。

验证:排行榜前 15 实测
検証:ランキング上位15の実測結果

用现金流法算完后,拿排行榜 API 交叉验证:
キャッシュフロー法で計算した後、ランキングAPIとクロスチェック:

swisstony:现金流法 +$560.1 万,排行榜 +$560.1 万,差距 < $10
swisstony:キャッシュフロー法 +560万ドル、ランキング +560万ドル、差は10ドル未満

kch123:现金流法 +$1139.6 万,排行榜 +$1139.6 万,差距 < $10
kch123:キャッシュフロー法 +1139.6万ドル、ランキング +1139.6万ドル、差は10ドル未満

gmanas:现金流法 +$502.4 万,排行榜 +$502.4 万,差距 < $10
gmanas:キャッシュフロー法 +502.4万ドル、ランキング +502.4万ドル、差は10ドル未満

三个地址误差均在 $10 以内,差距来自持仓市值的实时波动。
3つのアドレスの誤差はすべて10ドル以内で、差はポジションの時価評価のリアルタイム変動による。

方法跑通之后,我拿它分析了上百个头部地址的真实盈亏。那是另一回事了。
この方法が動作することを確認した後、何百もの主要アドレスの実損益を分析した。これは別の話だ。

汇总
まとめ

SUM(cashPnl) from /positions → 不行,不含已结算盈利,符号可能反转
SUM(cashPnl) from /positions → 不適切、既に決済済みの利益を含まない、符号も逆になる可能性

makerPnl 字段求和 → 不行,与链上现金流不一致
makerPnlフィールドの合計 → 不適切、オンチェーンのキャッシュフローと一致しない

按 txHash 去重后计算 → 不行,$100+,删了真实 fill
txHashで重複除去 → 不適切、100ドル超の取引も除外され、実際の埋め合わせを失う

offset 翻页 + 求和 → 不行,数据截断,>3000 报错
offsetページング +合計 → 不適切、データが切り捨てられ、3000超でエラー

Data API 现金流法 → 目前最可靠,<$10
Data APIのキャッシュフロー法 → 現時点で最も信頼できる、差は10ドル未満

做量化的第一步不是找 alpha。是先确认你算得对。
クオンツの第一歩はアルファを見つけることではなく、自分の計算が正しいかどうかを確認することだ。

以上全部来自实盘踩坑,不是理论推导。PM 的 API 随时可能调整行为,建议定期用排行榜 API 交叉验证你的计算结果。
これらはすべて実取引での失敗経験に基づくものであり、理論的な推論ではない。PMのAPIは随時動作を変更する可能性があるため、定期的にランキングAPIと照合して計算結果を検証することを推奨する。

原文链接
原文リンク

点击了解律动BlockBeats 在招岗位
こちらをクリックして律動BlockBeatsの募集ポジションを確認

欢迎加入律动 BlockBeats 官方社群:
公式コミュニティに参加しませんか:

Telegram 订阅群:https://t.me/theblockbeats
Telegram購読グループ:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App
Telegram交流グループ:https://t.me/BlockBeats_App

Twitter 官方账号:https://twitter.com/BlockBeatsAsia
Twitter公式アカウント:https://twitter.com/BlockBeatsAsia

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