原文标题:《Polymarket PnL 精准计算:为什么你算的盈亏可能全是错的》
原文作者:Leo,加密分析师
ผมทำการเทรดอัตโนมัติบน Polymarket ด้วยระบบเองเป็นเวลา半年 สิ่งที่ผมเจอไม่ใช่กลยุทธ์ล้มเหลว แต่คือความผิดพลาดในการคำนวณกำไรขาดทุนของตัวเอง
ไม่ใช่เพราะผมอ่อนหัด แต่เพราะการคำนวณ PnL ของ PM เองเป็นกับดัก ข้อมูลที่ API ทางการให้มานั้นผิด เว็บไซต์วิเคราะห์ของบุคคลที่สามก็แสดงอันดับผิดเช่นกัน คุณเขียนสคริปต์คำนวณเอง? โอกาสยังผิดสูง
ความเบี่ยงเบนมันรุนแรงแค่ไหน? อันดับ 3 ของตาราง kch123 คำนวณด้วยวิธีผิด ขาดทุน 3.5 ล้านดอลลาร์ แต่กำไรจริง 11.4 ล้านดอลลาร์ ไม่ใช่แค่ต่างกันไม่กี่เปอร์เซ็นต์ — แต่สัญลักษณ์ของกำไรขาดทุนยังกลับกันเลย
บทความนี้จะแยกแต่ละกับดักที่ผมเจอมาอธิบาย ทำการเทรด, เขียนเครื่องมือ, ดูอันดับ ก็ต้องเจอแน่นอน
วิธีที่ตรงที่สุดคือเรียก /positions แล้วรวมผลลัพธ์ของฟิลด์ cashPnl (กำไรขาดทุนเป็นเงินสด)
ทดสอบกับ 3 ที่อยู่ในอันดับ 15 อันดับแรก:
swisstony: รวม cashPnl +$35,000 แต่ในอันดับจริง +$5.6 ล้าน ต่างกัน 158 เท่า
kch123: รวม cashPnl -$3.52 ล้าน แต่ในอันดับจริง +$11.4 ล้าน สัญลักษณ์กลับกัน
gmanas: รวม cashPnl -$2.64 ล้าน แต่ในอันดับจริง +$5.02 ล้าน สัญลักษณ์กลับกัน
ทั้งสามที่อยู่ สองรายสัญลักษณ์กำไรขาดทุนตรงกันข้ามเลย
เหตุผล: /positions ที่ API ส่งกลับมานั้นไม่รวมกำไรขาดทุนที่เคลียร์แล้ว (realized PnL) เมื่อเปิด position แล้วชนะและถูกไถ่ถอนเป็น USDC แล้ว ตำแหน่งนั้นจะหายไปจากการตอบสนองของ API เหลือไว้แต่ตำแหน่งที่ยังไม่ปิด ซึ่งมักเป็นขาดทุนลอยตัว
คุณคิดว่าคำนวณกำไรขาดทุนทั้งหมดแล้ว แต่จริงๆ ได้แค่ส่วนที่ยังไม่ปิดเท่านั้น
ข้อมูลการเทรดใน JSONL มีฟิลด์ makerPnl (กำไรขาดทุนจากการเป็น maker) ชื่อก็ชี้ให้เห็นว่าคือใช้คำนวณ PnL แต่ไม่เชื่อ
ผมสังเกตในข้อมูล market-making ว่า ผลรวมของ makerPnl ที่คำนวณออกมานั้นต่างจากผลลัพธ์ของการคำนวณเงินสดบน链เป็นจำนวนมาก ข้อแตกต่างอาจขึ้นอยู่กับสถานการณ์ แต่แนวทางเดียวกันคือ logic การคำนวณ makerPnl ภายในไม่ตรงกับการไหลของ USDC จริงบน链
ไม่ว่าจะเบี่ยงเบนมากแค่ไหน สรุปคือ: ห้ามใช้ฟิลด์นี้คำนวณ PnL
นี่เป็นสิ่งที่ตรงกันข้ามกับความรู้สึกธรรมดา
เมื่อ txHash (แฮชธุรกรรม) เดียวกันปรากฏหลายรายการ คนทั่วไปจะคิดว่าเป็นข้อมูลซ้ำ ควรลบซ้ำ
แต่ไม่ใช่แบบนั้น เพราะ CLOB (ออเดอร์บอร์ดบน链) ของ PM สามารถจับคู่หลายคำสั่ง maker ในธุรกรรมเดียวกันได้ รายการหลายรายการภายใต้ txHash เดียวกันเป็น fill จริงที่แยกกัน
ผมเคยลบซ้ำโดยใช้ txHash + asset แต่พลาดไป $133 บน Polygon chain ยืนยันได้ว่ามีหลาย USDC Transfer event ในธุรกรรมเดียวกัน แต่ละรายการเป็นการซื้อขายจริง
สรุป: ห้ามใช้ txHash เพียงอย่างเดียวในการลบซ้ำ คำนวณ PnL ต้องรวมข้อมูลดิบจาก /activity โดยตรง
การเลื่อนหน้าข้อมูล /activity ด้วย offset? ถ้าเกิน 3000 รายการ จะขึ้น 400 error ไม่มีในเอกสาร
ทั้งสามที่อยู่ด้านบนทดสอบแล้ว: GET /activity?offset=3100 จะได้ HTTP 400 พร้อมข้อความว่า max historical activity offset of 3000 exceeded ผู้เล่นระดับสูงมักมีธุรกรรมเป็นหมื่นรายการ 3000 รายการไม่พอแน่นอน
ใช้พารามิเตอร์ end (ส่ง timestamp ของรายการสุดท้ายในหน้าก่อน - 1) เป็นตัวชี้ตำแหน่งในการเลื่อนหน้า ไม่มีขีดจำกัด
คุณคำนวณ PnL ของที่อยู่หนึ่งแล้วไปเปรียบเทียบในอันดับ ก็มีความแตกต่างเล็กน้อย
ส่วนใหญ่ความแตกต่างอยู่ใน $10 (จากความผันผวนของมูลค่าตำแหน่งแบบเรียลไทม์) แต่ถ้าความแตกต่างชัดเจนมากขึ้น สาเหตุอาจเป็น: ช่วงเวลาการรวมข้อมูลในอันดับ, การรีเฟรชแคชล่าช้า, หรือผู้ใช้ผูกหลาย proxy wallet
จากการทดสอบ ผมพบว่าการคำนวณด้วยวิธี cash flow ตรงกับ API อันดับสูงสุดมากที่สุด หากผลต่างมาก ให้ตรวจสอบการเลื่อนหน้าว่าครบถ้วน (กับดัก 4) และใช้ฟิลด์ผิด (กับดัก 1-2) ก่อน
หลังจากลองหลายวิธี ผมยืนยันว่าการใช้ Data API สรุปเงินสดเป็นวิธีที่เชื่อถือได้ที่สุด โดยไม่ต้องใช้ฟิลด์คำนวณล่วงหน้า คำนวณจากบันทึกธุรกรรมดิบโดยตรง
สูตร:
PnL = SUM(TRADE where side=SELL) + SUM(REDEEM) + SUM(MERGE) + SUM(MAKER_REBATE) + SUM(REWARD) - SUM(TRADE where side=BUY) - SUM(SPLIT) + มูลค่าตำแหน่ง
· TRADE BUY:ใช้ USDC ซื้อโทเคน (ค่าใช้จ่าย)
· TRADE SELL:ขายโทเคนคืน USDC (รายรับ)
· REDEEM:ไถ่ถอนตำแหน่งที่ชนะเป็น USDC (รายรับ)
· SPLIT:USDC หลอมเป็นโทเคน (ค่าใช้จ่าย)
· MERGE:โทเคนรวมกลับเป็น USDC (รายรับ)
· MAKER_REBATE:ค่าคืนจาก Maker (รายรับ)
· REWARD:รางวัล/airdrops (รายรับ)
· แหล่งข้อมูล:
GET /activity?user=
&limit=500 ใช้ end ในการเลื่อนหน้า ดึงข้อมูลครบแล้วรวมตามประเภท· มูลค่าตำแหน่ง:
GET /positions?user=
คูณ size ด้วยราคาปัจจุบัน· การตรวจสอบข้าม:
เปรียบเทียบผลลัพธ์กับ Polymarket ranking API (lb-api.polymarket.com/profit?window=all&address=X) ถ้าความแตกต่างน้อยกว่า <$10 ถือว่าผ่าน ความแตกต่างมาจากความผันผวนของมูลค่าตำแหน่งแบบเรียลไทม์
หลังคำนวณด้วยวิธี cash flow แล้ว เปรียบเทียบกับ API อันดับ:
swisstony: cash flow +$5.6 แสน ด้านอันดับ +$5.6 แสน ความแตกต่าง < $10
kch123: cash flow +$1.14 ล้าน ด้านอันดับ +$1.14 ล้าน ความแตกต่าง < $10
gmanas: cash flow +$502,400 ด้านอันดับ +$502,400 ความแตกต่าง < $10
ทั้งสามรายความผิดพลาดน้อยกว่า $10 ความแตกต่างมาจากความผันผวนของมูลค่าตำแหน่งแบบเรียลไทม์
หลังจากวิธีนี้ใช้งานได้ ผมวิเคราะห์กำไรขาดทุนของที่อยู่ระดับหัวหน้าเป็นร้อยๆ ราย การวิเคราะห์นั้นเป็นอีกเรื่องหนึ่ง
SUM(cashPnl) จาก /positions → ใช้ไม่ได้ ไม่รวมกำไรขาดทุนที่เคลียร์แล้ว สัญลักษณ์อาจกลับกัน
การรวมฟิลด์ makerPnl → ใช้ไม่ได้ ไม่ตรงกับเงินสดบน链
คำนวณหลังลบซ้ำด้วย txHash → ใช้ไม่ได้ เกิน $100 ลบ fill จริงออกไป
เลื่อนหน้าด้วย offset แล้วรวม → ใช้ไม่ได้ ข้อมูลถูกตัด, เกิน 3000 ขึ้น error
วิธี cash flow API → เชื่อถือได้ที่สุดในตอนนี้ ความผิดพลาด <$10
การทำ quant ไม่ใช่การหา alpha แต่คือการยืนยันว่าคุณคำนวณถูก
ทั้งหมดนี้เป็นประสบการณ์จากการเจอจริง ไม่ใช่ทฤษฎี API ของ PM อาจปรับเปลี่ยนได้ตลอด ควรตรวจสอบผลด้วย API อันดับเป็นระยะ
ลิงก์ต้นฉบับ
คลิกเพื่อดูแนวทางของ BlockBeats ในการรับสมัครงาน
เข้าร่วมกลุ่มชุมชนทางการของ BlockBeats ได้ที่:
Telegram กลุ่มติดตาม: https://t.me/theblockbeats
Telegram กลุ่มสนทนา: https://t.me/BlockBeats_App
Twitter ทางการ: https://twitter.com/BlockBeatsAsia
btc.bar.articles
a16z สนับสนุน CFTC ในจดหมายความคิดเห็นวันศุกร์ โดยอ้างอิงกฎตลาดคาดการณ์ของรัฐว่าเป็นอุปสรรคในการเข้าถึง
Polymarket、Kalshi มียอดการซื้อขายสะสมแตะ 150 พันล้านดอลลาร์สหรัฐ: เดือนเมษายนเพียงเดือนเดียว 21.9 พันล้านดอลลาร์สหรัฐ สร้างสถิติสูงสุดใหม่
a16z หนุน CFTC พร้อมเตือนว่ากฎตลาดการทำนายระดับรัฐสร้างอุปสรรคต่อการเข้าถึงตลาด
Polymarket และ Kalshi ทำยอดปริมาณตลอดอายุการซื้อขายที่รวมกันสูงสุด $150B ในเดือนเมษายน
กองทุน ETF ของ Ethereum ร่วงลงติดต่อกัน 4 วันติดต่อกันที่ระดับสูงกว่า $184M
Gemini ได้รับใบอนุญาต DCO จาก CFTC ซึ่งช่วยให้สามารถทำการหักบัญชีการซื้อขายภายในได้บนแพลตฟอร์ม Titan