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

ค้นหา MD&A ที่อัปเดตวันละ 2 ครั้ง: ทำไม 'ความสด' ของแบบ 56-1 ถึงเป็นงานของสาย risk (รีอินเด็กซ์ 09:00 และ 21:00)

เครื่องมือ Semantic Search การเงินของผมดึงแบบ 56-1 ใหม่วันละ 2 รอบ แล้วรีอินเด็กซ์ 09:00/21:00 ครอบคลุมเกือบทั้งตลาด ~849 บริษัทย้อนถึงปี 2564 — ทำไม 'ความสด' ถึงเป็นเรื่องของสาย credit/risk

Varanchai Yingkhamnueng·
financeBoom Leverage

ค้นหา MD&A ที่อัปเดตวันละ 2 ครั้ง: ทำไม 'ความสด' ของแบบ 56-1 ถึงเป็นงานของสาย risk (รีอินเด็กซ์ 09:00 และ 21:00)

เครื่องมือ Semantic Search การเงินของผมดึงแบบ 56-1 ใหม่วันละ 2 รอบ แล้วรีอินเด็กซ์ 09:00/21:00 ครอบคลุมเกือบทั้งตลาด ~849 บริษัทย้อนถึงปี 2564 — ทำไม 'ความสด' ถึงเป็นเรื่องของสาย credit/risk

ในงานสาย credit และ model risk ผมถูกฝึกมาว่า สัญญาณที่มาช้าไม่ใช่สัญญาณ — มันคือประวัติศาสตร์ ถ้าผู้บริหารบริษัทหนึ่งเริ่มบ่นเรื่องต้นทุนพลังงานในคำชี้แจงงวดล่าสุด นั่นคือสิ่งที่ต้องรีบอ่าน แต่ถ้าคุณเพิ่งมาเจอประโยคเดียวกันตอนที่มันกลายเป็นตัวเลขแย่ในงบไปแล้วสองไตรมาส มันก็สายเกินจะทำอะไร เพราะแบบนี้ ตอนผมสร้างเครื่องมือค้น MD&A ทั้งตลาด สิ่งที่ผมหมกมุ่นพอ ๆ กับคุณภาพการค้น คือ ความสดของข้อมูล — ระบบดึงแบบ 56-1 ใหม่วันละ 2 รอบ แล้วสร้างดัชนีค้นหาใหม่ทั้งคลังวันละ 2 ครั้งเวลา 09:00 และ 21:00 เพื่อให้คำชี้แจงที่เพิ่งยื่นเข้า ก.ล.ต. โผล่ในผลค้นได้ภายในไม่กี่ชั่วโมง ไม่ใช่ไตรมาสหน้า

1. ทำไม 'ความสด' คือหัวใจของการอ่าน MD&A ไม่ใช่แค่ฟีเจอร์แถม

MD&A หรือ "คำอธิบายและการวิเคราะห์ของฝ่ายจัดการ" ในแบบ 56-1 คือส่วนที่ผู้บริหารเล่าด้วยคำพูดของเขาเองว่ากำลังจะเกิดอะไรขึ้นกับธุรกิจ ต่างจากงบการเงินที่บอกว่า "เกิดอะไรไปแล้ว" คุณค่าของมันจึงเป็น forward-looking — และของแบบนี้เสื่อมค่าตามเวลาเร็วมาก ความกังวลที่ปรากฏในไฟล์ล่าสุดมีน้ำหนัก ส่วนความกังวลเดียวกันจากสามไตรมาสก่อนมักถูกตลาดรับรู้ไปหมดแล้ว

สำหรับคนทำ early-warning ในแบงก์ ยิ่งชัด เพราะเกมทั้งเกมคือการจับ "จังหวะที่น้ำเสียงเปลี่ยน" ให้ได้ก่อน ก่อนที่มันจะแปลงเป็นการตั้งสำรองหรือ NPL ในงบ ถ้าคลังข้อมูลที่คุณค้นมันค้าง คุณก็จะเจอสัญญาณตอนที่มันไม่ใช่สัญญาณเตือนอีกต่อไปแล้ว — คุณกำลังอ่านคำอธิบายของปัญหาที่ระเบิดไปแล้ว

ทำไมมันสำคัญกับเรา: เครื่องมือค้นเอกสารการเงินที่ข้อมูลไม่สด อันตรายกว่าไม่มีเครื่องมือ เพราะมันให้ความมั่นใจปลอม ๆ ว่า "ค้นครบแล้ว" ทั้งที่ไฟล์ล่าสุดยังไม่เข้า ในมุมคนทำ model risk ความสดของ input คือส่วนหนึ่งของความถูกต้องของผลลัพธ์ — ไม่ใช่เรื่องแยกกัน

2. อ่าน 56-1 ด้วย AI ให้ทัน — ระบบอัปเดตวันละ 2 รอบยังไง

หัวใจที่ทำให้ค้นได้สดคือ pipeline เบื้องหลังที่เดินเป็นรอบทุกวัน ไม่ต้องมีคนกดเอง:

  • ดึงไฟล์ใหม่วันละ 2 รอบ — ระบบไล่เช็กแบบ 56-1 ที่บริษัทจดทะเบียนยื่นเข้า ก.ล.ต. วันละสองครั้ง (เช้าและค่ำ) มีไฟล์ไหนใหม่กว่าที่มีอยู่ก็ดึงเข้ามาต่อคิว
  • รีอินเด็กซ์ทั้งคลังเวลา 09:00 และ 21:00 — หลังดึงไฟล์เสร็จ ระบบจะแปลงข้อความเป็นเวกเตอร์ความหมายใหม่แล้วสร้างดัชนีค้นหาใหม่ทั้งชุด รอบเช้ากับรอบค่ำ ผลคือไฟล์ที่เพิ่งยื่นตอนสายมักค้นเจอได้ตั้งแต่รอบค่ำวันเดียวกัน
  • ทิ้งเวอร์ชันเก่าอัตโนมัติ — พอบริษัทยื่นฉบับแก้ไขทับของเดิม ระบบจะย้ายฉบับเก่าออกจากดัชนี ให้ค้นเจอเฉพาะเวอร์ชันล่าสุด คุณจะไม่บังเอิญไปอ่านตัวเลขที่ถูกแก้ไปแล้ว

ตอนนี้คลังครอบคลุม เกือบทั้งตลาด ราว 849 บริษัท (จากเป้าหมายทั้งตลาดราว 865 ตัว) ย้อนหลังตั้งแต่ปี 2564 ถึงงวดล่าสุดปี 2569 ไตรมาส 1 รวม กว่า 82,000 ท่อนข้อความ จากแบบ 56-1 17,317 ฉบับ — และตัวเลขท่อนข้อความนี้ขยับขึ้นทุกวันตามไฟล์ที่ไหลเข้า เพราะมันคือ Semantic Search การเงินที่ออกแบบให้ "โต" ไปกับตลาด ไม่ใช่ snapshot แช่แข็งที่ทำครั้งเดียวจบ ถ้าอยากเห็นภาพว่าการค้นข้ามทั้งตลาดหน้าตาเป็นยังไง อ่านเบื้องหลังได้ที่ค้น MD&A ทั้งตลาดด้วย AI ปี 2026

3. Freshness guard — ตัวเฝ้าว่าข้อมูลเริ่มค้างหรือยัง (มุม model monitoring)

จุดที่คนสร้างเครื่องมือมักลืมคือ: ระบบดึงข้อมูลอัตโนมัติ วันหนึ่งมันจะพังเงียบ ๆ — แหล่งข้อมูลเปลี่ยนหน้าเว็บ, cron ตาย, ต่อเน็ตไม่ติด แล้วคลังก็ค้างอยู่กับที่โดยที่หน้าเว็บยังดูปกติดี ในงาน model risk เราเรียกสิ่งนี้ว่า silent failure และมันคือฝันร้าย

ผมเลยติด freshness guard ไว้เป็นตัวเฝ้าอิสระ มันคอยดูว่ามีไฟล์ใหม่ไหลเข้าตามปกติไหม ถ้าไม่มีไฟล์สดนานเกิน 3 วัน ในช่วงฤดูส่งงบ หรือเกิน 7 วัน นอกฤดู มันจะส่งสัญญาณเตือนทันที นี่คือหลักเดียวกับที่เราใช้ monitor โมเดลเครดิตในแบงก์ — คุณไม่ได้แค่สร้างแล้วปล่อย คุณต้องมีตัววัดที่คอยบอกว่ามัน "ยังทำงานถูกอยู่ไหม" ตลอดเวลา

ทำไมมันสำคัญกับเรา: ความน่าเชื่อถือของเครื่องมือข้อมูลไม่ได้อยู่ที่วันเปิดตัว แต่อยู่ที่วันที่ไม่มีใครดูแล — ตัวเฝ้าที่ดังเมื่อข้อมูลค้าง คือความต่างระหว่าง "โปรดักต์ที่เชื่อถือได้" กับ "เดโมที่วันหนึ่งจะค้างเงียบ ๆ โดยที่คุณไม่รู้ตัว"

4. 'สด' แปลว่าสดของแต่ละบริษัท ไม่ใช่สดรวม

ความสดมีกับดักที่ละเอียดกว่าที่คิด บริษัทไทยหลายแห่งใช้รอบปีบัญชีไม่ตรงปฏิทิน (เช่นกลุ่มที่ปิดงบกลางปี) ถ้าผมนิยาม "ล่าสุด N ปี" ด้วยช่วงวันที่แบบรวม ๆ ทั้งตลาด บริษัทที่รอบบัญชีแปลกจะได้เปรียบผิด ๆ — ไฟล์ของมันจะดู "ใหม่กว่า" ในเชิงวันที่ แล้วไปเบียดผลค้นของทั้งตลาดจนคนใช้แพ็กเริ่มต้นเห็นแต่บริษัทกลุ่มนั้น

เดือนกรกฎาคม 2569 ผมเลยปรับให้ระบบนับความสดแบบ per-ticker — "ล่าสุด N ปี" หมายถึงไฟล์ใหม่สุด N งวดของ แต่ละบริษัท ไม่ใช่หน้าต่างวันที่เดียวกันหมด ทำให้บริษัทที่ปิดงบไม่ตรงปฏิทินไม่ผูกขาดผลค้น และคนใช้เห็นภาพทั้งตลาดที่ยุติธรรมขึ้น รายละเอียดว่าทำไม semantic search ถึงเก่งกว่ากด Ctrl-F ในเรื่องแบบนี้ ผมเขียนไว้ที่semantic search ต่างจากค้นคำเป๊ะยังไง

5. แนวคิดเบื้องหลัง: รีอินเด็กซ์เฉพาะที่เปลี่ยน

ถ้าจะรีอินเด็กซ์ทั้งคลังวันละ 2 ครั้งให้ไหว เคล็ดลับคือ อย่าทำใหม่ทั้งหมดทุกครั้ง — ทำใหม่เฉพาะไฟล์ที่เปลี่ยน นี่คือแนวคิดแบบย่อที่ผมใช้ (เช็กด้วยลายนิ้วมือของเนื้อหา แล้ว embed เฉพาะอันใหม่):

import hashlib, json
from pathlib import Path

def fingerprint(text: str) -> str:
    # ลายนิ้วมือของเนื้อหา 1 ท่อน — เปลี่ยน 1 ตัวอักษรก็ได้ค่าใหม่
    return hashlib.sha1(text.encode("utf-8")).hexdigest()

def changed_chunks(chunks: list[dict], cache_path: str) -> list[dict]:
    cache = json.loads(Path(cache_path).read_text() or "{}")
    fresh = [c for c in chunks if cache.get(c["id"]) != fingerprint(c["text"])]
    for c in fresh:                       # อัปเดต cache เฉพาะอันที่จะ re-embed
        cache[c["id"]] = fingerprint(c["text"])
    Path(cache_path).write_text(json.dumps(cache))
    return fresh                          # ส่งต่อเข้าโมเดล embed แค่ก้อนนี้

อ่านทีละบรรทัดว่าแต่ละอย่างกันอะไร:

  • fingerprint() — ย่อเนื้อหาแต่ละท่อนเป็น hash ถ้าข้อความเปลี่ยนแม้ตัวเดียว ค่าจะเปลี่ยน ใช้เทียบว่า "ท่อนนี้ของเดิมหรือของใหม่"
  • cache.get(c["id"]) != fingerprint(...) — เทียบกับลายนิ้วมือรอบก่อน ต่างเมื่อไหร่ = ไฟล์ถูกแก้หรือเพิ่งเข้ามาใหม่ → เข้าคิว re-embed
  • คืนเฉพาะ fresh — โมเดลแปลงเวกเตอร์ทำงานกับก้อนเล็ก ๆ ที่เปลี่ยนจริง รอบรีอินเด็กซ์เลยจบเป็นวินาทีแทนที่จะกินเวลาครึ่งชั่วโมงทุกครั้ง

นี่คือหลักคิดเดียวกับ incremental validation ในงานโมเดล: อย่าตรวจใหม่ทั้งก้อนถ้าเปลี่ยนแค่นิดเดียว — ตรวจให้ตรงจุดที่เปลี่ยน แล้วคุณจะทำถี่ได้โดยไม่พังต้นทุน

ภาพรวม

ความสดไม่ใช่ตัวเลขโฆษณา มันคือเงื่อนไขที่ทำให้ MD&A ยังเป็น "สัญญาณ" ไม่ใช่ "ประวัติศาสตร์" ระบบดึงไฟล์ใหม่วันละ 2 รอบ รีอินเด็กซ์ 09:00 และ 21:00 ทิ้งเวอร์ชันเก่าให้อัตโนมัติ มีตัวเฝ้าคอยเตือนเมื่อข้อมูลค้าง และนับความสดแบบรายบริษัท — ทั้งหมดนี้เพื่อให้ตอนคุณถามคำถามของงานคุณ คำตอบที่ได้อ้างอิงจากคำชี้แจงล่าสุดจริง ๆ พร้อมลิงก์ต้นฉบับให้ตรวจย้อนกลับได้เสมอ

ถ้าอยากลองถามคำถามของสายงานคุณกับคำชี้แจงผู้บริหารเกือบทั้งตลาด แวะที่เครื่องมือค้น MD&A ทั้งตลาดได้เลย ดูว่าแพ็กไหนย้อนหลังลึกแค่ไหนได้ที่หน้าแพ็กเกจ 1/3/5 ปี — ส่วนใครอยากได้ pipeline ดึง-กรอง-อินเด็กซ์เอกสารการเงินแบบวัดผลและคุมได้เอง ผมรวบไว้ในคอร์ส Claude Code

เนื้อหานี้เพื่อการศึกษาและวิเคราะห์พร้อมอ้างอิง ไม่ใช่คำแนะนำการลงทุน · ทุกผลค้นพ่วงลิงก์แบบ 56-1 ต้นฉบับที่บริษัทจดทะเบียนเปิดเผยต่อสาธารณะผ่าน ก.ล.ต. ให้ตรวจสอบเองเสมอ

อ่านต่อ