หา alpha จากคำพูดผู้บริหารทั้งตลาด: alternative data ที่ยังไม่มีใครขุด — และนี่คือเดโมบนข้อมูลแค่ 40%
ราคา วอลุ่ม และอัตราส่วนงบการเงิน ทุกคนในตลาดไทยมีเท่ากันหมด — edge ที่เหลือจึงอยู่ในข้อมูลที่ public แต่เครื่องอ่านไม่ได้ นั่นคือคำอธิบายของผู้บริหารใน 56-1 บทความนี้เล่าวิธีเปลี่ยนข้อความพวกนั้นเป็นชุดข้อมูลแบบ panel ที่สแกนทั้งตลาดและแบ็กเทสต์ได้ พร้อมตัวอย่างจริงที่กดตรวจต้นฉบับที่ ก.ล.ต. ได้ทุกบรรทัด และกับดัก 4 ข้อก่อนเอาเข้าโมเดล — ทั้งหมดนี้ขุดเจอในกริดที่เต็มแค่ 39.9% (2,071 จาก 5,190 ช่อง บริษัท × ปีงบ) ลองคิดว่าเต็มแล้วจะเป็นอย่างไร
หา alpha จากคำพูดผู้บริหารทั้งตลาด: alternative data ที่ยังไม่มีใครขุด — และนี่คือเดโมบนข้อมูลแค่ 40%
ราคา วอลุ่ม และอัตราส่วนงบการเงิน ทุกคนในตลาดไทยมีเท่ากันหมด — edge ที่เหลือจึงอยู่ในข้อมูลที่ public แต่เครื่องอ่านไม่ได้ นั่นคือคำอธิบายของผู้บริหารใน 56-1 บทความนี้เล่าวิธีเปลี่ยนข้อความพวกนั้นเป็นชุดข้อมูลแบบ panel ที่สแกนทั้งตลาดและแบ็กเทสต์ได้ พร้อมตัวอย่างจริงที่กดตรวจต้นฉบับที่ ก.ล.ต. ได้ทุกบรรทัด และกับดัก 4 ข้อก่อนเอาเข้าโมเดล — ทั้งหมดนี้ขุดเจอในกริดที่เต็มแค่ 39.9% (2,071 จาก 5,190 ช่อง บริษัท × ปีงบ) ลองคิดว่าเต็มแล้วจะเป็นอย่างไร
ถ้าคุณทำงานสายลงทุนแบบมีระบบ คุณรู้อยู่แล้วว่านิยามของ alpha ที่ใช้ได้จริงมีข้อเดียว: ข้อมูลที่ยังไม่อยู่ในราคา
ปัญหาของตลาดหุ้นไทยคือ ข้อมูลที่คนส่วนใหญ่ใช้หา alpha นั้น ทุกคนมีเท่ากันหมด ราคา วอลุ่ม อัตราส่วนทางการเงิน งบย้อนหลัง — ซื้อจากผู้ให้บริการเจ้าเดียวกัน อยู่ในสเปรดชีตหน้าตาคล้ายกัน และผ่านหัวคนที่เรียนมาเหมือนกัน ข้อมูลที่ทุกคนมีเท่ากันจะถูกซึมเข้าไปในราคาเร็วมาก สิ่งที่เหลือให้คุณคือค่าธรรมเนียม ไม่ใช่ alpha
แต่มีชุดข้อมูลหนึ่งที่ เปิดเผยต่อสาธารณะ 100% ฟรี 100% และแทบไม่มีใครใช้อย่างเป็นระบบ เพราะมันไม่ได้อยู่ในรูปตัวเลข — มันคือ คำที่ผู้บริหารเขียนเองในแบบ 56-1
บทความนี้ผมจะเล่าว่าทำไมข้อความพวกนั้นถึงเป็น alternative data ที่ดีที่สุดที่ยังเหลืออยู่ในตลาดไทย ผมเปลี่ยนมันเป็นชุดข้อมูลที่เครื่องอ่านได้อย่างไร และ workflow 4 ขั้นที่ผมใช้จริง เพื่อไล่จากสมมติฐานหนึ่งประโยคไปจนถึงรายชื่อบริษัทที่ต้องไปอ่านต่อ — พร้อมตัวอย่างจริงที่คุณกดลิงก์ไปตรวจต้นฉบับที่ ก.ล.ต. ได้ทุกบรรทัด
ผมทำ model risk / data science ในธนาคารไทย งานประจำของผมคือตรวจว่าโมเดลที่คนอื่นสร้างมันเชื่อได้แค่ไหน เพราะฉะนั้นครึ่งหลังของบทความนี้จะเป็น กับดัก 4 ข้อ ที่ถ้าคุณไม่รู้ แล้วเอาข้อมูลชุดนี้ไปแบ็กเทสต์ คุณจะได้ Sharpe ที่สวยและปลอมทั้งใบ
ก่อนเริ่ม อ่านบทความนี้ในฐานะ "เดโม" ไม่ใช่ "ของเสร็จ"
ทุกอย่างที่คุณจะได้เห็นข้างล่างนี้มาจากระบบที่รันจริงอยู่ตอนนี้ — แต่ระบบนี้ ยังเก็บข้อมูลได้ไม่ครบ ถ้ามองเป็นตาราง บริษัท × ปีงบ เป้าหมายคือ 865 บริษัทจดทะเบียน × 6 ปีงบ = 5,190 ช่อง วันนี้ผมเติมได้จริง 2,071 ช่อง คิดเป็น 39.9%
พูดอีกแบบ: ตัวอย่างทุกอันในบทความนี้ถูกขุดเจอในข้อมูลแค่ 40% รวมถึงประโยคที่ผมคิดว่าเป็นตัวอย่าง alpha ที่ดีที่สุดของทั้งบทความ (เดี๋ยวจะได้เห็นในขั้นที่ 3) อีก 60% ที่เหลือยังไม่มีใครอ่าน — ไม่ใช่ผม ไม่ใช่คุณ ไม่ใช่ใครในตลาด เก็บข้อนี้ไว้ในหัวตอนอ่านตัวอย่างแต่ละอัน แล้วลองคิดว่าถ้ากริดเต็มมันจะเจออะไรอีก
ทำไม "ข้อความ" ถึงยังเป็นที่ที่ alpha ซ่อนอยู่
ลองดูประโยคนี้ ผมไม่ได้เขียนเอง มันเป็นข้อความจริงจากแบบ 56-1 ของบริษัทจดทะเบียนไทยแห่งหนึ่ง
VARO · ปีงบ 2568: "Customer concentration risk: The Company has five major customers accounting for approximately 60% of total sales."
— verbatim จาก 56-1 ส่วนความเสี่ยง หน้า 4 · ต้นฉบับที่ ก.ล.ต.
"ลูกค้า 5 รายคิดเป็นราว 60% ของยอดขาย" คือข้อเท็จจริงเชิงปริมาณที่มีนัยต่อการประเมินมูลค่าอย่างมหาศาล — มันบอกคุณเรื่องอำนาจต่อรอง ความผันผวนของรายได้ และความเสี่ยงหางที่อัตราส่วนทางการเงินตัวไหนก็ไม่บอก แต่ตัวเลข 60% นี้ ไม่มีอยู่ในฟีดข้อมูลราคาของใครเลย มันนอนอยู่ในย่อหน้าหนึ่งของไฟล์ PDF
ทีนี้ทำไมถึงไม่มีใครขุดมันอย่างเป็นระบบ คำตอบมี 3 ข้อ และทั้งสามข้อคือเหตุผลว่าทำไมมันถึงยังเป็น alpha อยู่
1. มันไม่ใช่ข้อมูล มันคือ PDF — แบบ 56-1 ไทยเป็นเอกสารที่ออกแบบมาให้มนุษย์อ่านทีละไฟล์ ไม่มี API ไม่มีสคีมา ไทยปนอังกฤษ บางไฟล์เป็นภาพสแกน การจะได้ข้อความมาแบบสะอาดพอจะประมวลผลได้คืองานวิศวกรรมล้วน ๆ ที่ไม่มีใครอยากทำ
2. คำเดียวกัน ความหมายคนละเรื่อง / คนละคำ ความหมายเดียวกัน — บริษัทหนึ่งเขียนว่า "ความเสี่ยงจากการกระจุกตัวของลูกค้า" อีกบริษัทเขียนว่า "รายได้ส่วนใหญ่มาจากลูกค้าภาครัฐและรัฐวิสาหกิจ" อีกรายเขียนว่า "คำสั่งซื้อจากลูกค้ารายใหญ่ลดลง" ทั้งสามคือเรื่องเดียวกัน แต่การกด Ctrl+F ด้วยคำว่า "กระจุกตัว" จะเจอแค่รายแรก การค้นด้วยคีย์เวิร์ดจับตัวอักษร ไม่ได้จับความหมาย — ผมเคยเขียนเทียบสองอย่างนี้ไว้ละเอียดในบทความ semantic search กับการค้นคีย์เวิร์ด
3. 90% เป็นภาษาพิธีกรรม — MD&A ส่วนใหญ่คือประโยคที่ทุกบริษัทเขียนเหมือนกันหมด ("บริษัทมีการบริหารสภาพคล่องอย่างระมัดระวัง") ถ้าคุณนับความถี่คำแบบดิบ ๆ คุณจะได้แต่ noise สิ่งที่มีค่าคือ ประโยคที่ผิดไปจากพิธีกรรม ซึ่งหายากมาก และนั่นแหละคือสัญญาณ
สามข้อนี้รวมกันสร้าง ต้นทุนในการเข้าถึง ที่สูงพอจะกันคนส่วนใหญ่ออกไป — ซึ่งในภาษาการลงทุนก็คือนิยามของคูเมืองข้อมูล
ขั้นแรกไม่ใช่ "ค้นหา" แต่คือ "เปลี่ยนร้อยแก้วให้เป็นตาราง"
จุดที่คนทำสายนี้พลาดบ่อยที่สุดคือคิดว่าปัญหานี้แก้ด้วย "ช่องค้นหาที่ฉลาดขึ้น" มันไม่ใช่ ตราบใดที่คำตอบยังเป็น "ย่อหน้าที่เกี่ยวข้อง 30 ย่อหน้า" คุณก็ยังต้องนั่งอ่านเองอยู่ดี และคุณจะไม่มีวันแบ็กเทสต์อะไรได้เลย เพราะข้อมูลไม่มีแกน
สิ่งที่ต้องทำคือเปลี่ยนหน่วยของคำตอบจาก "ชิ้นข้อความ" เป็น "ข้อค้นพบที่มีโครงสร้าง" (structured finding) — หนึ่งแถวต่อหนึ่งข้อเท็จจริง มีคอลัมน์ มีแกนเวลา มีที่มา ผมเล่าเบื้องหลังการรื้อครั้งนี้ไว้ในบันทึกการเปลี่ยนเครื่องมือจากรุ่นแรกเป็นรุ่นสอง
นี่คือหน้าตาจริงของหนึ่งแถวในระบบวันนี้ ผมดึงมาตรง ๆ ไม่ได้แต่ง
{
"id": "th:risk:EXT-PDG-FY2025-006-v1",
"ticker": "PDG",
"fy": 2025,
"domain": "risk",
"theme": "market-risk",
"severity_score": 4,
"is_distress_signal": true,
"snippet_verbatim": "However, sales to major customers in the bottled water segment continued to decline, due to those customers having installed their own bottle-blowing machines in their production lines.",
"source_url": "https://market.sec.or.th/public/idisc/en/FinancialReport/ALL-0000008325/20240101-20271231?symbol=PDG",
"page_ref": 1,
"audit_id": "EXT-PDG-FY2025-006-v1"
}
พอมันมีหน้าตาแบบนี้ ของที่เมื่อกี้เป็นร้อยแก้วก็กลายเป็น panel dataset ทันที — มีแกนบริษัท (ticker) แกนเวลา (fy) แกนหัวข้อ (domain / theme) และตัวแปรที่จัดอันดับได้ (severity_score, is_distress_signal) ซึ่งเป็นเงื่อนไขขั้นต่ำของการทำอะไรก็ตามที่เรียกว่า quant
และที่สำคัญที่สุดสำหรับคนทำ model validation อย่างผม: ทุกแถว บังคับ ให้มี snippet_verbatim (ข้อความต้นฉบับที่ผู้บริหารเขียนเอง ไม่ใช่ AI เรียบเรียงใหม่) + source_url + page_ref ถ้าสัญญาณตัวไหนทำโมเดลเพี้ยน คุณย้อนกลับไปหาบรรทัดต้นทางได้ในคลิกเดียว เครื่องมือที่สรุปเก่งแต่ชี้ที่มาไม่ได้ = เอาขึ้นโต๊ะกรรมการลงทุนไม่ได้
ณ วันที่เขียน ดัชนีของตลาดไทยมี 148,043 ข้อค้นพบ จาก 502 บริษัท (จากเป้าหมาย 865 บริษัท = แตะไปแล้ว 58% ของตลาด) แบ่งเป็น 5 โดเมน (financials, risk, segment_performance, capital_structure_and_debt_covenants, forward_guidance) และ 53 ธีมย่อย (ตั้งแต่ liquidity-risk, concentration-risk, covenant-terms ไปจนถึง revenue-guidance และ segment-decline)
workflow 4 ขั้นที่ผมใช้จริง
ขั้นที่ 1 — เขียนสมมติฐานเป็นภาษาที่ผู้บริหาร "จะเขียน" ไม่ใช่คีย์เวิร์ด
นี่คือขั้นที่คนพลาดมากที่สุด และมันฟรี
อย่าพิมพ์ว่า "customer concentration" ให้พิมพ์ประโยคที่คุณคิดว่าผู้บริหารจะเขียนจริง ๆ ตอนต้องอธิบายเรื่องนี้ เช่น "บริษัทพึ่งพารายได้จากลูกค้ารายใหญ่เพียงไม่กี่ราย" เพราะระบบเทียบ ความหมาย ของประโยคคุณกับ ความหมาย ของย่อหน้าในเอกสาร ยิ่งประโยคคุณเหมือนภาษาที่ผู้บริหารใช้จริง ยิ่งตรง (ผมเขียนเรื่องนี้ไว้เป็นบทเฉพาะที่เทคนิคตั้งคำค้นให้เหมือนภาษาผู้บริหาร)
ผมรันคำค้นนั้นทั้งตลาดจริง ๆ ได้ผลกลับมาใน 47 มิลลิวินาที และนี่คือ 3 อันดับแรก
VARO · ปีงบ 2568 ·
risk/concentration-risk: "Customer concentration risk: The Company has five major customers accounting for approximately 60% of total sales." — ต้นฉบับ หน้า 4
AIT · ปีงบ 2566 ·
risk/concentration-risk: "The majority of the Company's revenue recognized in 2023 comes from government and state enterprises customers." — ต้นฉบับ หน้า 1
JDF · ปีงบ 2567 ·
risk/strategic-risk: "The proportion of sales from products produced for customers to sell under their own brand and products that the company manufactures on behalf of customers was 92%, while the sales of products under the company's own brand accounted for 8% of total revenue." — ต้นฉบับ หน้า 4
สังเกตว่า ไม่มีผลลัพธ์ไหนเลยที่มีคำว่า "พึ่งพา" หรือ "รายใหญ่เพียงไม่กี่ราย" ตามที่ผมพิมพ์ — JDF ไม่ได้ใช้คำว่ากระจุกตัวด้วยซ้ำ เขาเขียนว่า OEM 92% / แบรนด์ตัวเอง 8% ซึ่งเป็นเรื่องเดียวกันโดยสาระ นี่คือสิ่งที่ Ctrl+F ทำไม่ได้ตลอดกาล
ขั้นที่ 2 — กวาดตัดขวางทั้งตลาดก่อน อย่าเพิ่งเจาะรายตัว
พอได้คำค้นที่ใช่แล้ว ขั้นถัดไปคืออ่านมันในฐานะ ภาพตัดขวาง (cross-section) ไม่ใช่ในฐานะรายชื่อหุ้น คำถามที่คุณกำลังตอบไม่ใช่ "หุ้นตัวไหนน่าซื้อ" แต่คือ "ปัญหานี้กระจายตัวอย่างไรในตลาด"
ถ้ามี 40 บริษัทพูดเรื่องเดียวกัน แปลว่ามันคือธีมมหภาค (ต้นทุนวัตถุดิบ ค่าแรง ดอกเบี้ย) — ราคาน่าจะรับรู้ไปแล้วบางส่วน แต่ถ้ามี 3 บริษัทพูด และอีก 37 รายในอุตสาหกรรมเดียวกันเงียบสนิท ความเงียบนั่นแหละคือข้อมูล คุณเพิ่งเจอความแตกต่างที่ยังไม่มีใครตั้งราคาให้
ขั้นที่ 3 — อ่านข้ามเวลา เพราะสัญญาณอยู่ที่ "การเปลี่ยนแปลง" ไม่ใช่ "ระดับ"
ขั้นนี้คือหัวใจ และเป็นเหตุผลทั้งหมดที่ต้องมีแกน fy ในทุกแถว
ระดับของความเสี่ยงไม่ค่อยมีค่า เพราะทุกบริษัทเขียนถึงความเสี่ยงเหมือนกันหมด สิ่งที่มีค่าคือ ภาษาของบริษัทเดิมเปลี่ยนไปอย่างไรข้ามปี — ผมเคยเขียนวิธีอ่านแบบนี้ไว้ที่บทอ่าน MD&A ข้ามช่วงเวลา
ขอยกตัวอย่างจริงจาก PDG (Prodigy) ที่โผล่มาในผลค้นข้างบน ผมดึงข้อค้นพบทั้งหมดของบริษัทนี้เรียงตามปีงบ นี่คือสิ่งที่ผู้บริหารเขียนเอง ไม่มีคำไหนเป็นของผม
ปีงบ 2565 — ต้นทุนเริ่มบีบ
"The cost of goods sold increased 34.633 million baht or 28.93 % compare with the same period 2021 but the cost of goods sold compared to sales revenue as 84.65%, it rose because the rising of raw material price that impacted from the rising in crude oil price."
— ต้นฉบับ หน้า 1 (ไตรมาสสิ้นสุด 31 มี.ค. 2565)
ปีงบ 2566 — บีบต่อ และนี่คือประโยคที่สำคัญที่สุด
"The cost of goods sold decreased 8.796 million baht or 5.70 % compare with the same period 2022 but the cost of goods sold compared to sales revenue as 89.46%..."
"The company couldn't pass the burden of being increased costs to customers at all."
"The part of sale revenue decreased due to reducing in orders of major customers."
— ต้นฉบับ หน้า 1–2
หยุดตรงนี้แล้วดูให้ดี ระบบจัดประโยคกลางเป็น risk/strategic-risk · severity_score: 5 · is_distress_signal: true
ประโยคนั้นคือคำสารภาพเรื่อง อำนาจในการตั้งราคา (pricing power) แบบตรงไปตรงมาที่สุดเท่าที่ผู้บริหารบริษัทจดทะเบียนจะเขียนได้ และมันไม่ปรากฏเป็นบรรทัดใดในงบการเงิน คุณเห็นได้แค่ผลของมัน (อัตรากำไรขั้นต้นหด) แต่ไม่เห็น สาเหตุเชิงโครงสร้าง — และคุณจะไม่มีทางรู้ว่ามันคือปัญหาชั่วคราวหรือถาวร จนกว่าจะได้อ่านประโยคนี้ ต้นทุนขาย/รายได้ไตรมาสเดียวกันขยับจาก 84.65% เป็น 89.46% ในหนึ่งปี
ปีงบ 2567 — ฟื้น
"As ended of the third quarter of 2024, the company generated a net profit to THB 13.673 million increasing of THB 5.859 million or 74.98% which compared with the net profit of THB 7.814 million in the third quarter of 2023"
— ต้นฉบับ หน้า 1
ผมยกอันนี้มาด้วยเพราะสำคัญ — วิธีนี้ไม่ได้ออกแบบมาหาแต่ข่าวร้าย มันจับ จุดกลับตัว ด้วย ถ้าคุณอ่านแค่ปี 2566 แล้วสรุปว่าบริษัทนี้จบแล้ว คุณก็พลาดไปครึ่งเรื่อง
ปีงบ 2568 — และนี่คือสิ่งที่ผมเรียกว่า alpha ของจริง
"However, sales to major customers in the bottled water segment continued to decline, due to those customers having installed their own bottle-blowing machines in their production lines."
— ต้นฉบับ หน้า 1
อ่านให้ช้าลงอีกครั้ง: ลูกค้ารายใหญ่ ซื้อเครื่องเป่าขวดไปติดตั้งในไลน์ผลิตของตัวเอง
นั่นไม่ใช่วัฏจักร ไม่ใช่ฤดูกาล ไม่ใช่เศรษฐกิจชะลอ — มันคือ การที่ลูกค้าย้ายไปผลิตเอง (insourcing) ซึ่งเป็นการสูญเสียอุปสงค์แบบถาวรและย้อนกลับไม่ได้ อัตราส่วนทางการเงินตัวไหนก็บอกคุณไม่ได้ว่ารายได้ที่หายไปนั้น "หายแบบไหน" มันบอกได้แค่ว่าหายเท่าไร ประโยคเดียวในย่อหน้าเดียวของ 56-1 บอกคุณว่ามันจะไม่กลับมา
เรียงสี่ปีต่อกัน คุณจะได้เรื่องเล่าที่สอดคล้องกันทั้งเส้น: ต้นทุนบีบ → ผลักภาระให้ลูกค้าไม่ได้เลย → ฟื้นตัวเชิงวัฏจักร → ลูกค้าหลักย้ายไปผลิตเอง นี่คือสิ่งที่ข้อมูลราคาไม่มีวันบอกคุณ และนี่คือเหตุผลที่แกนเวลาสำคัญกว่าคำค้นที่ฉลาด
แล้วนี่คือจุดที่ผมอยากให้หยุดคิดสักครู่
PDG ไม่ใช่บริษัทที่ผมเลือกมาก่อน ผมไม่ได้รู้จักมันมาก่อนด้วยซ้ำ มันโผล่ขึ้นมาเองจากคำค้นเดียวในขั้นที่ 1 แล้วพอไล่ตามแกนเวลาก็ได้เรื่องเล่าทั้งเส้นนี้มาในไม่กี่นาที — และมันโผล่มาจากกริดที่เต็มแค่ 39.9%
ตอนนี้ยังมี บริษัทอีก 363 รายที่ระบบยังไม่ได้แตะเลยแม้แต่ปีเดียว และอีก 3,119 ช่องปีงบที่ยังว่างอยู่ ในบริษัทที่แตะแล้ว ถ้าเรื่องแบบ PDG โผล่มาจาก 40% ได้ด้วยคำค้นเดียว คำถามที่ผมอยากให้คุณถามตัวเองคือ อีก 60% ที่ยังไม่มีใครอ่าน มันมีเรื่องแบบนี้อยู่กี่เรื่อง — และตอนนี้ยังไม่มีใครในตลาดรู้คำตอบ รวมถึงผมเอง
ขั้นที่ 4 — บีบกรวยด้วยตัวกรอง ไม่ใช่ด้วยสายตา
พออ่านเป็นแล้ว ปัญหาถัดไปคือสเกล คุณอ่าน 148,043 แถวด้วยตาไม่ได้ ต้องบีบกรวย นี่คือตัวเลขจริงของดัชนีวันนี้
| ขั้นการกรอง | ข้อค้นพบ | บริษัท |
|---|---|---|
| ดัชนีทั้งหมด | 148,043 | 502 |
| ในกรอบ 6 ปีของแพ็ก Max (ปีงบ 2564–2569) | 42,458 | 500 |
+ ติดธง is_distress_signal | 11,838 | 492 |
+ severity_score = 5 (สูงสุด) | 591 | 220 |
จาก 148,043 เหลือ 591 รายการที่ต้องอ่านด้วยตาจริง ๆ — ประมาณครึ่งวันทำงาน แทนที่จะเป็นครึ่งปี
แต่ดูตัวเลขคอลัมน์ "บริษัท" ให้ดี ธง is_distress_signal อย่างเดียวโดนไป 492 จาก 500 บริษัท คือเกือบทั้งตลาด แปลว่า ธงตัวนี้เพียงลำพังไม่ใช่สัญญาณ มันคือตัวกรองขั้นต้นที่ต้องเอาไปประกอบกับ severity_score และธีมเสมอ ผมเขียนเรื่องนี้ไว้ตรงนี้เพราะถ้าคุณเป็นสาย quant คุณจะเจอมันเองในวันแรก และผมอยากให้คุณรู้จากผมก่อน
จาก signal ไปเป็น factor: ดึงข้อมูลทั้งชุดออกไปแบ็กเทสต์
ทุกอย่างข้างบนยังเป็นงานวิจัยด้วยมือ ถ้าคุณจะทำให้มันเป็นแฟกเตอร์จริง คุณต้องการ ข้อมูลทั้งชุด ไม่ใช่ผลค้น 10 อันดับแรก — และนั่นเป็นคนละปัญหาทางวิศวกรรมกันเลย
ผมเลยแยกทางออกมาเป็น REST endpoint ต่างหากสำหรับสาย quant โดยเฉพาะ: GET /v1/quant/findings ซึ่ง ไม่ใช่การค้นหา แต่คือการกวาด (scan) ทุกแถวที่ตรงตัวกรอง ในลำดับคงที่ (ticker, fy, id) แบ่งหน้าด้วย cursor
- กรองด้วย
tickers/fy_start·fy_end/theme/domain/distress_only - ทุกหน้าคืน
total_matched(ขนาดชุดเต็มหลังกรอง) +next_cursor+has_more— เดินจนครบทั้งชุดได้ ไม่มีแถวหายหรือซ้ำที่รอยต่อหน้า - ทุกแถวพก provenance มาเป็นส่วนหนึ่งของสัญญา ไม่ใช่ของแถม:
audit_id,source_url,page_ref,extraction_version since_updated_atสำหรับ delta-sync — รอบแรกดึงทั้งหมด รอบถัด ๆ ดึงเฉพาะที่เปลี่ยน (งบออกใหม่) ไม่ต้องโหลดประวัติซ้ำ- rate limit แบบ token bucket 300 ครั้ง/นาที (burst 600) ตอบ
429พร้อมRetry-AfterและX-RateLimit-*ให้สคริปต์คุณปรับจังหวะเองได้
ระดับสิทธิ์บังคับที่ backend ไม่ใช่ที่หน้าเว็บ ผมลองยิงด้วยคีย์ระดับ Max ดู ได้ผลนี้กลับมาจริง ๆ
HTTP 403
{"error":"quant_api_required","tier":"max","upsell_tier":"quant_api",
"note":"Bulk & time-series access is the Quant API (B2B) package."}
แพ็ก Quant API อยู่ที่ 5,999 บาท/เดือน (ลึก 6 ปี ไม่จำกัดจำนวนครั้งต่อวัน) ตอนนี้ผม ยังไม่ได้วางขายหน้าเว็บ — เปิดแบบคุยตรงกับผู้ใช้ทีละรายก่อน เพราะผมอยากรู้ว่าคุณจะเอาไปทำอะไรจริง ๆ ก่อนจะล็อกสัญญา ถ้าคุณอยู่กองทุน บลจ. หรือทำ systematic strategy แล้วอยากได้ชุดข้อมูลนี้ไปทดสอบ อีเมลมาที่ contact@boomleverage.com ได้เลย ถ้าอยากลองมือแบบเบา ๆ ก่อน หน้าเว็บ Terminal ก็ส่งออกผลค้นเป็น Excel/CSV ได้ทันที
กับดัก 4 ข้อที่ต้องรู้ก่อนเอาข้อมูลชุดนี้เข้าโมเดล
ส่วนนี้คือส่วนที่ผมอยากให้คุณอ่านมากที่สุด และเป็นส่วนที่คนขายข้อมูลปกติเขาไม่เขียนกัน ผมทำ model validation เป็นอาชีพ หน้าที่ผมคือหาว่าโมเดลจะพังตรงไหน — เพราะฉะนั้นผมจะบอกจุดที่ชุดข้อมูลของผมเองจะทำให้คุณพัง
1. Look-ahead bias — กับดักที่จะฆ่าแบ็กเทสต์ของคุณ
fy ไม่ใช่วันที่ข้อมูลนี้มีให้ใช้ มันคือปีงบการเงินที่เนื้อหาอ้างถึง แต่แบบ 56-1 และ MD&A ถูกยื่นต่อ ก.ล.ต. หลังจากนั้นเป็นสัปดาห์ถึงเป็นเดือน
ถ้าคุณจับสัญญาณของปีงบ 2566 ไปเทียบกับผลตอบแทนตั้งแต่ต้นปี 2566 คุณกำลังเทรดด้วยข้อมูลที่ในโลกจริงยังไม่มีใครอ่านได้ Sharpe ที่ได้จะสวยและปลอมทั้งใบ
การจัดแนวที่ถูกต้องคือใช้ วันที่ยื่นเอกสาร เป็นจุดที่ข้อมูลเข้าสู่เซตข้อมูลของคุณ พูดตรง ๆ ว่า ตอนนี้ระบบยังไม่ได้ประทับวันที่ยื่นระดับรายแถว — updated_at วันนี้เป็นความละเอียดระดับรอบสร้างดัชนี ไม่ใช่ระดับเอกสาร (การประทับรายแถวอยู่ในคิวที่ต้องแก้ที่ตัวสกัด และสัญญา API รองรับฟิลด์นี้ไว้แล้ว) จนกว่าจะถึงตอนนั้น คุณต้องดึงวันที่ยื่นจากไฟล์ต้นทางที่ ก.ล.ต. เอง — ซึ่งทำได้ เพราะทุกแถวมี source_url ให้อยู่แล้ว
ผมยอมเขียนย่อหน้านี้ทั้งที่มันทำให้สินค้าตัวเองดูด้อยลง เพราะถ้าคุณเป็นสาย quant จริง คุณจะถามคำถามนี้เป็นคำถามแรก และผมอยากให้คำตอบมาก่อนที่คุณจะต้องถาม
2. Survivorship bias — ตัวอย่างที่มีค่าที่สุดคือตัวที่หายไปแล้ว
ดัชนีวันนี้สร้างจากบริษัทที่ยังจดทะเบียนอยู่ ซึ่งแปลว่า บริษัทที่ล้มไปแล้วหายออกจากกลุ่มตัวอย่าง — และนั่นคือกลุ่มตัวอย่างที่มีค่าที่สุดถ้าคุณอยากสร้างโมเดลเตือนภัยล่วงหน้า ถ้าคุณเทรนบนบริษัทที่รอดมาได้อย่างเดียว โมเดลคุณจะเรียนรู้ว่า "สัญญาณอันตรายมักไม่นำไปสู่อะไร" ซึ่งเป็นข้อสรุปที่ผิด
เรื่องนี้อยู่ในแผนของผมแบบชัดเจน — เก็บ 56-1 ย้อนหลังของบริษัทที่ถูกเพิกถอน/ควบรวม/เปลี่ยนชื่อ แล้วรันย้อนหลังเพื่อหาแพทเทิร์นภาษา ก่อน เกิดวิกฤต แต่ ณ วันที่เขียนบทความนี้ มันยังไม่เสร็จ ผมจึงบอกไว้ตรงนี้ ไม่ใช่เขียนเป็นฟีเจอร์ในหน้าขาย (พื้นฐานเรื่องการอ่านสัญญาณเตือนจากข้อความ ผมเล่าไว้ที่บทระบบเตือนภัยล่วงหน้าด้วย NLP ในแบงก์ ซึ่งเป็นงานที่ผมเคยสร้างจริงตอนอยู่ฝั่ง credit risk)
3. ภาษาพิธีกรรมจะกลืนสัญญาณของคุณ
ย้ำอีกครั้งเพราะสำคัญ: ธง is_distress_signal โดน 492 จาก 500 บริษัทในกรอบ 6 ปี ถ้าคุณใช้มันเป็นตัวแปรเดี่ยว ๆ คุณจะได้แฟกเตอร์ที่แทบไม่มีอำนาจแยกแยะเลย
วิธีที่ใช้ได้จริงคือมองมันเป็น ตัวกรองขั้นต้น แล้ววางสัญญาณจริงไว้ที่ ความต่าง — เทียบบริษัทกับตัวเองในปีก่อน (ธีมไหนโผล่ใหม่ ธีมไหน severity ขยับขึ้น) และเทียบบริษัทกับค่ากลางของอุตสาหกรรมเดียวกันในปีเดียวกัน ประโยคของ PDG ที่ว่า "ผลักภาระต้นทุนให้ลูกค้าไม่ได้เลย" มีค่าเพราะ มันไม่ใช่ประโยคพิธีกรรม ไม่ใช่เพราะมันติดธง
4. กริดยังเต็มแค่ 40% — และผมจะกางตัวเลขให้ดูทั้งหมด
ข้อนี้คือข้อที่ผมเปิดหัวบทความไว้ ขอกางให้ครบตรงนี้ทีเดียว เพราะถ้าคุณจะเอาไปทำ panel regression หรือ event study คุณต้องรู้ว่ากริดของคุณโหว่ตรงไหน
| ตัววัดความครบถ้วน | ตัวเลขจริงวันนี้ |
|---|---|
| บริษัทเป้าหมายทั้งตลาด | 865 |
| บริษัทที่มีข้อมูลในดัชนีแล้ว | 502 (58.0%) |
| ช่อง บริษัท × ปีงบ ที่เติมแล้ว (กรอบ 6 ปี) | 2,071 จาก 5,190 = 39.9% |
| จำนวนปีเฉลี่ยต่อบริษัทที่มีข้อมูล | 4.14 ปี |
| แถวที่ประทับปีงบแล้ว | 48,624 จาก 148,043 |
สองบรรทัดสุดท้ายอธิบายกันและกัน: แถวที่เหลือคือชุด backfill เอกสารเก่าที่ยังไม่ได้ประทับปีงบ ซึ่งแปลว่า มันยังไม่ปรากฏในผลค้นเลย เพราะระบบตัดแถวที่พิสูจน์ปีไม่ได้ทิ้งจากกรอบเวลาตามสิทธิ์แพ็ก ตัวเลขที่คุณใช้วางแผนงานได้จริงวันนี้จึงเป็น 42,458 แถว ในกรอบ 6 ปี จาก 500 บริษัท ไม่ใช่ 148,043
ที่ต้องรู้ก่อนสร้างแฟกเตอร์: ความโหว่นี้ไม่ได้กระจายแบบสุ่ม บริษัทใหญ่ที่ยื่นเอกสารสม่ำเสมอจะมีปีครบกว่าบริษัทเล็ก ซึ่งแปลว่าถ้าคุณคำนวณค่ากลางรายอุตสาหกรรมแบบไม่ระวัง คุณจะได้ค่ากลางที่เอียงไปทางบริษัทใหญ่ ขั้นต่ำที่ควรทำคือกำหนดเงื่อนไขว่าบริษัทต้องมีข้อมูลกี่ปีถึงจะเข้าตัวอย่าง แล้วรายงานจำนวนบริษัทที่ตกไปด้วยเสมอ
แต่นี่คืออีกด้านของเหรียญเดียวกัน และเป็นเหตุผลที่ผมกล้าเขียนบทความนี้ตอนที่ของยังไม่เสร็จ:
ทุกอย่างที่คุณอ่านมาทั้งบทความ — คำสารภาพเรื่องอำนาจตั้งราคาของ PDG, ลูกค้าที่ย้ายไปเป่าขวดเอง, VARO ที่ลูกค้า 5 รายกินยอดขาย 60%, รายการ 591 ชิ้นที่คัดจากแสนกว่าแถว — มาจากกริดที่เต็มแค่ 39.9% ทั้งหมด
กริดนี้เต็มขึ้นทุกสัปดาห์ และมันเต็มขึ้นโดยที่คุณไม่ต้องทำอะไรเลย ข้อมูลที่เพิ่มเข้ามาไม่ได้แค่ทำให้ผลค้นเยอะขึ้น — มันทำให้ แกนเวลาลึกขึ้น ซึ่งคือแกนที่สัญญาณจริงอาศัยอยู่ (กลับไปดูขั้นที่ 3 อีกครั้ง) การเห็น PDG 4 ปีบอกอะไรได้มากกว่าเห็น 2 ปีอย่างเทียบไม่ติด และการเห็น 865 บริษัทครบทุกปีคือคนละเกมกับที่คุณเห็นอยู่ตอนนี้
ถ้าเดโมที่ 40% ยังพอทำให้คุณอ่านมาถึงบรรทัดนี้ได้ ผมว่านั่นตอบคำถามว่าของเต็มจะเป็นยังไงได้พอสมควรแล้ว
สรุปสั้น ๆ
alpha ไม่ได้อยู่ในโมเดลที่ซับซ้อนขึ้น มันอยู่ในชุดข้อมูลที่คนอื่นเข้าไม่ถึงเพราะขี้เกียจแปลง ในตลาดหุ้นไทย ชุดข้อมูลนั้นเปิดฟรีอยู่ที่เว็บ ก.ล.ต. มาตลอด แค่มันอยู่ในรูปที่เครื่องอ่านไม่ได้
สิ่งที่ผมทำคือแปลงมันให้เครื่องอ่านได้ โดยไม่ยอมทิ้งความสามารถในการย้อนกลับไปดูต้นฉบับ — ทุกแถวมีข้อความจริง ลิงก์จริง เลขหน้าจริง เพราะสัญญาณที่พิสูจน์ที่มาไม่ได้ ไม่ควรถูกเอาไปตัดสินใจด้วยเงินจริง
และย้ำเป็นครั้งสุดท้าย เพราะมันคือประเด็นทั้งหมดของบทความนี้: ที่คุณเพิ่งอ่านจบคือเดโมบนข้อมูล 39.9% ผมเลือกเขียนตอนนี้แทนที่จะรอให้ครบ 100% เพราะผมอยากให้คุณเห็นด้วยตาตัวเองว่า แค่ 40% มันก็ขุดเจอของแบบนี้แล้ว — ส่วนที่เหลือคือเรื่องของเวลา ไม่ใช่เรื่องของว่าทำได้หรือไม่ได้
ลองเองได้เลย — ตอนนี้ผมเปิดให้ทุกคนที่สมัคร Terminal ใช้ แพ็ก Pro เต็ม ๆ ฟรีถึง 31 ส.ค. 2026 (ลึก 4 ปี · ค้นได้ 150 ครั้ง/วัน) ไม่ต้องผูกบัตร เพราะช่วงโปรฯ ผมปิดการเก็บเงินไว้ทั้งหมด พอครบกำหนดสิทธิ์จะกลับเป็นแพ็กฟรีเอง ไม่มีการตัดเงินอัตโนมัติ
เข้าไปที่ terminal.boomleverage.com แล้วล็อกอิน จากนั้นลองทำตามขั้นที่ 1: พิมพ์สมมติฐานของคุณเป็นประโยคที่ผู้บริหารจะเขียน แล้วดูว่ามีบริษัทไหนพูดเรื่องนั้นอยู่บ้างที่คุณไม่เคยรู้
ถ้าคุณอยู่ฝั่งสถาบันและต้องการข้อมูลทั้งชุดผ่าน API เพื่อเอาไปแบ็กเทสต์ อีเมลมาที่ contact@boomleverage.com ผมคุยเองทุกราย
เครื่องมือนี้ให้ข้อมูลและการวิเคราะห์เชิงการศึกษาพร้อมอ้างอิงต้นฉบับ ไม่ใช่คำแนะนำการลงทุน ชื่อบริษัทที่ยกมาในบทความนี้เป็นตัวอย่างเชิงวิธีการล้วน ๆ เพื่อแสดงว่าอ่านข้อความจากเอกสารเปิดเผยอย่างไร ไม่ใช่การชี้นำให้ซื้อหรือขายหลักทรัพย์ใด ๆ ทุกข้อความที่ยกมาเป็นคำต่อคำจากแบบ 56-1 ที่เปิดเผยต่อสาธารณะและมีลิงก์ต้นฉบับกำกับทุกจุด การตัดสินใจลงทุนเป็นความรับผิดชอบของผู้ใช้เอง
อ่านต่อ
กรองหุ้นด้วย MD&A: อัปโหลดวอทช์ลิสต์ CSV/Excel แล้วอ่านสิ่งที่ผู้บริหารพูด เฉพาะหุ้นในลิสต์คุณ
อ่านต่อ financeSETSMART คืออะไร — แหล่งข้อมูลตลาดทุนไทยทางการ ที่คนทำงาน data การเงินใช้จริง
อ่านต่อ claude-codeใช้ Claude Code ทำงานกับข้อมูลหุ้นไทย/SET: ดึง จัดระเบียบ วิเคราะห์ (ไม่ใช่ทำนาย)
อ่านต่อ