Boom Leverage
บทความทั้งหมด

หา alpha จากคำพูดผู้บริหารทั้งตลาด: alternative data ที่ยังไม่มีใครขุด — และนี่คือเดโมบนข้อมูลแค่ 40%

ราคา วอลุ่ม และอัตราส่วนงบการเงิน ทุกคนในตลาดไทยมีเท่ากันหมด — edge ที่เหลือจึงอยู่ในข้อมูลที่ public แต่เครื่องอ่านไม่ได้ นั่นคือคำอธิบายของผู้บริหารใน 56-1 บทความนี้เล่าวิธีเปลี่ยนข้อความพวกนั้นเป็นชุดข้อมูลแบบ panel ที่สแกนทั้งตลาดและแบ็กเทสต์ได้ พร้อมตัวอย่างจริงที่กดตรวจต้นฉบับที่ ก.ล.ต. ได้ทุกบรรทัด และกับดัก 4 ข้อก่อนเอาเข้าโมเดล — ทั้งหมดนี้ขุดเจอในกริดที่เต็มแค่ 39.9% (2,071 จาก 5,190 ช่อง บริษัท × ปีงบ) ลองคิดว่าเต็มแล้วจะเป็นอย่างไร

Varanchai Yingkhamnueng·
quantBoom Leverage

หา 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,043502
ในกรอบ 6 ปีของแพ็ก Max (ปีงบ 2564–2569)42,458500
+ ติดธง is_distress_signal11,838492
+ severity_score = 5 (สูงสุด)591220

จาก 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 ที่เปิดเผยต่อสาธารณะและมีลิงก์ต้นฉบับกำกับทุกจุด การตัดสินใจลงทุนเป็นความรับผิดชอบของผู้ใช้เอง

อ่านต่อ