原文标题:《Polymarket PnL 精准计算:为什么你算的盈亏可能全是错的》
原文作者:Leo,加密分析师
ผมทำการเทรดอัตโนมัติบน Polymarket ด้วยระบบพัฒนาเองเป็นเวลา 6 เดือน สิ่งที่ผมเจอไม่ใช่กลยุทธ์ล้มเหลว แต่คือความผิดพลาดในการคำนวณกำไรขาดทุนของตัวเอง
ไม่ใช่เพราะผมอ่อนหัด แต่เพราะการคำนวณ 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 ล้าน สัญลักษณ์กลับกัน
ทั้งสามที่อยู่ สองรายสัญลักษณ์กำไรขาดทุนตรงกันข้ามเลย
เหตุผล: API /positions ส่งคืน cashPnl ที่ไม่รวมกำไรขาดทุนที่เคลียร์แล้ว (realized PnL) กำไรที่ได้จากตำแหน่งที่ชนะจะถูกถอนออกเป็น USDC อัตโนมัติ ตำแหน่งนั้นก็จะหายไปจากข้อมูล API เหลือไว้แต่ตำแหน่งที่ยังไม่ปิด ซึ่งมักเป็นตำแหน่งที่ขาดทุนอยู่
คุณคิดว่าคำนวณกำไรขาดทุนทั้งหมดแล้ว แต่จริงๆ แล้วได้แค่ส่วนที่ยังไม่ปิดเท่านั้น
ข้อมูลการเทรดใน JSONL มีฟิลด์ makerPnl (กำไรขาดทุนจากการเป็นผู้สร้างตลาด) ชื่อก็ชี้ให้เห็นว่าใช้คำนวณ PnL แต่ไม่ควรเชื่อ
ผมสังเกตในข้อมูลการเป็นผู้สร้างตลาดว่า ผลรวมของ makerPnl ที่คำนวณออกมานั้นต่างจากผลการคำนวณเงินสดบน链เป็นจำนวนมาก แนวโน้มคือ logic การคำนวณ makerPnl ภายในกับการเคลื่อนไหวของ USDC จริงบน链ไม่ตรงกัน
ไม่ว่าจะเบี่ยงเบนมากแค่ไหน สรุปคือ: ห้ามใช้ฟิลด์นี้คำนวณ PnL
นี่เป็นสิ่งที่ตรงข้ามกับความรู้สึกที่สุด
ถ้า txHash (รหัสธุรกรรม) ปรากฏหลายรายการ คนปกติจะคิดว่าเป็นข้อมูลซ้ำ ควรลบซ้ำ
แต่ไม่ใช่อย่างนั้น เพราะ CLOB (สมุดคำสั่งบน链) ของ PM สามารถจับคู่คำสั่งหลายคำในธุรกรรมเดียวกันได้ รายการหลายรายการภายใต้ txHash เดียวกันเป็น fill จริงที่แยกกัน
ผมเคยลบซ้ำโดยใช้ txHash + asset ทำให้พลาดไป 133 ดอลลาร์ บน Polygon ผมตรวจสอบแล้วพบว่าธุรกรรมเดียวกันใน txHash มีหลาย event การโอน USDC แต่ละอันเป็นการทำธุรกรรมจริง
สรุป: ห้ามลบซ้ำโดยใช้ 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 ให้ผลลัพธ์ของ PnL ของที่อยู่เดียวกันกับ API ของ 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 ถือว่าผ่าน ความแตกต่างมาจากความผันผวนของมูลค่าตำแหน่งแบบเรียลไทม์
คำนวณด้วยวิธี 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 → ใช้ไม่ได้ เกิดความผิดพลาดในธุรกรรมจริง
การเลื่อน offset แล้วรวม → ใช้ไม่ได้ ข้อมูลถูกตัดขาด >3000 รายการ error
วิธี cash flow จาก 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
Vitalik คาดการณ์ว่าตลาดคาดการณ์กำลังเปลี่ยนไปใช้ออราเคิลแบบกระจายอำนาจ พร้อมเรียกร้องให้มีการลงคะแนนแบบส่วนตัวครั้งต่อไป
สื่อสหรัฐฯ สืบสวน: Polymarket มีสำนักงานใหญ่ในปานามา โดยเป็นบริษัทกฎหมาย และเคยให้บริการกับ FTX
MicroStrategy วางแผนขาย Bitcoin เพื่อหาเงินจ่ายเงินปันผล STRC โดยเปลี่ยนจากนโยบาย “ไม่ขาย” อย่างเด็ดขาด
วาฬ Polymarket ซื้อการเดิมพันแบบส่วนต่าง (spread) Thunder มูลค่า 133,000 ดอลลาร์ ในเกม NBA รอบรองชนะเลิศสายตะวันตก นัดที่ 1 ที่ราคา 50¢
สมาชิกทีม Polymarket ปล่อยเบาะแส เปิดตัวโทเค็น POLY ใกล้จะเกิดขึ้น