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

กรองหุ้นด้วย MD&A: อัปโหลดวอทช์ลิสต์ CSV/Excel แล้วอ่านสิ่งที่ผู้บริหารพูด เฉพาะหุ้นในลิสต์คุณ

คู่มือใช้งานจริงของฟีเจอร์กรองหุ้นในเครื่องมือค้น MD&A ทั้งตลาด — พิมพ์รายชื่อหุ้นตรง ๆ หรืออัปโหลดวอทช์ลิสต์เป็นไฟล์ CSV/Excel (สูงสุด 50 ตัว) แล้วถามคำถามเดียวให้กวาดคำชี้แจงผู้บริหารเฉพาะหุ้นในพอร์ต/coverage ของคุณ ส่งออกกลับเป็น Excel ได้ พร้อมแนวทางต่อ API สำหรับทีม/องค์กร (B2B) และเคสจริงจากแบบ 56-1 ที่ตรวจย้อนกลับได้

Varanchai Yingkhamnueng·
financeBoom Leverage

กรองหุ้นด้วย MD&A: อัปโหลดวอทช์ลิสต์ CSV/Excel แล้วอ่านสิ่งที่ผู้บริหารพูด เฉพาะหุ้นในลิสต์คุณ

คู่มือใช้งานจริงของฟีเจอร์กรองหุ้นในเครื่องมือค้น MD&A ทั้งตลาด — พิมพ์รายชื่อหุ้นตรง ๆ หรืออัปโหลดวอทช์ลิสต์เป็นไฟล์ CSV/Excel (สูงสุด 50 ตัว) แล้วถามคำถามเดียวให้กวาดคำชี้แจงผู้บริหารเฉพาะหุ้นในพอร์ต/coverage ของคุณ ส่งออกกลับเป็น Excel ได้ พร้อมแนวทางต่อ API สำหรับทีม/องค์กร (B2B) และเคสจริงจากแบบ 56-1 ที่ตรวจย้อนกลับได้

บทความก่อนหน้าผมเดินให้ดูว่าค้น MD&A ทั้งตลาดเอาไปทำเงินได้ยังไงใน 4 อาชีพ — แต่มีคำถามที่ตามมาบ่อยจากคนทำงานจริง (โดยเฉพาะสาย B2B / กองทุน / ฝ่ายสินเชื่อ) คือ "ผมไม่ได้อยากได้ทั้งตลาด ผมมีลิสต์หุ้นของผมอยู่แล้ว — พอร์ตที่ดูแล, coverage ที่รับผิดชอบ, คู่แข่งที่ต้องจับตา — ผมอยากอ่านเฉพาะเจ้าในลิสต์นี้ได้ไหม"

ได้ครับ และนั่นคือสิ่งที่บทความนี้จะสอน — ฟีเจอร์กรองหุ้น ของเครื่องมือค้น MD&A ทั้งตลาด ที่ให้คุณ "เอาลิสต์หุ้นของคุณเองใส่เข้าไป" แล้วถามคำถามเดียวให้ระบบไปอ่านคำชี้แจงผู้บริหาร (MD&A) เฉพาะหุ้นในลิสต์นั้น ย้อนหลังหลายปี ในไม่กี่วินาที ทั้งแบบ พิมพ์รายชื่อตรง ๆ และแบบ อัปโหลดไฟล์ CSV/Excel (วอทช์ลิสต์ที่คุณมีอยู่แล้ว) — จบด้วยการ ส่งออกกลับเป็น Excel และแนวทางต่อเข้า pipeline องค์กรผ่าน API

ภาพเคลื่อนไหวก่อน–หลังการกรองหุ้นในเครื่องมือค้น MD&A ทั้งตลาด — เฟรมแรกค้นคำว่า "การบริโภคชะลอตัว" ทั้งตลาดได้ผล 23 บริษัท เฟรมสองใส่วอทช์ลิสต์ CPALL, CRC, HMPRO, BJC, CPN แล้วผลบีบเหลือ 5 บริษัทในลิสต์ พร้อมข้อความ MD&A ต้นฉบับและลิงก์ไฟล์ 56-1 ให้ตรวจสอบเอง

ก่อน–หลังกรอง (ภาพจาก UI จริง ไม่ใช่ภาพจำลอง): ถามแนวคิดเดียว "การบริโภคชะลอตัว" — ค้นทั้งตลาดเจอ 23 บริษัท พอใส่วอทช์ลิสต์ CPALL · CRC · HMPRO · BJC · CPN ผลบีบเหลือ 5 บริษัทในลิสต์ทันที (สังเกตตัวเลข "บริษัท" และรายชื่อผลลัพธ์เปลี่ยน) ทุกใบยกข้อความต้นฉบับ + ลิงก์ 56-1 ให้ตรวจ

ทำไม "กรองเฉพาะลิสต์ตัวเอง" ถึงสำคัญกว่าค้นทั้งตลาด (สำหรับงานประจำ)

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

  • ฝ่ายสินเชื่อ/credit risk มีพอร์ตลูกหนี้บริษัทที่ต้องเฝ้าอยู่แล้ว 30–50 ราย — อยากกวาดหาภาษาความเสี่ยงเฉพาะรายชื่อในพอร์ต ไม่ใช่ทั้งตลาด
  • นักวิเคราะห์/กองทุน มี coverage universe หรือ SET50/SETHD ที่ต้องอัปเดตทุกไตรมาส
  • เซลส์ B2B มี target account list ที่ทีมช่วยกันปิดอยู่ — อยากรู้ว่าใครในลิสต์กำลังขยาย/ลดต้นทุน
  • ทีมกลยุทธ์ มี "กลุ่มคู่แข่ง" ที่ต้องจับตาเป็นชุดเดิมทุกเดือน

การกรองให้เหลือเฉพาะลิสต์ทำให้ผลลัพธ์ ตรง ไม่มี noise และเทียบข้ามชื่อในลิสต์เดียวกันได้ทันที นี่คือความต่างระหว่าง "เครื่องมือค้นหา" กับ "เครื่องมือทำงานประจำ"

วิธีที่ 1: กรองหุ้นตรง ๆ — พิมพ์รายชื่อในช่องกรอง

ในหน้าเครื่องมือ ใต้ช่องค้นหาหลักจะมีช่อง "กรอง" ให้ใส่ชื่อย่อหุ้น คุณพิมพ์ (หรือวาง) รายชื่อคั่นด้วยเว้นวรรคหรือจุลภาคก็ได้ เช่น PTT, SCB, KBANK แล้วพิมพ์ "แนวคิด" ที่อยากรู้ในช่องหลัก ระบบจะบีบผลให้เหลือเฉพาะหุ้นเหล่านั้น

จุดสำคัญที่ต้องเข้าใจ: การค้นยังเป็น semantic (ความหมาย) เหมือนเดิม — ตัวกรองแค่จำกัด "ขอบเขตบริษัท" ไม่ได้เปลี่ยนวิธีค้นเป็นคำเป๊ะ คุณเลยยังพิมพ์ "การบริโภคชะลอตัว" แล้วเจอบริษัทที่เขียนว่า "cautious consumer spending" ได้ แม้คนละคำ (ทำไมถึงเป็นแบบนั้น อ่านsemantic search ต่างจากค้นคำเป๊ะยังไง)

บนหน้าเว็บ คุณแค่พิมพ์ ไม่ต้องเขียนโค้ด — แต่เพื่อให้เห็นเบื้องหลังว่าตัวกรองทำอะไร ผมแปะโค้ดเชิงแนวคิดกำกับไว้ (API สำหรับทีม/องค์กรอยู่ในแผน beta — ดูท้ายบทความ):

# ตัวอย่างเชิงแนวคิด — บนหน้าเว็บพิมพ์ในช่องได้เลย
from boomleverage import mdna

hits = mdna.search(
    "การบริโภคชะลอตัว",                     # แนวคิด (semantic)
    tickers=["CPALL", "CRC", "HMPRO", "BJC", "CPN"],  # กรองเฉพาะลิสต์คุณ
    top_k=10,
)
for r in hits["results"]:
    print(r["ticker"], f"ปี {r['fy']}", r["period"])
    print(r["snippet_verbatim"])   # ข้อความจริงจาก MD&A (verbatim)
    print(r["source_url"])         # ลิงก์ไฟล์ 56-1 ต้นฉบับ ก.ล.ต.

ข้อจำกัดที่ตั้งใจใส่: กรองได้ สูงสุด 50 ตัวต่อครั้ง — พอสำหรับพอร์ต/coverage ส่วนใหญ่ แต่กันไม่ให้ใครกรอง "ทั้งตลาด" รวดเดียวเพื่อดูดข้อมูล (เหตุผลเชิงธุรกิจ ไม่ใช่ข้อจำกัดทางเทคนิค)

วิธีที่ 2: อัปโหลดวอทช์ลิสต์เป็นไฟล์ CSV/Excel

ถ้าลิสต์ของคุณอยู่ใน Excel อยู่แล้ว (พอร์ต, coverage, target list) ไม่ต้องพิมพ์ทีละตัว — กดปุ่ม "นำเข้าหุ้น (watchlist)" แล้ว อัปโหลดไฟล์ CSV ได้เลย ระบบจะอ่าน คอลัมน์แรกของแต่ละแถวเป็นชื่อย่อหุ้น (รูปแบบมาตรฐานของไฟล์ export วอทช์ลิสต์ทั่วไป) เพราะฉะนั้นไฟล์หน้าตาแบบนี้ใช้ได้ทันที:

Symbol
PTT
AOT
CPALL

ในเครื่องมือมีปุ่มให้ ดาวน์โหลดไฟล์เทมเพลต (mdna-watchlist-template.csv) ที่มีหัวคอลัมน์ Symbol มาให้ — เปิดด้วย Excel/Google Sheets วางรายชื่อหุ้นของคุณลงคอลัมน์แรก เซฟเป็น .csv แล้วอัปโหลดกลับ

เคล็ดลับจาก Excel จริง: ส่วนใหญ่คุณมีไฟล์พอร์ตที่มีหลายคอลัมน์ (ชื่อหุ้น, จำนวน, ต้นทุน, มูลค่า...) อยู่แล้ว — แค่จัดให้ คอลัมน์ชื่อย่อหุ้นเป็นคอลัมน์แรก แล้ว Save As → CSV ระบบจะหยิบเฉพาะคอลัมน์แรกไปใช้ คอลัมน์อื่นไม่กระทบ (ถ้าทำ automation งาน Excel บ่อย ๆ ผมเขียนแนวทางไว้ที่ให้ Claude Code จัดการ Excel อัตโนมัติ)

จะวางเป็นข้อความก็ได้ ไม่ต้องเป็นไฟล์ — ก็อปคอลัมน์หุ้นจาก Excel มาวางในกล่องนำเข้าตรง ๆ ระบบตัดบรรทัด/จุลภาค/แท็บให้เอง แล้วดึงเฉพาะชื่อย่อหุ้นออกมา

กรองปี/งวดซ้อนเข้าไปอีกชั้น

นอกจากกรองบริษัท ยังมีตัวกรอง ปีงบการเงิน และ งวด (Q1–Q4 / งบทั้งปี) ให้บีบให้แคบลงอีก เช่น "ดูเฉพาะพอร์ตแบงก์ของผม เฉพาะงบไตรมาสล่าสุด" หรือ "ย้อนดูช่วงปี 2565–2566 ตอนต้นทุนพลังงานพุ่ง" — สามชั้น (บริษัท + ปี + งวด) ทำให้คุณเจาะไปที่ "ช่วงเวลาที่สงสัย" ของ "หุ้นที่สนใจ" ได้ตรงจุด

อ่านผล แล้วส่งออกกลับเป็น Excel

ผลลัพธ์แต่ละใบยก ข้อความต้นฉบับ (verbatim) จาก MD&A พร้อม ชื่อบริษัท · ปี · งวด · เลขหน้า · ลิงก์ไฟล์ 56-1 ที่ ก.ล.ต. เผยแพร่ — และมีปุ่ม Export Excel ที่ดึงชุดผลจัดอันดับครบ (สูงสุด 100 รายการ) ออกมาเป็นไฟล์ตารางที่เปิดใน Excel ได้ทันที คอลัมน์ที่ได้:

คอลัมน์คือ
บริษัทชื่อย่อหุ้น
ปี (พ.ศ.) · งวดปีงบ + ไตรมาส/งบทั้งปี
หน้าเลขหน้าในไฟล์ต้นฉบับ
ข้อความ MD&A (ต้นฉบับ)verbatim ที่ยกมา
ลิงก์ SECURL ไฟล์ 56-1 ต้นฉบับ

นี่คือหัวใจของงาน research การเงิน — คุณได้ไฟล์ที่ เอาไปต่องานได้ทันที (แปะใน credit memo, ทำ sector note, ส่งทีม) โดยทุกบรรทัดมี ที่มาให้กดกลับไปตรวจเอง ไม่ใช่ AI สรุปลอย ๆ ที่ชี้แหล่งไม่ได้

เคสจริง: กรอง 3 วอทช์ลิสต์ เห็นอะไรบ้าง

ทุกผลด้านล่างเป็นของจริงจากระบบ (ยกต้นฉบับ 56-1 กดตรวจได้) ผมเลือกมา 3 แบบให้เห็นว่า "ลิสต์ต่างกัน = คำถามต่างกัน"

วอทช์ลิสต์ค้าปลีก–อุปโภคบริโภค → ถาม "การบริโภคชะลอตัว"

กรองเหลือ CPALL, CRC, HMPRO, BJC, CPN แล้วถามเรื่องกำลังซื้อ — ระบบยกคำชี้แจงที่ผู้บริหารพูดถึงผู้บริโภคระวังการใช้จ่ายมาวางเทียบข้ามเจ้า เช่น HMPRO และ CRC:

HMPRO · ปี 2564 (ไตรมาส 3): "...sales was affected by the temporary stores closure by the order of the Center for COVID-19 Situation Administration (CCSA) and lower consumer purchasing power along with declining of economic situation... the government has relaxed the lockdown measure but the consumer purchasing power has not fully recovered yet..."

CRC · ปี 2566 (ไตรมาส 3): "...cautious in spending amid the economic slowdowns. However, it met customer needs through Omnichannel platforms, the revenue of which was consistently generated, increasing 9% from the previous year..."

— ข้อความบางส่วน (verbatim) จาก MD&A · ตรวจต้นฉบับ HMPRO 56-1 · CRC 56-1

เห็นทันทีว่าเจ้าไหน "โดน" และเจ้าไหน "รับมือได้" (CRC ชดเชยด้วย Omnichannel) — เทียบท่าทีในลิสต์เดียวกันในคลิกเดียว

วอทช์ลิสต์ส่งออก–อิเล็กทรอนิกส์ → ถาม "เงินบาทกระทบกำไร"

กรองเหลือ KCE, HANA, DELTA, IVL, PTT แล้วถามเรื่องอัตราแลกเปลี่ยน — เหมาะกับคนดูกลุ่มส่งออกที่กำไรอ่อนไหวกับค่าเงิน:

HANA · ปี 2565 (ทั้งปี): "...purchasing currency which is primarily USD and the operating currency in each country which we operate..." (ผู้บริหารระบุโครงสร้างสกุลเงินซื้อ-ขายที่เป็นตัวขับความเสี่ยง FX โดยตรง)

— verbatim จาก MD&A ของ HANA · ต้นฉบับ ก.ล.ต.

วอทช์ลิสต์แบงก์ (พอร์ตสินเชื่อ) → ถาม "การตั้งสำรองผลขาดทุนด้านเครดิต"

อันนี้บ้านเกิดของผมเอง กรองเหลือ BBL, KBANK, SCB, KTB, TTB แล้วถามเรื่อง ECL/การตั้งสำรอง — ระบบยกท่อนที่ผู้บริหารพูดถึงระดับสำรองพร้อมตัวเลข bps มาให้:

SCB · ปี 2565 (ไตรมาส 2): "Given a high level of global uncertainty and economic headwinds from accelerating inflation, expected credit losses increased to Baht 10,250 million (175 bps of total loans) in 2Q22. Nonetheless, the Company expects to set aside provisions at not more than 145 bps for full year 2022."

— verbatim จาก MD&A ของ SCB (SCB X) · ต้นฉบับ ก.ล.ต.

สำหรับสายสินเชื่อ นี่คือ Early Warning แบบกวาดทั้งพอร์ตในคำถามเดียว — ถ้าธนาคารในลิสต์เริ่มพูดถึงการตั้งสำรองเพิ่ม/คุณภาพสินทรัพย์อ่อนลง = ธงให้เข้าไปดูก่อน (กรอบการอ่านสัญญาณพวกนี้ผมเขียนไว้ที่5 คำถามที่คนทำ risk ใช้อ่าน MD&A)

ต่อเข้าระบบองค์กร: วน CSV ทั้ง coverage universe ด้วย API (B2B)

พอลิสต์เกิน 50 ตัว หรืออยากรันเป็น pipeline ทุกไตรมาสโดยไม่ต้องนั่งกดหน้าเว็บ — นั่นคือโจทย์ B2B ที่ตัวกรอง tickers ถูกออกแบบมารองรับผ่าน REST API (อยู่ในแผน beta สำหรับทีม/quant/กองทุน) ไอเดียคือ: อ่านไฟล์ CSV ของ coverage คุณ, ตัดเป็นก้อนละ 50, ยิงคำถามเดิมวนทุกก้อน, รวมผลกลับเป็น Excel เดียว

# ตัวอย่างเชิงแนวคิด (API สำหรับทีม/องค์กร — แผน beta)
import csv, requests

BASE = "https://api.boomleverage.com/mdna/v1"   # base URL + key ได้รับตอนเปิด beta

# 1) โหลด coverage universe ของคุณจาก CSV (คอลัมน์แรก = ชื่อย่อหุ้น)
with open("my_coverage.csv", encoding="utf-8-sig") as f:
    universe = [row[0].strip().upper() for row in csv.reader(f) if row and row[0].strip()]
universe = [t for t in universe if t != "SYMBOL"]     # ตัดหัวคอลัมน์ทิ้ง

def chunks(xs, n=50):                                   # ตัดเป็นก้อนละ ≤50 (เพดานตัวกรอง)
    for i in range(0, len(xs), n):
        yield xs[i:i + n]

# 2) ยิงคำถามเดิมวนทุกก้อน แล้วรวมผล
rows = []
for batch in chunks(universe):
    resp = requests.post(
        f"{BASE}/query",
        headers={"X-Api-Key": "<YOUR_KEY>"},
        json={"query": "การตั้งสำรองหนี้เพิ่มขึ้น", "tickers": batch, "top_k": 50},
        timeout=30,
    ).json()
    for r in resp["results"]:
        rows.append([r["ticker"], r["fy"], r["period"],
                     r["snippet_verbatim"], r["source_url"]])   # verbatim + ลิงก์ 56-1

# 3) เขียนกลับเป็น CSV ให้เปิดใน Excel ได้ทันที
with open("mdna_scan.csv", "w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["ticker", "ปี", "งวด", "ข้อความ MD&A (ต้นฉบับ)", "ลิงก์ SEC"])
    w.writerows(rows)

รูปแบบนี้เปลี่ยน "งานอ่านงบทีละไฟล์" ให้เป็น cron job ที่สแกนทั้ง coverage ทุกเช้า แล้ววางผลลง Excel/ชีตให้ทีม — เหมาะกับฝ่าย research กองทุน, ทีม credit ที่มีพอร์ตใหญ่, หรือ data team ที่อยากฝัง MD&A เข้า dashboard ภายใน โครงสร้าง REST + JSON + ยกต้นฉบับทุกผลลัพธ์ ทำให้ต่อเข้า notebook/backtest/สกรีนของคุณเองได้ (สนใจ API ทีม/องค์กร ทักผ่านหน้าสินค้า ได้)

สรุป: ทำไม "กรองหุ้น" ถึงเป็นฟีเจอร์ที่ทำให้มันเป็นสินค้า B2B

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

  • พิมพ์/วางรายชื่อ หรืออัปโหลด CSV/Excel — เอาลิสต์ที่คุณมีอยู่แล้วเข้าระบบใน 5 วินาที
  • ถามคำถามเดียว กวาดเฉพาะลิสต์ ย้อนหลังหลายปี — semantic search เต็มรูปแบบ แค่บีบขอบเขต
  • ส่งออก Excel + ทุกผลมีลิงก์ 56-1 — เอาไปต่องานได้ทันที ตรวจย้อนกลับได้ 100%
  • ต่อ API วนทั้ง universe — สำหรับทีมที่อยากทำเป็น pipeline อัตโนมัติ

เครื่องมือการเงินที่ดีไม่ได้ทำให้คุณ "เชื่อโดยไม่ต้องตรวจ" แต่ทำให้คุณ "ตรวจได้เร็วขึ้น" — และการกรองให้เหลือเฉพาะหุ้นที่คุณต้องรับผิดชอบจริง คือวิธีที่เร็วที่สุดในการเริ่ม ลองดูรายละเอียดและราคาที่หน้าเครื่องมือค้น MD&A ทั้งตลาด หรืออ่านต่อว่าค้น MD&A ทั้งตลาดเอาไปทำเงินได้ยังไงใน 4 อาชีพ

หมายเหตุ: เครื่องมือนี้เป็นการวิเคราะห์/ค้นข้อมูลจากเอกสารสาธารณะเพื่อการศึกษาและประกอบการตัดสินใจ ไม่ใช่คำแนะนำการลงทุนหรือการชี้นำซื้อขายหลักทรัพย์ การตัดสินใจลงทุนเป็นความรับผิดชอบของผู้ลงทุนเอง

อ่านต่อ