หุ้นใน SET100 ตัวไหนน่าลงทุนที่สุด [17–24 ก.ย.63]

บทความนี้เป็นส่วนหนึ่งของ Data Science Essential Botnoi Classroom : Project 3 — Trend Forecasting by Group 7

Walaithip Thanakorncharuwit
botnoi-classroom
9 min readSep 18, 2020

--

บทความนี้จัดทำขึ้นเพื่อเป็นกรณีศึกษา ในการพยากรณ์ราคาหุ้น สำหรับการลงทุนใน วันที่ 17–24 กันยายน 2563 ซึ่งข้อมูลที่ใช้ในการวิเคราะห์เป็นข้อมูลในอดีต จนถึง วันที่ 15 กันยายน 2563 โดยการพยากรณ์นี้ จะใช้ Machine Learning และ ศาสตร์การเล่นหุ้นเชิงเทคนิคเข้ามาช่วยในการวิเคราะห์

หมายเหตุ : การลงทุนมีความเสี่ยง ผู้ลงทุนควรศึกษาข้อมูลก่อนตัดสินใจลงทุน

โจทย์ที่ได้รับ คือ ให้นำหุ้นจาก SET100 ทั้งหมดมารันโมเดลทาง Machine Learning แล้วเลือกหุ้นที่โมเดลบอกว่าได้กำไรสูงที่สุดมา 1 ตัว โดยมีเงื่อนไขว่า ซื้อหุ้นที่ราคา ATO ในวันพฤหัสที่ 17 กันยายน 2563 และ ขายที่ราคา ATO ในวันพฤหัสที่ 24 กันยายน 2563

เริ่มจากการตีความจากโจทย์กันก่อนเลย

  • ลงทุน ตั้งแต่วันที่ 17–24 กันยายน แสดงว่าลงทุนจริงเพียง 5 วัน นับวันที่ตลาดเปิด ซึ่งถือว่าเป็นการลงทุนระยะสั้น เป็นการเก็งกำไร ดังนั้นวิธีการวิเคราะห์หุ้นที่เหมาะสมควรเป็นการใช้กราฟเทคนิค
  • การลงทุนในหุ้น เฉพาะกลุ่ม SET100 แสดงว่ามีการจำกัดความเสี่ยงในการลงทุนได้ระดับนึง เพราะ SET100 คือ ดัชนีราคาหุ้นสามัญ 100 ตัวแรก ที่มีมูลค่าตามราคาตลาด (Market Capitalization) และสภาพคล่องในการซื้อขายสูงสุด
  • การซื้อขายที่ราคา ATO คือการซื้อขายที่ราคาเปิดตลาด ซึ่งราคาส่วนใหญ่จะมีความใกล้เคียงกับราคาปิดตลาดของวันก่อนหน้า ยกเว้นมีบางปัจจัยที่ทำให้ราคาปรับตัวสูงขึ้นหรือลดลงผิดปกติ เช่น ตลาดช่วงนี้เป็นขาลง ดังนั้นจะเกิดการปั่นราคาหุ้นในช่วงเปิดตลาด เพื่อให้ราคาพุ่งสูงขึ้นในระยะสั้นและจะเทขายเพื่อทำกำไรภายในวัน ทำให้ช่วงปิดตลาดราคาจะต่ำลงกว่าวันก่อนหน้า เป็นต้น

ดังนั้น การจะเก็งกำไรหุ้นระยะสั้นในตลาดหุ้นขาลงเช่นนี้ ควรทำความเข้าใจสภาวะตลาดหุ้นในปัจจุบันก่อน

สภาวะตลาดหุ้นปัจจุบัน

(อัพเดทข้อมูลล่าสุด วันศุกร์ที่ 11 กันยายน 2563)

กราฟดัชนี SET100, MACD, RSI, Stoch (ศ. 11 ก.ย. 63) — Stockradars

จากกราฟดัชนี SET100 พบว่าตลาดอยู่ในช่วงขาลง และมีแนวโน้มลงอย่างต่อเนื่องแต่จะปรับราคาขึ้นในระยะสั้นแล้วลงต่อ โดยตัวชี้วัดอื่นก็บ่งบอกถึงการลงต่อของตลาดเช่นกัน ได้แก่ MACD อยู่ใต้เส้น Signal แต่แนวโน้มไม่ชัดเจนเนื่องจากกราฟ MACD เกิดการ sideway ออกด้านข้าง และดัชนี RSI มีแนวโน้มลงต่อ ส่วนดัชนี Stoch ณ จุดตัดระหว่าง %K และ %D มีการเข้าใกล้เส้นมาตรฐานที่ 20 มากขึ้น แสดงว่า ดัชนี SET100 มีโอกาสลงต่อได้อีกซักพักแล้วจะดีดตัวกลับขึ้นมา ดังนั้นการลงทุนในสัปดาห์หน้าอาจเห็นการปรับตัวของราคาเป็นขาขึ้นในกรอบแคบๆ

กราฟแท่งเทียนของดัชนี SET100, ปริมาณการซื้อขาย และปริมาณการซื้อขายสุทธิ (ศ. 11 ก.ย. 63) — Stockradars

ซึ่งจากการลากเส้นกรอบดัชนี SET100 สำหรับสัปดาห์หน้าจะอยู่ในกรอบแคบๆ ระหว่าง 1831–1940 จุด ทั้งนี้การวิเคราะห์กราฟแท่งเทียนประกอบพบว่า ช่วงราคาวันพฤหัสที่ 9 กันยายน มีราคาดิ่งลงในช่วงเช้าและดีดกลับมาปิดบวก ซึ่งถือว่ามีความผันผวนทางราคามาก ส่งผลให้วันถัดมามีการขายทำกำไรในกรอบแคบๆ รวมทั้งปริมาณการซื้อขายมีไม่มากนักแสดงว่านักลงทุนไม่มั่นใจกับสภาวะตลาดตอนนี้

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

วิเคราะห์นักลงทุนต่างชาติ

สาเหตุที่ต้องวิเคราะห์นักลงทุนต่างชาติ หรือ NVDR เป็นเพราะว่านักลงทุนประเภทนี้มักเข้ามามีบทบาทสำคัญในช่วงที่เศรษฐกิจมีปัญหาเช่นในปัจจุบัน เพราะลักษณะการลงทุนจะเป็นรูปแบบของการเก็งกำไรระยะสั้น และ ยังมีมูลค่าการซื้อขายสูง ซึ่งสิ่งที่เราควรนำมาวิเคราะห์เพื่อตัดสินใจ คือ หุ้นตัวไหนที่นักลงทุนต่างชาติให้ความสนใจ ซึ่งวิเคราะห์ได้จาก ปริมาณการซื้อขายสุทธิ (Net Volume) และ มูลค่าการซื้อขายสุทธิ (Net Value) ที่มีค่าสูงนั่นเอง

หมายเหตุ : NVDR คือ Non-Voting Depository Receipt หรือใบแสดงสิทธิในผลประโยชน์ที่เกิดจากหลักทรัพย์อ้างอิงไทย ซึ่งเป็นทางเลือกสำหรับนักลงทุนต่างชาติเพื่อที่จะได้รับปันผลเช่นเดียวกับนักลงทุนไทย แต่ถ้าเป็นนักลงทุนต่างชาติทั่วไปที่ไม่ได้ซื้อขายผ่าน NVDR ก็จะไม่สามารถรับเงินปันผลได้ นักลงทุนต่างชาติส่วนใหญ่จึงอยู่ในรูปแบบการซื้อขายผ่าน NVDR นั่นเอง

มูลค่าการซื้อขายตามประเภทนักลงทุน และ มูลค่าการซื้อขายของนักลงทุนต่างชาติ (พฤ. 10 ก.ย. 63) — Bloomberg

จากการวิเคราะห์เพิ่มเติมในส่วนของนักลงทุนต่างชาติ พบว่ามีการเทขายหุ้นไทยอย่างต่อเนื่อง แต่เมื่อดูในส่วนของหุ้นที่มีมูลค่าการซื้อขายสุทธิมากที่สุด 30 อันดับ จากนักลงทุนต่างชาติ พบว่ายังมีหุ้นที่น่าสนใจสำหรับเก็งกำไรอยู่บ้าง (ตามรูปภาพข้างล่าง)

หุ้นที่มีการซื้อสุทธิมากที่สุด 30 อันดับแรก (พฤ. 10 ก.ย. 63) — ข่าวหุ้นธุรกิจออนไลน์

ทีนี้เรามาดูกันดีกว่า ว่ามีปัจจัยอะไรบ้างที่กระทบต่อมูลค่าตลาด และทำให้เกิดเป็นกราฟ SET100 ที่แสดงไว้ข้างต้น

ภาพรวมเศรษฐกิจในปีนี้

  • เศรษฐกิจตกลงทั่วโลก เนื่องจากการระบาดของเชื้อ Covid-19 ส่งผลให้ผลประกอบการเกือบทุกบริษัทแย่ลง ซึ่งก็มีบริษัทที่ได้รับผลกระทบทั้งมากและน้อยปะปนกัน
  • ความตึงเครียดระหว่าง สหรัฐฯ และ จีน ยังคงมีให้เห็นต่อเนื่อง ล่าสุดสหรัฐฯเรียกร้องให้กลุ่มประเทศสมาชิกอาเซียนทบทวนความสัมพันธ์กับบริษัทจีน รวมทั้งพิจารณาการสั่งแบนบริษัทผู้ผลิตชิปรายใหญ่ของจีน และ จะต้องมีการตกลงซื้อขาย TikTok ภายใน 15 กันยายนนี้ อีกทั้งวันพฤหัสที่ผ่านมา สหรัฐพึ่งประกาศยกเลิก Visa ของนักเรียนและนักวิจัยชาวจีนกว่า 1,000 คน
  • ความหดตัวของเศรษฐกิจทั่วโลกจาก GDP 2Q63 ของ US -32.9% EU -14.7% ญี่ปุ่น -28.1% ไทย -9.7%
  • ยอดผู้ยื่นขอสวัสดิการว่างงานครั้งแรกของสหรัฐฯสูงเกินคาด จำนวน 884,000 รายในสัปดาห์ที่แล้ว จากตัวเลขคาดการณ์ที่ระดับ 850,000 ราย ขณะที่การปลดพนักงานยังเกิดขึ้นอย่างต่อเนื่องทั่วทุกอุตสาหกรรม

ภาพรวมตลาดในสัปดาห์นี้

ในส่วนนี้ควรมีการติดตามอย่างต่อเนื่อง เนื่องจากเป็นปัจจัยหลักที่ส่งผลให้ราคาเกิดความผันผวนในระยะสั้นได้

  • ความไม่แน่นอนระหว่าง UK และ EU ที่มีโอกาสเกิด No-deal Brexit สูง หลังจากพยายามตกลงกันมาแล้ว 8 ครั้ง ตั้งแต่ต้นปี และจะครบกำหนดการ Brexit วันที่ 15 ตุลาคมนี้
  • การดิ่งตัวลงของดัชนีหุ้นสหรัฐฯ จากการเทขายทำกำไรอย่างต่อเนื่องในกลุ่ม Tech ส่งผลให้ S&P500 ตกลงและกระทบตลาดหุ้นอื่นทั่วโลก
  • ราคาน้ำมันดิบ (West Texas Index หรือ WTI) ที่ยังลงต่อเนื่อง 4–5วัน ล่าสุดลงแรง 7.57% ภายในวันเดียว จากความกังวลเรื่องการฟื้นตัวของอุปสงค์น้ำมันไม่สอดคล้องกับสต็อกน้ำมันสำเร็จรูปที่มีอยู่ปริมาณสูง และเป็นปัจจัยที่ดึงหุ้นลงได้ต่อไปจนถึงสัปดาห์หน้า
  • การประท้วงภายในประเทศไทย ที่อาจนำไปสู่การเกิดรัฐประหาร ส่งผลลบต่อตลาดหุ้นในประเทศ และ นักลงทุนต่างชาติขายหุ้นออกจากความรู้สึกไม่มั่นใจทางการเมือง

หมายเหตุ : ในการลงทุนวันพฤหัสที่ 17 กันยายน 2563 ควรพิจารณาสภาวะตลาดอีกครั้งก่อนการลงทุน

การวิเคราะห์กราฟเทคนิค

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

ตัวชี้วัดที่สำคัญ ได้แก่ MACD, RSI และ Stoch … มาดูกันทีละตัวเลย…

MACD (Moving Average Convergence Divergence)

ใช้สำหรับดูแนวโน้มราคาหุ้นว่าขึ้นหรือลง และ ดูโมเมนตัมของราคาว่ามีแรงมากหรือน้อยขนาดไหน

โดย MACD คำนวนมาจาก ผลต่างค่า Exponential Moving Average 12วัน และ 26วัน เขียนเป็นสมาการได้ดังนี้ MACD = EMA12 — EMA26

ตัวอย่าง

ตัวอย่างแสดงค่า MACD (เส้นสีเขียว) Signal Line (เส้นสีชมพู) และ MACD Histogram (แท่งสีเหลือง) พร้อมๆกัน — ASPEN Mobile

จากตัวอย่างแสดงให้เห็นว่า ลักษณะ MACD จะมีความคล้ายคลึงกับกราฟราคาหุ้น แต่จะไม่เหมือนซะทีเดียว เกิดจากโมเมนตัมราคานั่นเอง ทั้งนี้จะต้องดู Signal Line และ MACD Histogram ประกอบด้วย

Signal Line

เป็นค่า Moving Average ของ เส้นMACD ใช้สำหรับบอกว่าราคาหุ้นอยู่ในช่วงขาขึ้นหรือขาลง สังเกตได้ดังนี้

กรณีที่1 เส้นMACD อยู่เหนือ เส้นSignal แสดงว่า MACD มีแนวโน้มเป็นขาขึ้น หรือ เป็นช่วงที่มีแรงซื้อ

กรณีที่2 เส้นMACD อยู่ต่ำกว่า เส้นSignal แสดงว่า MACD มีแนวโน้มเป็นขาลงหรือ เป็นช่วงที่มีแรงขาย

MACD Histogram

ใช้สำหรับสังเกตว่า เส้นMACD กับ เส้นSignal Line กำลังลู่เข้าหากันหรือกำลังแยกออกจากกัน เพื่อดูโอกาสในการตัดกัน สังเกตได้ดังนี้

กรณีที่1 MACD Histogram มีค่าเป็นบวก แสดงว่า เส้นMACD อยู่เหนือ เส้นSignal Line และถ้ามีค่าเป็นบวกเพิ่มมากขึ้น แสดงว่า เส้นMACD และ เส้นSignal Line แยกออกจากกัน ซึ่งมีโอกาสตัดกันน้อยลง

กรณีที่2 MACD Histogram มีค่าเป็นบวก แสดงว่า เส้นMACD อยู่เหนือ เส้นSignal Line และมีค่าเป็นบวกลดลง แสดงว่า เส้นMACD และ เส้นSignal Line ลู่เข้าหากัน ซึ่งมีโอกาสตัดกันมากขึ้น

กรณีที่3 MACD Histogram มีค่าเป็นลบ แสดงว่า เส้นMACD อยู่ต่ำกว่า เส้นSignal Line และถ้ามีค่าเป็นลบเพิ่มมากขึ้น แสดงว่า เส้นMACD และ เส้นSignal Line แยกออกจากกัน ซึ่งมีโอกาสตัดกันน้อยลง

กรณีที่4 MACD Histogram มีค่าเป็นลบ แสดงว่า เส้นMACD อยู่ต่ำกว่า เส้นSignal Line และมีค่าเป็นลบลดลง แสดงว่า เส้นMACD และ เส้นSignal Line ลู่เข้าหากัน ซึ่งมีโอกาสตัดกันมากขึ้น

ซึ่งจุดตัดระหว่าง เส้นMACD และ เส้นSignal Line เป็นสัญญาณบ่งบอกว่าหุ้นตัวนี้เริ่มมีความน่าสนใจ หรือเป็นสัญญาณเตือนล่วงหน้าว่าราคาหุ้นในอนาคตอาจมีการเปลี่ยนแปลงทิศทาง แต่การหาจังหวะลงมือซื้อขายหุ้นที่ดีนั้น จะต้องกลับไปวิเคราะห์จากกราฟราคาหุ้นเสมอเนื่องจากกราฟราคาหุ้นเป็นข้อมูลที่ใช้แสดงพฤติกรรมของคนที่เข้ามาซื้อขายในตลาดได้ดีที่สุด

RIS (Relative Strength Index)

ใช้สำหรับวัดค่าการแกว่งตัวของราคาว่าซื้อหรือขายมากไปหรือไม่ ซึ่งเทียบเป็นช่วง 0–100 และมีค่ามาตรฐานอยู่ที่ 30 และ 70

โดยถ้า RSI อยู่ในระดับตํ่ากว่า 30 แนะนำให้ซื้อ เพราะหมายถึง ราคาต่ำเกินไป หรือ ขายมากเกินไปแล้ว (Oversold) แต่ถ้ามากกว่า 70 แนะนำให้ขาย เพราะหมายถึงราคาสูงเกินไป หรือ ซื้อมากเกินไปแล้ว (Overbought)

แต่ถ้าอยู่ในช่วง 30–70 ควรพิจารณาร่วมกับการลากเส้นเทคนิค ซึ่งแบ่งได้ 3 กรณี ดังนี้

กรณีที่1 กราฟ Sideway ทั้งกราฟราคาหุ้น และ RSI ซึ่งจะต้องลากเส้นแนวต้าน RSI เพื่อตัดสินใจ คือถ้าราคาปิดสูงทะลุแนวต้าน RSI แสดงว่ามีแนวโน้มราคาขึ้น แต่ถ้าปิดต่ำกว่าจะต้องพิจารณาว่าต้องรอดูอีกวันว่าขึ้นมั้ย หรือจะกลับทิศทางเป็นขาลง

ตัวอย่างกราฟราคาหุ้น เทียบกับกราฟ RSI ที่เป็นSideway — FINNOMENA

กรณีที่2 ถึงแม้กราฟราคาหุ้นมีแนวโน้มเป็นขาขึ้น สวนทางกับ RSI ที่เป็นขาลง แต่ว่าแนวโน้มราคาหุ้นจะเป็นขาลงด้วย

ตัวอย่างกราฟราคาหุ้น เทียบกับกราฟ RSI ที่เป็นขาลง — FINNOMENA

กรณีที่3 ถึงแม้กราฟราคาหุ้นมีแนวโน้มเป็นขาลง สวนทางกับ RSI ที่เป็นขาขึ้น แต่ว่าแนวโน้มราคาหุ้นจะเป็นขาขึ้นด้วย

ตัวอย่างกราฟราคาหุ้น เทียบกับกราฟ RSI ที่เป็นขาขึ้น — FINNOMENA

ดังนั้นจะเห็นว่าการวิเคราะห์ว่าราคาจะขึ้นหรือลง นอกเนือจากเหนือเส้นมาตรฐาน 70ให้ขาย และต่ำกว่า 30 จะต้องซื้อแล้ว ยังต้องวิเคราะห์ตัวชี้วัด RSI เป็นหลักโดยดูแนวโน้มว่าเป็นขาขึ้นหรือขาลง ส่วนกราฟราคาหุ้นจะทำหน้าที่บอกแนวรับแนวต้านของราคาหุ้นได้

Stoch (Stochastic Oscillator)

ใช้สำหรับบอกโมเมนตัมของราคาว่าเปลี่ยนแปลงคิดเป็นกี่เปอร์เซ็นในช่วงเวลาที่กำหนด ซึ่งจะบอกแนวรับแนวต้าน

ตัวอย่างสูตร เมื่อกำหนดให้ใช้ ระยะเวลาในการคำนวณ Stochastic เท่ากับ 5 เราจะกำหนด Time Frame ตามสมการของ Stochastic ซึ่งเท่ากับ 5 วันในกราฟ Daily Chart เขียนสูตรได้ดังนี้

%K = 100 x (ราคาปัจจุบัน -L5) /(H5 - L5)

%D = ((K1+K2+K3)/3)

โดยกรอบของราคาจะอยู่ระหว่าง 0–100 และมีค่ามาตรฐานอยู่ที่ 20 และ 80 ซึ่งถ้า Stoch อยู่ในระดับตํ่ากว่า 20 แนะนำให้ซื้อ (Oversold) เแต่ถ้ามากกว่า 80 แนะนำให้ขาย (Overbought)

แต่ถ้าอยู่ในช่วง 20–80 ควรพิจารณาร่วมกับการลากเส้นเทคนิค และวิเคราะห์เช่นเดียวกับ RSI คือ วิเคราะห์แนวโน้มโดยอิงจาก Stoch เป็นหลัก

ทั้งนี้บริเวณจุดตัดกันของเส้น %K กับ %D เป็นการบอกจุดกลับของราคา

ตัวอย่างกราฟราคาหุ้น เทียบกับ Stoch — meawbininvestor

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

การพยากรณ์ราคาหุ้นด้วย Machine Learning

จากโจทย์ของอาทิตย์นี้ที่เราต้องทำการค้นหาหุ้นจาก SET100 ทั้งหมด ที่คิดว่าถ้าซื้อในวันที่ 17 กันยายน 2563 แล้วเทขายในวันที่ 24 กันยายน 2563 เราจะต้องได้กำไรเยอะกว่าหุ้นตัวอื่นๆ ถ้าเป็นปรกติ ในตอนที่เรายังไม่รู้จักกับ Machine Learning เราอาจจะต้องมานั่งไล่ดูหุ้นทั้งหมด ด้วยตาเปล่า ใช่ค่ะทุกคนด้วยตาเปล่า มีตาลายเลือกผิดเลือกถูกแน่ๆ 5555++

แต่ใช่ว่าเงื่อนไขจะมีแค่นั้น เราต้องทำการแจ้งชื่อที่จะทำการซื้อขายภายในวันที่
15 กันยายน 2563 อีกด้วย!!!!!

ดังนั้นเราจึงทำการนำ Machine Learning มาช่วย เพื่อให้คอมพิวเตอร์คำนวณแทนเรานั้นเอง โดยเราจะเป็นคนที่ใส่เงื่อนไขต่างๆ และสร้างโมเดล ให้กับ Machine Learning และส่ง SET100 ทั้งหมดเข้าไป แล้วนั่งรอผลลัพธ์ ด้วยการจิบกาแฟพร้อมฟังเพลงไปพลาง :)

ในการเรียกข้อมูล SET100 เราเลือกใช้ Library ของ starfishX

(เป็นไลบรารี่ที่ทำขึ้นโดยคนไทยมีฟังก์ชั่นให้ใช้เยอะพอสมควร สามารถเข้าไปดูกันได้ถ้าใครอยากลองใช้งานจิ้มที่นี้เลยจ้า >> starfishX)

แต่ก่อนที่จะไปถึงขั้นที่ให้ Machine Learning คำนวณ SET100 ให้เราทั้งหมดนั้นเราต้องมาทดสอบกันก่อนว่าเงื่อนไข และโมเดลที่เราจะใช้มีความแม่นยำมากแค่ไหนกันเชียว ดังนี้

ขั้นตอนที่ 1 Get data

สร้างฟังก์ชั่นสำหรับเรียกข้อมูลหุ้นที่สนใจ

Python Code: install starfishX และ Import เข้ามาเพื่อใช้งาน

ฟังก์ชั่น sx.loadHistData(str|list,Start Date,End Date) ใช้ในการเรียกข้อมูลหุ้นที่สนใจย้อนหลัง โดยสามารถใส่วันที่เริ่มต้น (Start Date) และสิ้นสุดได้ ถ้าไม่ใส่วันที่สิ้นสุด (End Date) จะดึงมาให้จนถึงวันที่ปัจจุบัน

ทำการเพิ่มเงื่อนไข OHLC=True, Volume=True เข้าไปด้วย โดย

  • OHLC=true คือ การเรียกข้อมูล Open, High, Low, Close

Open (ราคาหุ้นตอนเปิดตลาด)

High (ราคาหุ้นที่สูงที่สุดในวันนั้น)

Low (ราคาหุ้นที่ต่ำที่สุดในวันนั้น)

Close (ราคาหุ้นตอนปิดตลาด)

  • Volume=True คือ ข้อมูล Volume ของหุ้นตัวนั้นๆ

บางคนอาจจะสงสัยว่าทำไมเราต้องเอาคอลัมน์ Open, High, Low, Close มาด้วยล่ะ? มาตามอ่านกันต่อไป… เดี๋ยวจะต้องร้องอ๋อออออ (5555++ กั๊กจริงๆ)

ทำการทดสอบเรียกใช้ฟังก์ชั่นที่สร้างไว้

Python Code: ส่งค่า หุ้นที่อยากรู้ และวันที่เริ่มต้นที่ต้องการข้อมูลเข้าไปในฟังก์ชั่น

ลองเรียกตัวอย่างข้อมูลออกมาดูว่าหน้าตาเป็นอย่างไร

Python Code: df.head() ใช้ในการเรียกข้อมูลส่วนแรกข้อง Data frame มาดู

ข้อมูลที่เราทำการเรียกมาเป็นข้อมูลของปี 2016 จะมาดูทั้งหมดด้วยตาเปล่าก็ยังไงอยู่ ลองพล๊อตออกมาเป็นกราฟดีกว่า

กราฟแสดงข้อมูลราคาปิดตลาด

จากกราฟจะเห็นได้ว่าในช่วงปี 2017–2018 มีแนวโน้มขาขึ้นหลังจากนั้นก็เริ่มลงมาเรื่อยๆ จนต้นปี 2020 จะเห็นได้เลยว่าหุ้นตกชัดเจน เป็นไปได้ว่าน่าจะเป็นเพราะพิษโควิด( T..T)

หลังจากดูภาพรวมไปแล้ว มาลองพล๊อตดู Time series อีกอย่างแล้วกันเพื่อดูว่า Trend, Seasonal, Residual ของหุ้นตัวนี้มีหน้าตาเป็นอย่างไร

ทำไมเราถึงต้องดู Time series

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

  1. Observed : คือ กราฟตั้งต้น หรือกราฟจริงๆ ที่เราลองพล๊อตดูราคาปิด (Close) ก่อนหน้านี้
  2. Trend : คือ การเคลื่อนไหวของข้อมูล เป็นการเคลื่อนไหวที่ต่อเนื่องกันในระยะยาวอย่างชัดเจนทั้งขึ้นและลง โดยลักษณะแนวโน้มนั้น อาจจะมีแนวโน้มเป็นเส้นตรง หรือเส้นโค้งก็ได้
  3. Seasonal : คือ การเปลี่ยนแปลงของข้อมูลที่อาจจะเกิดขึ้นจากอิทธิพลของ ช่วงเวลา หรือฤดูกาลซึ่งจะเกิดขึ้นซ้ำๆ ในช่วงเวลาเดียวกัน อาจจะเป็นรายเดือน ไตรมาส หรือรายปี
  4. Residual : คือ ส่วนที่เหลือจากการสกัด Trend และ Seasonal ออกมาจาก Observed แล้ว หรือเรียกอีกอย่างว่าเป็นค่า error ก็ได้ ซึ่งอาจจะเป็นข่าวต่างๆ ที่เกิดขึ้นจนทำให้คนเฮกันเทขายหุ้น หรือรีบช้อนซื้อหุ้น ก็เป็นไปได้
กราฟ Time series

ให้ลองสังเกตที่ Seasonal คือต่อให้ Trend ทั้งกราฟจะมีการขึ้นลงยังไงหุ้นตัวนี้ก็ยังมี Cycle ของมันอยู่

ถ้าเราดูแค่หุ้นตัวเดียวจากกราฟนี้เราก็อาจจะสามารถวิเคราะห์ได้ระดับหนึ่งแบบยังไม่ลงลึกมาก แต่เอ๊ะ!!! เราดึงข้อมูลมาตั้งแต่ปี 2016 เลยนะจะไม่เอามาใช้ประโยชน์หน่อยหรอ!!!

Cleansing & transformation

ในขั้นตอนของการ Cleansing & Transformation นั้น เราจะทำการ Extract time series ออกมาเพื่อให้ง่ายต่อการนำไปทำนาย

Extract time series : คือ เราทำการแยกคอลัมน์ของ วัน เดือน ปี ออกมาอยู่คนละคอลัมน์ และเพิ่มคอลัมน์ ชื่อวัน อีกหนึ่งคอลัมน์ โดยเราเขียนไว้เป็นฟังก์ชั่นเพื่อให้สามารถเรียกใช้งานได้หลายๆ รอบ

Python Code: สร้างฟังก์ชั่นสำหรับสกัดฟีเจอร์วันที่

หน้าตาหลังจากเรียกใช้ฟังก์ชั่น Extract time series จะเห็นได้ว่า เรามีคอลัมน์เพิ่มขึ้นมาแล้ว 4 คอลัมน์ คือ Year, Month, Day และ EnglishDay

Python Code: เรียกใช้งานฟังก์ชั่น get_X_y(dataframe)

ตรวจสอบค่าของ X และ y ว่าได้ค่าที่ถูกต้องหรือไม่

Python Code: .info() สำหรับตรวจสอบ Type และจำนวนคอลัมน์

จากนั้นสร้างฟังก์ชั่นสำหรับแยกคอลัมน์ที่เป็นประเภทของ category ออกมาโดยใช้คำสั่ง get_dummies

Python Code: pd.get_dummies สำหรับแยกคอลัมน์ที่เป็น category ออกมา

พอเราทดสอบลองเรียกใช้ฟังก์ชั่น จะพบว่ามีการเพิ่มคอลัมน์มาอีกเยอะมากกกกกก จนหลายคนอาจจะร้องว่า Omg มาดูกันว่าได้คอลัมน์อะไรมาบ้าง

  1. มีการแยกเดือนออกมาตั้งแต่เดือน 1–12
  2. แยกวันที่ออกมาได้เป็นตั้งแต่วันที่ 1–31
  3. สุดท้ายแยกชื่อวันได้เป็น Mon, Tue, Wed, Thu, Fri ก็คือวันทำการที่ตลาดเปิดนั่นเอง Wow Wow Wow
รูปแบบข้อมูลที่ผ่านการสกัดฟีเจอร์เรียบร้อยแล้ว

มาถึงตรงนี้เริ่มเหนื่อยกันรึยัง 5555++ หลายคนอาจจะสงสัยว่าทำไมต้องแยกคอลัมน์อีกล่ะ แยกอะไรกันนักหนาเนี้ย!!!!

สาเหตุที่เราต้องทำการแยกคอลัมน์ออกมาเพื่อให้ได้ ฟีเจอร์ที่เป็นทางสถิติให้สังเกตว่าค่าในคอลัมน์จะเป็น 1 กับ 0 โดย 1 = true, 0 = false เจ้า Machine Learning จะได้อ่านออกนั้นเองจ้าาาา

Split train and test Data frame

หลังจากที่เราทำการ Cleansing และ Transform ข้อมูลเรียบร้อยแล้วจากนี้ไปเราจะมาทำการสร้างฟังก์ชั่นสำหรับ Train ข้อมูลให้ model เรียนรู้ parameter ที่เหมาะสม และ Test ข้อมูลกันเพื่อวัดว่า model ที่ได้จะแม่นยำแค่ไหน

Python Code: ฟังก์ชั่นสำหรับ Train และ Test Data Frame

เซตค่า train size และทำการ Train ข้อมูลด้วยฟังก์ชั่นที่สร้างไว้

Python Code: เรียกใช้ฟังก์ชั่นเทรนข้อมูล

model_fit

Python Code: เรียกใช้ LinearRegression

Error สร้างฟังก์ชั่น rmse เพื่อใช้ประเมินผลโมเดลด้วย root mean square error

Visualize

Python Code: ฟังก์ชั่นแสดง error

สร้างฟังก์ชั่น visualize สำหรับวาดกราฟแสดงผลการทำนายของโมเดล

Python Code: ฟังก์ชั่นแสดง กราฟจากผลที่ทำนายได้
กราฟที่ได้จากผลการทำนายรอบที่ 1

ทดสอบพล๊อตกราฟที่ผ่านการทำนายแล้ว พบว่าความแม่นยำน้อยมาก ต้องหาเงื่อนไขมาใส่เพิ่ม เราจึงได้ทำการเพิ่มข้อมูล Open, High, Low, Close ของวันก่อนหน้ามาช่วยในการทำนาย

Python Code: ฟังก์ชั่นเพิ่มคอลัมน์ Open, High, Low, Close ของวันก่อนหน้า

previous day low, previous day high, previous day close, previous day volume ก็คือ ราคาของวันก่อน เพื่อทำนายว่าวันถัดไปค่าจะเปลี่ยนไปเท่าไหร่

นำฟังก์ชั่นต่างๆ มารวมกันเพื่อเรียกใช้ได้สะดวกขึ้น

Python Code: ฟังก์ชั่น Main สำหรับเรียกใช้ฟังก์ชั่นอื่นๆ ในครั้งเดียว

ทดสอบการทำนายอีกครั้ง

กราฟที่ได้จากผลการทำนายรอบที่ 2

โอเคตอนนี้เราได้เอา Open, High, Low, Close มาใช้งานแล้วซึ่งช่วยให้การทำนายมีความแม่นยำขึ้นอย่างเห็นได้ชัดจากภาพกราฟด้านบน

แต่ทั้งนี้เนื่องจากโมเดลเป็น linear regression โมเดลจะไม่สามารถวิ่งไปกับค่าต่างๆ ที่ขึ้นๆ ลงๆ ของหุ้นได้ มันจะไปเป็นเส้นตรง ซึ่งจะทำให้ไม่แม่นเท่าที่คิดไว้

การทำให้โมเดลแม่นขึ้นในขั้นนี้ก็คือ บอกค่าของวันก่อนหน้าให้โมเดลรู้ แล้วให้โมเดลทำนายค่าของวันนี้เพียงวันเดียว ซึ่งจะลด error ลงได้ แต่ว่ายังไม่มีความแม่นยำเพียงพอ

ถ้าดูจากภาพรวมจะดูเหมือนว่าโมเดลสามารถทำนายราคาได้จริง แต่หากซูมเข้าไปดูในวันต่อวัน จะพบว่า ความแม่นยำยังต่ำอยู่มาก ไม่เหมาะกับการเอามาทำนายการลงทุน

ได้!! เรายังไม่ท้อเพราะว่าในทีมเรามีผู้ที่มีความรู้เรื่องการลงทุนระยะสั้น ซึ่งได้ให้คำแนะนำมาว่า การซื้อหุ้นนั้นเราจะต้องดูค่าต่อไปนี้ด้วยนะ

Trend, MACD, RSI, Stock Trend, Stoch

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

โปรแกรมคำนวณแนวโน้ม ได้ทำตามลอจิกต่อไปนี้
(คำนวณย้อนหลัง 5 วัน)

  • ถ้าหุ้นขึ้นติดต่อกันทุกวัน จะได้ 4 คะแนน
  • ถ้ามีขึ้นมากว่าลง จะได้ 3 คะแนน
  • ถ้ามีขึ้นเท่ากับลง ได้ 2 คะแนน
  • ถ้ามีลงมากกว่าขึ้นแต่มีขึ้นอยู่เป็นบางวัน ได้ 1 คะแนน
  • ถ้าลงติดต่อกันทุกวัน ได้ 0 คะแนน

เขียนเป็นฟังก์ชั่นเก็บไว้ใช้อีกเช่นเคย

Python Code: กำหนดคะแนนให้กับหุ้นจากเงื่อนไขต่างๆ

นอกจากนี้ ทางทีมงานยังได้ลองใช้ความแตกต่างของราคา จากวันที่แล้ว และจาก 6 วันที่แล้ว เพิ่มเข้าไป เป็นฟีเจอร์ แต่ผลออกมาเหมือนกับว่า ราคาที่ได้เท่ากับราคาปิดในวันที่ใช้ทำนาย ซึ่งน่าจะเป็นเพราะข้อมูลทั้งสองสามารถนำมาคำนวณกลับเป็น Open truth ได้ เราจึงได้ลบสองคอลัมน์นี้ออกไป

Python Code: ทดสอบเพิ่มฟีเจอร์ ราคา 6 วันที่แล้ว

ส่วนการดู trend จะใช้ค่าความชันของกราฟเส้นตรง ที่พลอทจากราคาย้อนหลัง 5 วัน (แนวโน้ม 1 สัปดาห์ซื้อขาย) 15 วัน (แนวโน้มระยะกลาง) และ 30 วัน (แนวโน้มระยะยาว 6 สัปดาห์ซื้อขาย) มาเป็นฟีเจอร์ของวันนั้นๆ โดยเขียนเป็นฟังชั่น get_slope

Python Code: ฟังก์ชั่นหาความชัน

ทั้งสองฟังชั่นจะใช้การเรียกผ่าน rolling windows ซึ่งจะทำการดึงตารางย้อนหลังของคอลัมน์นั้นๆ ออกมาเป็นเวลาตามที่เรากำหนด เช่น 5 วัน และส่งเป็นตารางให้กับฟังก์ชั่นที่เราต้องการ เพื่อนำมาคำนวณ คะแนนแนวโน้ม หรือคำนวณความชันของกราฟ

Python Code: ทดสอบเรียกฟังก์ชั่นหาความชั่นด้วย rolling windows

ดังนั้นใน วันหนึ่งๆ จะมีข้อมูลจากวันที่แล้ว, ข้อมูลแนวโน้มการขึ้นลงที่คำนวณจาก
5 วันข้อมูลย้อนหลัง 5, 15, และ 30 วันซื้อขาย มาเป็นองค์ประกอบ

ทีมงานคิดว่า ในขั้นต่อไป เราอยากจะเพิ่ม องค์ประกอบอื่นๆ ซึ่งนิยมนำมาวิเคราะห์ราคาหุ้นในการลงทุนระยะสั้น เช่น การวิเคราะห์กราฟ MACD, RSI, Stoch (เดี๋ยวจะแสดงให้ดูตอนที่เราเลือกได้หุ้นได้แล้ว) เข้ามาเป็นฟีเจอร์เพื่อให้โมเดลใช้ในการประกอบคำทำนาย

ผลการทำนายปรากฏว่า ค่าที่ทำนายได้เปลี่ยนไปเล็กน้อย ทางทีมจึงจะทดลองใช้สองฟังก์ชั่นข้างต้นกับ SET100 ทั้งหมด

ให้โมเดลทำนายกัน!

ก่อนอื่นทำการโหลดข้อมูล SET100 ทั้งหมดมาเก็บไว้ก่อนจะได้ง่ายเวลาเอามาใช้งาน

Python Code: loop เพื่อบันทึกข้อมูล SET100 เป็นไฟล์ .csv

จากนั้นเขียนเป็น for loop ที่เลือกเอาข้อมูลหุ้นจาก ทุกๆ ไฟล์ออกมาวิเคราะห์ โดยในแต่ละไฟล์จะมีข้อมูลหุ้นที่ดาวน์โหลดมาจาก SET100 index ตั้งแต่วันที่ 1/1/2016 จนถึงวันที่ 15/9/2020 โดยให้มีการทำนายสองราคาคือ ทำนายราคาหุ้นในวันถัดไปซึ่งเป็นวันที่จะทำการซื้อ ละทำนายราคาหุ้นใน 6 วันถัดไปซึงจะเป็นราคาขาย เสร็จแล้วเรานำค่าสองค่ามาหารกัน จะได้เป็นสัดส่วนราคาที่ทำนายว่าจะเพิ่มขึ้น และเซฟข้อมูลลงใน DataFrame ของ pandas โดยมีคอลัมน์ดังต่อไปนี้

  • symbole คือ รายชื่อหุ้น
  • y1d hat คือ ราคาเปิดในอีก 1 วัน ที่ทำนายได้
  • y6d hat คือ ราคาเปิดในอีก 6 วัน ที่ทำนายได้
  • gain คือ สัดส่วนการเพิ่มของราคา โดยถ้าหากยิ่งสูงกว่า 1 คือยิ่งเพิ่มมากขึ้น
  • error 1d คือค่า root mean square error จากการทำนายราคาในอีก 1 วัน
  • error 6d คือค่า root mean square error จากการทำนายราคาในอีก 6 วัน

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

ทั้งนี้ เราได้เก็บข้อมูลอื่นๆ เช่น ตัวโมเดลที่ใช้ และตัวฟีเจอร์ที่ใช้รันโมเดลใน dictionaries ที่มีชื่อหุ้นเป็น key เพื่อให้สามารถเรียกมาตรวจสอบภายหลังได้

เราได้สร้างอีกคอลัมน์หนึ่ง คือ error 1+6 โดยใช้ค่า errror จากการทำนายทั้งสองวันมาบวกกัน เพื่อประกอบการตัดสินใจ

จากนั้น เราจัดลำดับข้อมูลใหม่ โดยเรียงตาม gain หรือราคาหุ้นที่โปรแกรมทำนายว่าจะเพิ่มขึ้นในอีก 6 วัน โดยใช้ feature engineer เดิมคือ previous day low, previous day high, previous day close, previous day volume ได้ผลดังนี้

Python Code: ผลลัพธ์ 10 อันดับ จากการทำนาย SET100 ทั้งหมด

STEC ฉันเลือกนาย

หลังจากที่โมเดลพยากรณ์หุ้นทั้งหมดออกมาแล้ว เราได้คัดเลือกหุ้นที่มีกำไร (gain หรือ ภาษาหุ้นเรียกว่า capital gain นั่นเอง) สูงสุด 10 ตัวแรกออกมา แล้ววิเคราะห์ด้วยกราฟเทคนิคอีกที เพื่อตรวจสอบอีกครั้งเพิ่มความมั่นใจในการเลือกหุ้น

ทวนคอลัมน์ที่สนใจกันอีกที

gain = กำไรที่พยากรณ์ได้ในอีก 6 วัน (คำนวนจากราคาปิด วันที่ 15 ก.ย. ถึงราคาปิด วันที่ 23 ก.ย. หรือ ราคาเปิด ณ ATO วันที่ 24 ก.ย.)

y6d hat = ราคาที่พยากรณ์ได้ในอีก 6 วัน (ราคาปิด วันที่ 23 ก.ย. หรือ ราคาเปิด ณ ATO วันที่ 24 ก.ย.)

ทั้งนี้ ทีมจะต้องสรุปว่าจะเลือกหุ้นตัวไหนในวันที่ 15 กันยายน และจะเริ่มมีการลงทุนจริงในวันที่ 17–24 กันยายน โดยซื้อ/ขายที่ราคา ATO ดังนั้น การดูกราฟเทคนิคจะพิจารณา ณ ราคาปิดวันที่ 15 กันยายน แล้วดูว่ามีโอกาสขึ้นไปสูงสุดที่เท่าไหร่
ด้วยการหาแนวต้าน รวมทั้งรอบขึ้นลง 1 รอบ หรือ หนึ่ง season ใช้เวลาประมาณกี่วัน เช่น ถ้าภายในวันที่ 17–24 กันยายน เป็นช่วงขาขึ้นก็มีแนวโน้มได้กำไรมากหน่อย
แต่ถ้ามีขาลงด้วยก็ต้องดูว่าผลต่างระหว่างราคาที่ขึ้นกับราคาที่ลงนั้น ยังมีกำไรเหลืออยู่รึไม่?

ผลลัพธ์ที่ได้ดังนี้

ตารางสรุปผลการวิเคราะห์กำไร ของหุ้นที่มีกำไรสูงสุด 10 ตัวแรก ด้วยกราฟเทคนิค (หมายเหตุ : หุ้น JAS ไม่มีแนวรับ แต่เมื่อลากเส้น เพื่อดูแนวโน้นของ lower low พบว่ามีโอกาสลงไปที่ราคา 2.25 บาท ณ ราคาปิด 23 ก.ย. )
กราฟแสดง %กำไร (%ขาดทุน) ของหุ้นแต่ละตัว จากการวิเคราะห์กราฟเทคนิค

จะเห็นได้ว่าหุ้น STEC มีกำไรสูงที่สุด 11.33 % หรือ สามารถทำกำไรได้ 1.36 บาทต่อหุ้น จากราคาปิดวันที่ 15 ก.ย. ซึ่งมีแนวต้านอยู่ที่ 13.36 บาท ดังนั้นจึงตัดสินใจเลือกหุ้น STEC ในการเก็งกำไรครั้งนี้

เพื่อเพิ่มความเข้าใจให้กับผู้อ่าน จึงขอวิเคราะห์กราฟเทคนิคของหุ้น STEC เพื่อเป็นตัวอย่าง ดังนี้

กราฟราคาหุ้น STEC และ MACD, RSI, STOC

จากกราฟราคาหุ้น STEC ถ้าดูแบบง่ายๆเพียงแค่กราฟราคา เราคงคิดว่าราคาหุ้นมีแนวโน้มลง แต่เมื่อวิเคราะห์ประกอบกับตัวชี้วัดต่างๆแล้วพบว่า

MACD กราฟยังไม่ชัดเจนจึงไม่สามารถดูได้ แต่ไม่เป็นไร เราสามารถดูตัวชี้วัดอื่นแทนได้เช่นกัน

RSI กราฟลงต่ำกว่าค่ามาตรฐาน 30 อยู่ที่ 26 ดังนั้นมีโอกาสที่ราคาจะเปลี่ยนเป็นขาขึ้นแทนได้ในระยะสั้น

STOCH กราฟต่ำกว่าค่ามาตรฐาน 20 อีกเช่นกัน อยู่ที่ 10 ดังนั้นมีโอกาสที่ราคาจะเปลี่ยนเป็นขาขึ้นแทนได้ ซึ่งสอดคล้องกับ RSI

ดังนั้นหุ้น STEC จึงมีโอกาสเปลี่ยนเป็นกราฟขาขึ้นได้ในระยะสั้น และมีแนวต้านอยู่ที่ 13.36 บาท นั้นเองงง!!

หวังว่าบทความนี้จะช่วยให้นักลงทุนสามารถวิเคราะห์ราคาหุ้นได้อย่างมีประสิทธิภาพและ สำหรับผู้ที่สนใจศึกษาการเขียนโค้ด (codding) เพิ่มเติม คลิกที่นี่ ***colab***

ขอบคุณทีมงานทุกท่านที่ร่วมมือกันสร้างโปรเจคนี้ออกมาให้ทุกคนได้อ่านกัน ช่วย👏🏻ปรบมือ กดไลค์ กดแชร์ เพื่อเป็นกำลังใจให้พวกเราสร้างบทความดีๆแบบนี้ออกมาอีกนะ:)

นักวิเคราะห์ทางการเงิน : แก้ม, แบงค์

นักเขียนโปรแกรม : ปอ, ไบร์ท

ผู้สนับสนุน : ฟิลด์, ปู, ซุย, เหลียง, วิม, เป๊ก, เก่ง, เอมี่, อ๋อย, ไอซ์, แชมป์, อ๋อง, หนุ่ย, แก๊ส, แมน, มิด, ย้อย

ปล. การลงทุนมีความเสี่ยงจริงๆนะจ๊ะ :)

--

--