原文标题:《Polymarket PnL 精准计算:为什么你算的盈亏可能全是错的》
原文作者:Leo,加密分析师
ผมทำการเทรดอัตโนมัติบน Polymarket ด้วยระบบพัฒนาเองเป็นเวลา半年 สิ่งที่ผมเจอไม่ใช่กลยุทธ์ล้มเหลว แต่คือความผิดพลาดในการคำนวณกำไรขาดทุนของตัวเอง
ไม่ใช่ผมโง่ เป็นเพราะการคำนวณ PnL ของ PM เองเป็นจุดที่อันตราย ข้อมูลจาก API ทางการที่ให้มานั้นผิด เว็บไซต์วิเคราะห์บุคคลที่สามก็แสดงอันดับผิดเช่นกัน คุณเขียนสคริปต์คำนวณเอง? โอกาสก็ยังผิดอยู่ดี
ความเบี่ยงเบนมันรุนแรงแค่ไหน? อันดับ 3 ของตาราง kch123 คำนวณด้วยวิธีผิด ขาดทุน 3.5 แสนดอลลาร์ แต่กำไรจริง 1.14 ล้านดอลลาร์ ไม่ใช่แค่ต่างกันไม่กี่เปอร์เซ็นต์ — แต่สัญลักษณ์ของกำไรขาดทุนกลับกันหมด
บทความนี้จะแยกแต่ละจุดที่ผมเคยเจอมาอธิบาย ทำทั้งคนเทรด ทำเครื่องมือ และดูอันดับ ก็ต้องเจอในที่สุด
วิธีที่ตรงที่สุดคือดึงข้อมูล /positions แล้วรวมฟิลด์ cashPnl (กำไรขาดทุนเป็นเงินสด)
ทดสอบกับ 3 ที่อยู่ในอันดับ 15 ของตาราง:
swisstony: รวม cashPnl +$35,000 แต่ในอันดับจริง +$5.6 ล้าน ต่างกัน 158 เท่า
kch123: รวม cashPnl -$3.52 แสน แต่ในอันดับจริง +$11.4 ล้าน สัญลักษณ์กลับกัน
gmanas: รวม cashPnl -$2.64 แสน แต่ในอันดับจริง +$5.02 ล้าน สัญลักษณ์กลับกัน
ทั้งสามที่อยู่ สองรายสัญลักษณ์ของกำไรขาดทุนก็กลับกันไปแล้ว
เหตุผล: API /positions ที่ส่งกลับมานั้นไม่รวมกำไรขาดทุนที่เคลียร์แล้ว (realized PnL) กำไรที่ได้จากตำแหน่งที่ชนะจะถูกถอนออกเป็น USDC อัตโนมัติ ตำแหน่งนั้นก็จะหายไปจากข้อมูล API เหลือไว้แต่ตำแหน่งที่ยังไม่เคลียร์ — ซึ่งมักเป็นตำแหน่งที่ขาดทุนอยู่
คุณคิดว่าคำนวณกำไรขาดทุนทั้งหมดแล้ว จริงๆ แล้วได้แค่ส่วนที่ยังไม่เคลียร์เท่านั้น
ข้อมูลการเทรดใน JSONL มีฟิลด์ makerPnl (กำไรขาดทุนจากการเป็นผู้สร้างตลาด) ชื่อก็เหมือนจะใช้คำนวณ PnL แต่ไม่ใช่
ผมสังเกตในข้อมูลการเป็นผู้สร้างตลาดว่า ผลรวมของ makerPnl ที่คำนวณออกมานั้นต่างจากผลลัพธ์ของการคำนวณเงินสดบน链เป็นจำนวนมาก แนวโน้มอาจแตกต่างกันตามแต่ละสถานการณ์ แต่ทิศทางตรงกัน: กลไกการคำนวณ makerPnl ภายในไม่ตรงกับการเคลื่อนไหวของ USDC จริงบน链
ไม่ว่าจะเบี่ยงเบนมากแค่ไหน สรุปคือ: ห้ามใช้ฟิลด์นี้คำนวณ PnL
นี่เป็นสิ่งที่ตรงกันข้ามกับความรู้สึกธรรมดา
ถ้า txHash (รหัสธุรกรรม) ปรากฏหลายรายการ คนทั่วไปจะคิดว่าเป็นข้อมูลซ้ำ ควรลบซ้ำ
แต่ไม่ใช่แบบนั้น. CLOB (สมุดคำสั่งบน链) ของ PM สามารถจับคู่คำสั่งหลายคำสั่งในธุรกรรมเดียวกันได้ รายการหลายรายการภายใต้ txHash เดียวกันเป็น fill จริงที่แยกกัน
ก่อนหน้านี้ผมลบซ้ำโดยใช้ txHash + asset ทำให้ซื้อขายด้าน BUY ขาดไป 133 ดอลลาร์ ไปตรวจสอบบน Polygon ก็พบว่ามีหลาย event ของ USDC Transfer ที่แยกกันในแต่ละ txHash แต่ละรายการเป็นการซื้อขายจริง
สรุป: ห้ามลบซ้ำโดยใช้ txHash เพียงอย่างเดียว ต้องรวมข้อมูล /activity ทั้งหมดเพื่อคำนวณ PnL
การเลื่อนหน้าข้อมูล /activity ด้วย offset (ค่าชดเชย) ถ้าเกิน 3000 รายการ จะขึ้นข้อผิดพลาด 400 ซึ่งไม่ได้ระบุไว้ในเอกสาร
ทั้งสามที่อยู่ด้านบนได้รับการทดสอบแล้ว: GET /activity?offset=3100 จะได้ HTTP 400 ข้อความผิดพลาดว่า “max historical activity offset of 3000 exceeded” ผู้ใช้งานระดับหัวแถวมักมีธุรกรรมหลายหมื่นรายการ 3000 รายการจึงไม่เพียงพอ
ใช้พารามิเตอร์ end (ส่ง timestamp ของรายการสุดท้ายในหน้าก่อน - 1) เพื่อเลื่อนหน้าด้วย cursor ก็ไม่มีขีดจำกัด
คุณคำนวณ PnL ของที่อยู่หนึ่งแล้วไปเปรียบเทียบกับอันดับ ก็จะพบความแตกต่างเล็กน้อย
ส่วนใหญ่ความแตกต่างอยู่ในไม่เกิน 10 ดอลลาร์ (จากความผันผวนของมูลค่าตำแหน่งแบบเรียลไทม์) แต่ถ้าความแตกต่างชัดเจนมากขึ้น สาเหตุอาจเป็น: ช่วงเวลาการรวมข้อมูลในอันดับ, การรีเฟรชแคชล่าช้า, หรือผู้ใช้ผูกหลาย proxy wallet
จากการทดสอบด้วยวิธีเงินสด ผลลัพธ์ของแต่ละที่อยู่ตรงกับ lb-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 ด้วยราคาปัจจุบัน· การตรวจสอบข้าม:
เปรียบเทียบผลลัพธ์กับ API ของ Polymarket (lb-api.polymarket.com/profit?window=all&address=X) ถ้าความแตกต่างน้อยกว่า $10 ถือว่าผ่าน ความแตกต่างมาจากความผันผวนของมูลค่าตำแหน่งแบบเรียลไทม์
หลังจากคำนวณด้วยวิธีเงินสดแล้ว เปรียบเทียบกับ API ของอันดับ:
swisstony: วิธีเงินสด +$5.6 ล้าน, อันดับ +$5.6 ล้าน ความแตกต่าง < $10
kch123: วิธีเงินสด +$11.4 ล้าน, อันดับ +$11.4 ล้าน ความแตกต่าง < $10
gmanas: วิธีเงินสด +$5.02 ล้าน, อันดับ +$5.02 ล้าน ความแตกต่าง < $10
ความผิดพลาดของทั้งสามอยู่ในไม่เกิน $10 ความแตกต่างมาจากความผันผวนของมูลค่าตำแหน่งแบบเรียลไทม์
หลังจากวิธีนี้ใช้งานได้ ผมก็วิเคราะห์กำไรขาดทุนของที่อยู่ระดับหัวในหลายร้อยราย นั่นเป็นอีกเรื่องหนึ่ง
SUM(cashPnl) จาก /positions → ใช้ไม่ได้ ไม่รวมกำไรขาดทุนที่เคลียร์แล้ว สัญลักษณ์อาจกลับกัน
การรวมฟิลด์ makerPnl → ใช้ไม่ได้ ไม่ตรงกับเงินสดบน链
ลบซ้ำโดย txHash → ใช้ไม่ได้ เกิดความผิดพลาดในธุรกรรมจริง
เลื่อนหน้าด้วย offset + รวม → ใช้ไม่ได้ ข้อมูลถูกตัดขาด เกิน 3000 รายการขึ้นข้อผิดพลาด
วิธีเงินสดจาก Data 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
Prophet เปิดตัวตลาดคาดการณ์ที่ขับเคลื่อนด้วย AI พร้อมเงินลงทุนซื้อขายสดจำนวน 10,000 ดอลลาร์ วันนี้
MegaETH คาดการณ์มูลค่า FDV ในวันแรกอยู่ระหว่าง 1.5B ถึง 2B โดย Gate Prediction Market แสดงให้เห็น
Polymarket เพิ่มตลาดคาดการณ์เกี่ยวกับข้อตกลงสันติภาพสหรัฐ-อิหร่านก่อนการเยือนจีนของทรัมป์ โดยอัตราต่อรองปัจจุบันอยู่ที่ 7%
DeepBook เปิดตัวตลาดการคาดการณ์บน Sui testnet
Vitalik คาดการณ์ว่าตลาดคาดการณ์กำลังเปลี่ยนไปใช้ออราเคิลแบบกระจายอำนาจ พร้อมเรียกร้องให้มีการลงคะแนนแบบส่วนตัวครั้งต่อไป