⚠️ บันทึกการวิจัยและการเทรดส่วนตัว — ไม่ใช่คำแนะนำการลงทุน ผู้เขียนไม่ได้ให้บริการที่ปรึกษาการลงทุนที่มีใบอนุญาต
หนึ่งในการทดสอบที่น่าเชื่อถือที่สุดใน quantitative trading เรียกว่า "Information Coefficient" หรือ IC — ความสัมพันธ์ระหว่างสัญญาณกับผลตอบแทนในอนาคต คุณจัดอันดับหุ้นตามสัญญาณ วัดผลตอบแทน แล้วดูว่าหุ้นที่อยู่ในอันดับสูงกว่าให้ผลดีกว่าหุ้นอันดับต่ำกว่าหรือไม่ IC ที่เป็นบวกบอกว่าสัญญาณมีพลังในการพยากรณ์จริง
เราใช้ IC ทดสอบ RS rating: หุ้นที่มี RS เหนือ 80 วันนี้มีแนวโน้มจะ outperform เดือนหน้ามากกว่าหุ้นที่ RS ต่ำกว่า 80 หรือไม่?
ในการทดสอบช่วงแรก IC ของ RS rating ดูดีมาก หุ้น decile บนสุดปรากฏในกลุ่ม top performers สม่ำเสมอ ตัวเลขสมเหตุสมผล ช่วงความเชื่อมั่นไม่รวมศูนย์
จากนั้นผมค้นพบว่า 92% ของหุ้น "top performers" ในประวัติศาสตร์เหล่านั้น — ไม่มีอยู่จริง
Stale Data ทำอะไรกับ Backtests
ปัญหาเฉพาะเจาะจงกับวิธีที่ RS files ของเราถูกเก็บ หุ้นแต่ละตัวมีไฟล์ CSV ที่บันทึก RS ratings ต่อเนื่องตามเวลา เมื่อเราดึงข้อมูลใหม่ เราอัปเดตไฟล์ด้วย RS วันนี้ เมื่อเราไม่ดึง — เพราะหุ้นถูก delist, ถูกระงับ, หรือพลาดรอบการดึงข้อมูล — ไฟล์หยุดอัปเดต
สิ่งที่ทำให้อันตรายคือ: หุ้นที่ถูกซื้อกิจการในราคาพรีเมียม 40% ในปี 2565 จะมี RS พุ่งขึ้น 99 ก่อนการซื้อกิจการปิด แล้วหายไปจาก universe หากคุณกำลังทำการศึกษา IC ย้อนหลังในปี 2568 คุณอาจมองย้อนไปที่มกราคม 2565 และพบหุ้นนั้นอยู่ที่ RS 99 ในข้อมูลของคุณ — แม้ว่าจะไม่มีใครซื้อมันได้แล้ว ณ เวลาที่คุณกำลังดูอยู่
นี่คือ survivorship bias ในรูปแบบเฉพาะ: stale data survivorship หุ้น "ปรากฏ" ใน universe ในประวัติศาสตร์ของคุณเพราะไฟล์ยังคงมีอยู่ RS ของมันค้างที่ค่าสุดท้ายก่อนที่มันจะหยุดทำงาน — บ่อยครั้งเป็นค่าสูง เพราะหุ้นที่มี RS แข็งแกร่งถูกซื้อกิจการมากกว่าหุ้นที่อ่อนแอ
เมื่อผมตรวจสอบประวัติ RS file พบว่า 92% ของ "top-10" RS ในประวัติศาสตร์ในบางวันที่ย้อนหลัง เป็น stale entries — หุ้นที่ RS file ไม่ได้รับการอัปเดตมา 30, 60, บางครั้ง 180+ วัน ณ เวลาที่ "สังเกตการณ์" ในประวัติศาสตร์
IC กำลังวัด ผู้ชนะ RS จริง เทียบกับกลุ่มเปรียบเทียบที่รวม RS ที่แช่แข็งจากหุ้นที่ถูกซื้อกิจการหรือถูกระงับ แน่นอนว่า decile บนสุดดูดีมาก การเปรียบเทียบถูกบิดเบือน
แนวทางแก้ไข: Freshness Gate
วิธีแก้ไขเรียบง่ายในแนวคิด แต่ต้องมีวินัยในการนำไปใช้
ทุกการสังเกต RS ต้องการการตรวจสอบความสดใหม่: ไฟล์นี้ได้รับการอัปเดตล่าสุดกี่วันที่แล้ว? ถ้าคำตอบมากกว่าเกณฑ์ที่กำหนด (เราใช้ 5 วันทำการ) RS ของหุ้น-วันที่คู่นั้นถือว่าขาดหายไป — ไม่ใช่ 99, ไม่ใช่ค่าสุดท้ายที่บันทึกไว้ แต่ขาดหายไปอย่างชัดเจนและถูกยกเว้นจากการวิเคราะห์
สำหรับการศึกษา IC ย้อนหลัง หมายความว่าต้องสร้าง universe ใหม่ในแต่ละวันเพื่อรวม เฉพาะ หุ้นที่ RS file สด ณ วันนั้น ไฟล์ที่ค้างถูกยกเว้นย้อนหลัง
หลังจากใช้ freshness gate กับข้อมูลของเรา: - "Top-10" ในประวัติศาสตร์: จาก 92% stale → ต่ำกว่า 5% stale - IC ลดลงจากที่สูงอย่างผิดปกติสู่ระดับที่ถ่อมตัวกว่า — แต่ตอนนี้วัดสิ่งที่เป็นจริง - สัญญาณยังทำงานได้ เพียงแต่ด้วยตัวเลขที่ซื่อสัตย์
ทำไมเรื่องนี้จึงสำคัญสำหรับนักเทรดเชิงปริมาณทุกคน
ถ้าคุณสร้างสัญญาณ RS, momentum, หรือ quality จากข้อมูลที่อิงไฟล์ คุณมีปัญหานี้ ทุกไฟล์ที่ไม่ได้รับการอัปเดตวันนี้กำลังโกหกเกี่ยวกับอดีต
ปัญหา stale data ทวีความรุนแรงด้วยสถานการณ์เหล่านี้: - หุ้นที่ถูก delist — RS ไปถึง 99 ก่อน delist ถ้าเป็นการซื้อกิจการ หรือลงไปที่ 1 ก่อน delist ถ้าเป็นล้มละลาย ทั้งคู่เป็นสัญญาณประวัติศาสตร์ที่ทำให้เข้าใจผิด - การหยุดพักการซื้อขาย — หุ้นไทยที่ถูกระงับเพื่อปรับโครงสร้างอาจค้างอยู่นานหลายเดือน RS ดูนิ่ง ซึ่งเป็นของปลอม - การดึงข้อมูลล้มเหลว — บั๊กในกระบวนการ, ช่องว่างวันหยุด, timeout จาก ChromeDP การดึงข้อมูลที่พลาดแต่ละครั้งทิ้งค่าที่ค้างไว้ - การเปลี่ยนแปลง Universe — ถ้าคุณเพิ่มกลุ่มตลาดหรือเซกเตอร์ใหม่ใน 2567 การสังเกตในประวัติศาสตร์ตั้งแต่ 2563 ขาดหุ้นเหล่านั้น ซึ่งทำให้การเปรียบเทียบผิดเพี้ยน
ไม่มีสิ่งใดเหล่านี้ปรากฏเป็น error ข้อมูลมีอยู่ ไฟล์อยู่ที่นั่น ตัวเลขดูจริง วิธีเดียวที่จะจับได้คือติดตามว่าแต่ละไฟล์ถูกเขียนล่าสุดเมื่อใด
หลักการที่กว้างกว่า
สัญญาณใดก็ตามที่ขึ้นกับข้อมูลประวัติศาสตร์จากไฟล์ ต้องการการตรวจสอบ staleness ก่อนที่ IC หรือ performance analysis จะเชื่อถือได้
กระบวนการตรวจสอบ: 1. สำหรับทุกไฟล์ที่เก็บข้อมูล time-series บันทึกว่ามันถูกอัปเดตล่าสุดเมื่อใด (timestamp ใน header หรือ modified-time ของไฟล์) 2. สำหรับการวิเคราะห์ประวัติศาสตร์ใดๆ กรองเฉพาะจุดข้อมูลที่ไฟล์สดภายในช่วงการวิเคราะห์ 3. สร้าง IC หรือตาราง performance ใหม่โดยใช้เฉพาะจุดข้อมูลที่สด 4. เปรียบเทียบผลลัพธ์ก่อนและหลัง freshness gate ถ้าคล้ายกัน gate เป็นการยืนยัน ถ้าต่างกันอย่างมีนัยสำคัญ — คุณมี stale data และกำลังวัดสิ่งที่เป็นเรื่องสมมติ
ในกรณีของเรา IC เปลี่ยนไปอย่างมีนัยสำคัญหลัง gate ซึ่งบอกว่า stale-data effect เป็นจริงและใหญ่มาก สัญญาณรอดได้ — RS momentum เป็นจริง — แต่ขนาดของตัวเลขประวัติศาสตร์ถูกพองขึ้นโดย ghost stocks ที่เราไม่สามารถซื้อได้จริง
มันดูเป็นอย่างไรเมื่อเราค้นพบมัน
การค้นพบเกิดขึ้นเมื่อเราสังเกตว่า "top RS performers" ในประวัติศาสตร์หลายตัวเป็นบริษัทที่เราจำได้ว่าถูกซื้อกิจการในช่วงนั้น บางตัวเป็นหุ้นที่เราพยายามเทรดและพบว่าไม่สามารถซื้อขายได้แล้ว
ความไม่สอดคล้องนั้นคือสัญญาณ ถ้าหุ้น "ทำกำไร" ในข้อมูลประวัติศาสตร์ของเราแต่จริงๆ แล้วหลุดออกจากตลาดแล้ว มีบางอย่างผิดพลาดกับ data pipeline หนึ่งการตรวจสอบต่อมา เราพบ 92%
การแก้ไขใช้เวลาไม่กี่ชั่วโมงของงาน pipeline บทเรียนใช้เวลานานกว่าจะซึมซาบ: ข้อมูล performance ในประวัติศาสตร์จากระบบที่อิงไฟล์ไม่น่าเชื่อถือโดยค่าเริ่มต้น คุณต้องสร้าง freshness check โดยตั้งใจ เพราะไม่มีอะไรในข้อมูลเองที่บอกคุณว่ามันค้างอยู่
ตามรอย ศึกษา รอจังหวะ จู่โจม
บันทึกการวิจัยและการเทรดส่วนตัว — ไม่ใช่คำแนะนำการลงทุน ผู้เขียนไม่ได้ให้บริการที่ปรึกษาการลงทุนที่มีใบอนุญาต — MOEasymmetry
Draft 2026-06-12. แหล่งที่มา: การตรวจสอบ RS rating file, ตลาดไทยและสหรัฐ Freshness gate: 5 วันทำการ Fix wired ลงใน fetch_us_rs.py อัตรา stale: 92% ของ top-10 ในประวัติศาสตร์ → <5% หลัง gate IC ถูกพองขึ้นอย่างผิดปกติก่อน fix; ถูกต้องหลัง gate