DSEs_G6 # Week 4 |(วิเคราะการฟหุ้นแบบคลูๆ📈📉 ด้วยเทคนิค Trend forecasting )

Tew Aprirat
botnoi-classroom
Published in
15 min readSep 15, 2020

Objective: บทความนี้เป็นส่วนหนึ่งของ Data Science Essential Botnoi Classroom หัวข้อ Trend forecasting

Member: คุณ Buk , คุณ Somm , คุณ Champ , คุณ Kung , คุณ Tukta , คุณ View , คุณ Fuang , คุณ Patana , คุณ KaRun , คุณ G , คุณ Win JRK , คุณ supano , คุณ ztums , คุณ zen , คุณ Tung ,คุณ siriwan , คุณ paii , คุณ incubusv , คุณ isofena , คุณ the lost rhythm , คุณ joe , คุณ Eyuchi Takuya ,คุณ Tew

Link Colab: ข้อมูลในบทความเป็นเพียงส่วนหนึ่งของการวิเคราะห์ สามารถดู insight อย่างละเอียดได้จากลิงก์ colab ครับ

https://colab.research.google.com/drive/1QE4PG6gQONTqkFvjKsWI9NFkNInPiZ4g?usp=sharing

สวัสดีครับคุณผู้อ่านทุกท่าน บทความนี้เป็นการสรุปเนื้อหาในเรื่องของ Trend forecasting ที่สอนโดย Botnoi ซึ่งในวันนี้เราจะมาทำชาเลนจ์ที่ทาง Botnoi ได้จัดขึ้นมา โจทย์ในสัปดาห์นี้คือ ให้ทุกกลุ่มเลือกชื่อหุ้นมา 1 ตัว จากหุ้นในกลุ่ม SET 100 ที่คาดว่าจะสามารถทำกำไรได้มากที่สุด โดยใช้เทคนิค Trend forecasting ทางBotnoi จะทำการซื้อหุ้นที่ทุกกลุ่มเลือก ในวันที่ 17 ก.ย. 63 และจะขายออกไปในวันที่ 24 ก.ย. 63 รวมระยะเวลา 1 สัปดาห์ และมีการนำความรู้สัปดาห์ที่แล้วคือ Machine learning มาใช้ร่วมด้วย Model ที่กลุ่มพวกเราใช้จะเป็นแบบไหน ผลลัพธ์จะเป็นอย่างไร เชิญรับชมกันได้เลยครับ .

อยากเป็นเจ้าของธุรกิจแต่ไม่มีเงินทุนที่มากพอจะทำอย่างไรดี ?

หลายๆคนคงมีความฝันอยากจะเป็นเจ้าของกิจการกันใช่ไหมละ !!! เพราะสมัยนี้ตามโซลเชียลจะมีรายการที่ให้ความรู้ด้านธุรกิจ มีการนำตัวอย่างคนที่อายุน้อย แต่เป็นเจ้าของธุรกิจมาให้คำแนะนำต่างๆ ทำให้พวกเรารู้สึกว่าการเป็นเจ้าของธุรกิจนั้นไม่ยากอย่างที่คิด !!! แต่เมื่อลองศึกษาดูแล้วปรากฎว่าจำเป็นต้องใช้เงินทุนมหาศาล และต้องมีความรู้ความชำนาญในระดับหนึ่ง ธุรกิจถึงจะไปรอด แต่อย่าพึ่งหมดหวังซะทีเดียว พวกเรามีแนวทางมานำเสนอที่ไม่ว่าคุณจะมีเงินไม่มาก มีเวลาไม่มาก แต่คุณก็สามารถเป็นเจ้าของธุรกิจได้ สิ่งนั้นก็คือ “ หุ้น” นั่นเอง

หุ้นคืออะไร ?

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

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

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

จากข้อความดังกล่าวจะเห็นประโยคที่ว่า ผู้ถือหุ้นจะมีฐานะเป็น “เจ้าของ” นั่นหมายความว่าเมื่อเราเป็นผู้ถือหุ้นในบริษัทใดบริษัทหนึ่งที่อยู่ในตลาดหลักทรัพย์ เราก็มีฐานะเป็น เจ้าของ แต่ไม่เพียงแคเราเพียงคนเดียว คนที่ถือหุ้นคนอื่นๆก็ด้วย ซึ่งถ้าเราซื้อหุ้นบริษัทนั้นไว้มากๆ คิดเป็นเปอร์เซนต์ เราก็จะได้รายได้จากบริษัทนั้นๆมากตาม แต่กลับกัน ถ้าษริษัทขาดทุนเราก็จะขาดทุนมากตามจำนวนเปอร์เซนต์ เช่นกัน นั่นแสดงให้เห็นว่า การเลือกลงทุนแต่ละบริษัทนั้นมีผลต่อรายได้และรายจ่ายที่เราได้ทำการลงทุนไปนั่นเอง

Credit : https://www.krungsri.com/bank/th/plearn-plearn/which-fund-suit-your-lifestyle.html

เราควรเลือกลงทุนกับบริษัทไหนถึงจะดี ?

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

Credit : https://www.set.or.th/set/education/html.do?name=stock&showTitle=F

ก่อนอื่นเลยเราควรรู้ว่าเราเป็นนักลงทุนประเภทไหนโดยดูได้จาก

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

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

นักลงทุนระยะยาว เป็นนักลงทุนที่ต้องการผลตอบแทนจากเงินปันผลและราคาหุ้นที่ค่อย ๆ เติบโตอย่างมั่นคงเป็นหลัก คนที่ต้องการเป็นนักลงทุนประเภทนี้ ต้องลงทุนในหุ้นแบบระยะยาว บางคนใช้การลงทุนประเภทนี้ไว้เพื่อต้องการรับเงินปันผลใช้ในยามเกษียณ

Credit : https://www.krungsri.com/bank/th/plearn-plearn/which-fund-suit-your-lifestyle.html

เขาดูอะไรในกราฟหุ้น ? 😲

Credit : https://www.set.or.th/set/education/html.do?name=decode_strategy_invest_32&innerMenuId=19

ก่อนอื่นเลยเราต้องรู้ก่อนว่ากราฟหุ้นมาได้อย่างไร การฟหุ้นคือการนำราคาหุ้นในแต่ละวันมาเรียงต่อกัน ส่วนกราฟที่พบเจอกันบ่อยๆ คือ กราฟแท่งเทียน วิธีการาดูกราฟแท่งเทียนก็ง่ายมากๆ โดยแสดงดังนี้

Credit : https://www.set.or.th/set/education/html.do?name=decode_strategy_invest_32&innerMenuId=19

ส่วนเส้นที่อยู่ตรงหัวและท้ายแท่ง เราเรียกว่า “ไส้เทียน” ซึ่งจะบอกถึงราคาสูงสุดและราคาต่ำสุดของวันนั้นๆ

Credit : https://www.set.or.th/set/education/html.do?name=decode_strategy_invest_32&innerMenuId=19

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

  1. แนวโน้มขึ้น (Uptrend)
Credit : https://www.set.or.th/set/education/html.do?name=decode_strategy_invest_32&innerMenuId=19

2. แนวโน้มลง(Downtrend)

Credit : https://www.set.or.th/set/education/html.do?name=decode_strategy_invest_32&innerMenuId=19

3. แนวโน้มเคลื่อนที่ไปข้างๆ (Sideways)

Credit : https://www.set.or.th/set/education/html.do?name=decode_strategy_invest_32&innerMenuId=19

ที่กล่าวมาข้างต้นนี้เป็นเพียงแค่เครื่องมือชนิดหนึ่งของนักลงทุนหุ้น จะใช้บ่อยมากๆถ้าเป็น นักลงทุนแนวเทคนิค

นักลงทุนแนวเทคนิค ซึ่ง เป็นนักลงทุนที่ สนใจพฤติกรรมราคาของหุ้น โดยเฉพาะกราฟราคาหุ้น (Chart) โดยจะอาศัยข้อมูลราคาหุ้นในอดีต ปริมาณการซื้อขาย พร้อมทั้งใช้เครื่องมือวิเคราะห์ทาง เทคนิคและอินดิเคเตอร์ (Indicator) ต่างๆ ในการทำนายทิศทางราคาหุ้น โดยจะมีความเชื่ออยู่หลายประการ ดังนี้

เชื่อว่าหุ้นที่วิเคราะห์ได้ควรจะต้องมีเทรนด์ (Trend) และมีปริมาณการซื้อขาย (Volume) สนับสนุน

เชื่อว่าราคาที่ปรากฏได้สะท้อนปัจจัยทุกอย่างทั้งหมดแล้ว (Price Discount Everything)

เชื่อว่าประวัติศาสตร์จะย้อนรอยตัวเองเสมอ (History Tends to Repeat Itself)เชื่อว่าราคาหุ้นขึ้นลงเป็นรอบ

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

Trend forecasting คือ การคาดคะเนในสิ่งที่กำลังจะเกิดขึ้นในอนาคต โดยใช้ Trend(แนวโน้ม)เป็นตัวชี้วัด ซึ่งอาจจะคล้ายๆกับการ Prediction โดยข้อมูลที่นำมาจะอยู่ในรูป Time Series (อนุกรมเวลา) แต่ไม่ว่าเครื่องมือจะดีแค่ไหน การ forecasting ก็ยังเป็นกระบวนการที่มีความไม่แน่นอน ไม่สามารถยืนยันได้ว่าเหตุการณ์จะเกิดขึ้น ตามการคาคะเนทั้งหมด ซะทีเดียว

Predict กับ Forecast แตกต่างกันอย่างไร 🤔 ?

หลายๆคนอาจสงสัยกับสองคำนี้อยู่คือคำว่า Predict และ Forecast ถ้าเรานำสองคำนี้มาแปลเป็นภาษาไทยอาจจะเกิดความสับสน ดังนั้นจึงขอใช้เป็นคำทับศัพท์แทนนะครับ

Prediction is concerned with estimating the outcomes for unseen data. For this purpose, you fit a model to a training data set, which results in an estimator f^(x) that can make predictions for new samples x.

Forecasting is a sub-discipline of prediction in which we are making predictions about the future, on the basis of time-series data. Thus, the only difference between prediction and forecasting is that we consider the temporal dimension. An estimator for forecasting has the form f^(x1,…,xt) where x1,…,xt indicate historic measurements at time points 1,…,t, while the estimate relates to time point t+1 or some other time in the future. Since the model depends on previous observations, xi, this is called an autoregressive model.

Credit : https://www.datascienceblog.net/post/machine-learning/forecasting_vs_prediction/

อาจกล่าวได้ว่า Prediction เป็นการประมาณผลลัพธ์ของข้อมูล ซึ่งต้องใส่ชุดข้อมูลใน Model ก่อน ถึงจะส่งผลทำให้ Model สามารถ Predict ผลลัพธ์ ออกมาได้ เช่น f(x)=y ต้องใส่ค่า x ก่อน จึงจะรู้ค่า y ส่วน Forecasting คือ sub-discipline ของ prediction อีกทีแต่ข้อมูลจะเป็นแบบ Time Series (อนุกรมเวลา) นำมาใส่ Model เพื่อให้ Model สามารถ Predict ผลลัพธ์ ออกมาได้ เช่น f(x¹,x²,…,x^t) เรามีข้อมูลตั่งแต่เวลาที่ x¹ ถึง x^t แต่เราต้องการทราบ ผลลัพธ์ที่ เวลา t+1 เป็นต้น

ข้อมูลแบบ Time Series หน้าตาเป็นแบบไหนกันแน่นะ ?

ข้อมูลแบบ Time Series (อนุกรมเวลา) คือ ข้อมูลที่มีการเปลี่ยนแปลง เมื่อเวลาเปลี่ยนไป หรือ ข้อมูลที่เปลี่ยนแปลงตามค่าเวลา เราสามารถพบเห็นข้อมูลประเภท Time Series บ่อยๆ เช่น ราคาทองคำ , ราคาค่าเงินบาทเทียบกับค่าเงินดอลล่า

คุณผู้อ่านบางคนถ้าไม่ใช่สาย Financial อาจจะยังไม่เข้าใจกับกราฟ หรือการ rend forecasting มากนัก แต่ในบทความนี้พวกเราเน้นให้ทุกท่านที่อ่านเข้าใจถึง Concept ในการใช้งาน ดังนั้น ไม่ว่าท่านจะมีพื้นฐานหรือไม่มีก็สามารถรับชมไปพร้อมๆกันได้เลยครับ

คุณสบบัติของข้อมูลประเภท Time Series

  1. Trend (แนวโน้ม) : การเคลื่อนไหวของข้อมูลที่ต่อเนื่องกันในระยะยาวอย่างชัดเจน ไม่ว่าจะขึ้นหรือลง และลักษณะแนวโน้ม นั้นอาจจะมีแนวโน้มเป็นเส้นตรงหรือเส้นโค้งก็ได้
  2. ฤดูกาล(Seasonal) : การเปลี่ยนแปลงของข้อมูลที่เกิดขึ้นเนื่องจากอิทธิพลของ ฤดูกาล หรือช่วงเวลา ซึ่งจะเกิดขึ้นซ้ำๆ กัน ในช่วงเวลาเดียวกัน อาจจะเป็น รายเดือน รายไตรมาส หรือรายปีก็ได้
  3. วัฏจักร(Cyclical) : การเคลื่อนไหวของข้อมูลที่มีลักษณะซ้ำ กัน คล้ายกับ Seasonal แต่มีระยะเวลารอบนานกว่า
  4. การสุ่ม(Random) : การเคลื่อนไหวของข้อมูลที่ไม่มีรูปแบบแน่นอน หรือเป็นเหตุการณ์ที่ผิดไปจากปกติ โดยไม่ได้มีการคาดการณ์ไว้ล่วงหน้า

โดยที่ Trend และ Seasonal เป็นองค์ประกอบหลักของข้อมูลประเภท Time Series

ตัวอย่าง Data ที่แตกออกมาเป็น Trend seasonal และ remainder ที่มา: (https://stats.stackexchange.com)

วิธีการคำนวนในรูปแบบของ Time-Series Forecasting

ปัจจุบันมีเทคนิคการคำนวณผลลัพธ์โดยใช้ Time-Series Forecasting อยู่หลากเทคนิคและมีการพัฒนาเทคนิคการคำนวณอย่างต่อเนื่อง แต่จะยกตัวอย่าง 7 เทคนิคดั้งเดิมและเทคนิคที่เข้าใจได้ไม่ยากนัก (อ้างอิงจากในคอร์สที่เรียน) ดังนี้

  1. Naive Approach : เป็นวิธีการที่ใช้แนวคิดที่ว่า “ความต้องการของ ผลิตภัณฑ์ในอนาคตจะเท่ากับความต้องการ ปัจจุบัน” ยกตัวอย่างให้เข้าใจง่ายๆ คือ ราคาหุ้นของวันนี้ มีค่าเท่ากับเมื่อวาน
  2. Simple Average : เป็นการใช้สมมุติฐานว่า การเปลี่ยนแปลงของราคาในวันถัดไป มีการเปลี่ยนแปลงขึ้นลงไม่มาก ทำให้มีค่าเฉลี่ยคงที่ นั้นหมายถึงว่าราคาหุ้นของวันถัดไป จะมีค่าเท่ากับค่าเฉลี่ยของวันก่อนหน้า
  3. Moving average :นำเทคนิค simple average มาปรับปรุง โดยกำหนดช่วงที่สนใจ (Slicing window) และจะให้ความสำคัญกับราคาที่เกิดขึ้นก่อนหน้าในช่วงเวลาที่เราให้ความสนใจ

4. Weighted moving average :ปรับปรุงจาก Moving average ธรรมดาโดยถ่วงน้ำหนัก โดยวันที่ใกล้วันที่ทำนายจะมีค่าถ่วงน้ำหนักที่มากกว่า เพื่อให้การ Forecasting มีความถูกต้องมากขึ้น

5. Single Exponential smoothing : ป็นการนำเทคนิคของ weighted moving average มาใช้ ซึ่งให้ค่าน้ำหนักของข้อมูลที่ผ่านมาแล้วต่างกัน ข้อมูลที่ผ่านมาแล้วนั้นจะให้ค่าน้ำหนักน้อยแล้วเพิ่มขึ้นเรื่อยๆ จนกระทั่งข้อมูลปัจจุบันจะให้ค่ามากที่สุด เหมือน กราฟ Exponential

6. Holt’s linear trend method : เป็นวิธีการทำนายราคาในอนาคต โดยมีสมมุติฐานว่า ราคาของสิ่งที่เราให้ความสนใจ มีแนวโน้ม (trend) ซึ่งเทคนิคที่กล่าวมาก่อนหน้านี้ ไม่สามารถนำไปใช้กับการทำนายที่มี trend ได้แม่นยำ จึงเกิดเป็นทฤษฎี Holt’s ขึ้นมา วิธีการ คือ เอา exponential smoothing ไป apply กับค่าเฉลี่ยของราคาในอดีต และ trend ของราคา

7. Holt’s Winter seasonal method : Holt’s Winter คิดค้นโดย Winter ซึ่งเป็นลูกศิษย์ของ Holt โดย Winter คิดว่าราคาของสินค้าบางประเภทมีการเปลี่ยนแปลงตามฤดูกาล (seasonal) และมีรูปแบบที่เกิดขึ้นซ้ำ ๆ เช่น ราคาแก็สหุงต้มจะสูงขึ้นในฤดูหนาว และลดลงในฤดูร้อน ค่า seasonal นี้จึงถูกนำมาใส่ในสมการของ Holt’s Winter

8. Autoregressive Integrated Moving average(ARIMA) : เป็นวิธีทำนายราคา โดยมีสมมุติฐานว่า ราคา ในแต่ละวันมีความสัมพันธ์กัน (Correlation)

จากวิธีที่กล่าวมาข้างต้นนั้นเป็นเทคนิคดั้งเดิม ซึ่งในปัจจุบันเราสามารถนำความรู้ด้าน Machine Learning ไปประยุกต์กับเทคนิค Trend Forecasting รวมกันกับ ได้ เพื่อให้สะดวกในการสร้าง Model และเป็นแนวทางสำหรับมือใหม่ที่ไม่เคยทำงานสายนี้มาก่อน ทางทีมงาน Botnoi จึง Guide กระบวนการต่างๆให้ โดยมีหัวข้อดังนี้ (ทางกลุ่มเราจะอ้างอิงจาก กระบวนการที่ทาง Botnoi สอนในคอร์สนะครับ !)

กระบวนการในการทำ Trend forecasting ในเบื้องต้น 💯

จะเห็นได้ว่ากระบวนการที่ทำมากันเกือบทุกสัปดาห์ที่เรียนในคอร์ส ฺBotnoi จะมีรูปแบบที่คล้ายคลึงกันอยู่ แต่จะมีบางหัวข้อที่เพิ่มขึ้นมาตามระดับความยาก-ง่ายในการนำข้อมูลต่างๆมาวิเคราะห์ บางคนอาจจะยังมองไม่เห็นภาพมากนัก เพื่อเป็นการไม่เสียเวลา เชิญทุกคนรับชมสิ่งที่กลุ่มพวกเราจะนำเสนอกันได้เลยครับ.

Introduction to Time Series จากพี่ๆทีมงาน Botnoi

ก่อนที่เราจะเข้าสู่ขั้นตอนในการตะลุยโจทย์ เพื่อให้ทุกคนก้าวไปพร้อมๆ กัน ก่อนอื่นเรามาทำความเข้า Time series จากเนื้อหาที่พี่ๆ ทีมงาน Botnoi ได้สอนกันก่อนครับ เริ่มต้นเราจะแยกองค์ประกอบของข้อมูลออกเป็น 2 องค์ประกอบที่สำคัญคือ1. Trend (แนวโน้ม) และ 2. (Seasonal)ฤดูกาล และแสดงผลออกมาเป็นกราฟให้ดูง่ายๆ แสดงเป็นขั้นตอนดังนี้

ขั้นตอนที่ 1 : Download data set ที่สนใจ ในตัวอย่างนี้จะเป็นการนำ data ของผู้โดยสารสายการบิน ที่เป็นไฟล์ .CSV และ import library ที่จำเป็น เช่น pandas , matplotlib เป็นต้น ซึ่งอาจเรียก data set ขึ้นมาดูข้อมูลภายในได้

โค้ดการดึงข้อมูลจากไฟล์ .CSV และการ import library

หลายคนอาจยังไม่รู้ว่าไฟล์ .CSV คืออะไร ? .CSV ย่อมาจาก Comma Separated Value เป็นไฟล์ข้อความประเภทหนึ่งที่ใช้สำหรับเก็บข้อมูลในรูปแบบตาราง ใช้เครื่องหมายจุลภาค หรือคอมม่า (,) ในการแบ่งแต่ละคอลัมน์ โดยปกติเราสามารถบันทึกไฟล์จาก Microsoft Excel ออกมาเป็น .CSV ไฟล์ได้โดยตรง หรือ อาจได้ไฟล์ .CSV จากการ export ไฟล์จากระบบฐานข้อมูลอื่นๆ

Credit : https://www.it24hrs.com/2018/what-is-csv-file-import-contact-csv/

การดึง data set มาแสดง

จากข้อมูลที่แสดงพบว่ามีข้อมูลอยู่ 2 Columns คือ Month มี data type เป็น object และ Passengers มี data type เป็น int 64

ขั้นตอนที่ 2: จะสังเกตุเห็นได้ว่า ตัวแปร Mouth มี data type เป็น object ซึ่งสามารถแตกข้อมูลเพื่อดูข้อมูลอื่นๆภายในตัวแปร Mouth ได้ ดังนั้นทีมงานจึงแปลงข้อมูลประเภท object ไปเป็นข้อมูลประเภท datetime64

Type object : เป็นลักษณะการเก็บข้อมูลหลายๆค่าไว้ในตัวแปรเดียวซึ่งจะคล้ายๆกับ Type Array แต่การเรียกขอ้มูลจะไม่เหมือนกัน

Type date time 64 : เป็นข้อมูลประเภทวัน/เดือน/ปี

เมื่อเราแปลงค่าแล้วจะได้ ปี / เดือน / วัน ของข้อมูลแต่ละตัว

หลังจากแปลงแล้วลองเรียก data set มาดูใหม่จะเห็นว่า Type ของข้อมูลได้เปลี่ยนเป็น datetime64 เรียบร้อยแล้ว

ขั้นตอนที่ 3: หลังจากนั้นให้ทำการเปลี่ยนข้อมูลเป็น index เพื่อสะดวกในการพล็อตกราฟมากขึ้น โดยเมื่อแปลงเป็น ตัวแปร Month เป็น index เรียบร้อยแล้วจะเหลือแค่ตัวแปร Passenger ที่จะนำมาพล็อตกราฟ

ตัวแปร Month หลักจากถูกเปลี่ยนเป็น index จะเหลือแค่ตัวแปร Passengers
กราฟข้อมูลผู้โดยสารสายการบิน

ขั้นตอนที่ 4: เมื่อเราดูกราฟแล้วจะ้ห็นได้ว่าข้อมูลที่เรานำมามีการเปลี่ยนแปลงตามระยะเวลา หรือเป็นข้อมูลประเภท Time Series ดังนั้นเราจึงสามารถแตก Task ของกราฟออกได้ตามคุณสมบัติ ของข้อมูลประเภท Time Series โดยโค้ดที่ใช้แสดงดังนี้

จะเห็นได้ ว่า 2 องค์ประกอบที่สำคัญคือ Trend และ Seasonal ที่จะมีอยู่ในทุกๆ data ซึ่งเราสามารถนำองค์ประกอบเหล่านี้มาวิเคราะห์ได้ ส่วน Residual นั้นจะเป็นข้อมูลที่ไม่มี รูปแบบที่แน่นอน อาจจะเกิดจากปัจจัยบางอย่างที่ไม่ได้เกิดขึ้นเป็นปกติ ซึ่งข้อมูลในส่วนนี้ยากต่อการนำว่าวิเคราะห์

จบกันไปแล้วนะครับสำหรับพื้นฐานการเรียกดูข้อมูลประเภท Times series ต่อไปถึงเวลาที่เราจะมาลงมือทำกันจริงๆแล้ว

0. Import Library

[Day 1–2] เริ่มแรกเราต้องรู้ก่อนว่าเราจะนำข้อมูลมาจากไหน ซึ่งแน่นอนไม่พ้นตลาดหลักทรัพย์แห่งประเทศไทย ในการดึงข้อมูลไม่ยากอย่างที่คิด เพียงแค่ติดตั้งไลบรารี่ Starfish เพื่อดึงข้อมูลในตลาดหุ้น และ ติดตั้งไลบราลี่ที่จะเป็นจะต้องใช้ เช่น pandas , matplotlib เป็นต้น และกำหนดให้แสดงผลเป็นเลขทศนิยม 2 ตำแหน่ง

Starfish : เป็นไลบรารี่ที่คนไทยเป็นคนทำ จึงขออนุญาตมา ณ ที่นี้ด้วยครับ 🤩

โค้ดการติดตั้งไลบราลี่ที่จำเป็นในการใช้ในโปรเจคนี้

Trick เล็กน้อยๆจากพี่ๆทีมงาน Botnoi : จากโค้ดบรรทัดแรกจะเห็นว่า มีการเขียน %% capture มันมีประโยชน์อะไร ? %% capture มีไว้เพื่อซ่อนการแสดงผลตอน ที่ติดตั้ง Package นั่นเอง เราลองมาดูความแตกต่างว่าถ้าไม่ซ่อนผลลัพธ์จะเป็นเช่นไร

เมื่อคอมเมนต์ %% capture จะเห็นผลลัพธ์การติดตั้ง Package มากมาย

1. Get Data

[Day 1–2]หลังจากนั้นเราจะเริ่มดึงข้อมูลจากหุ้นที่สนใจกันแล้ว เริ่มจากใช้ฟังก์ชั่น loadHistData () เพื่อดึงข้อมูลทางการเงินของหุ้นที่สนใจ โดยถ้าใส่หุ้นตัวเดียวจะได้สัดส่วนทางการเงินย้อนหลัง 4 ช่วงเวลา ถ้าใส่ list ของรายชื่อหุ้น จะได้สัดส่วนทางการเงินล่าสุดของหุ้นที่อยู่ใน list

เราจะสร้าง function เพื่อนำ data ข้อหุ้นเข้ามาตั่งแต่ วันที่ 1 มกราคม 2016 จนถึงปัจจุบัน ซึ่งเราจะดึงพารามิเตอร์มา 2 ตัวแปร คือ OHLC และ Volum

Volum คือ ปริมาณการซื้อขาย ณ วันนั้นๆ

OHLC คือลักษณะของ Bar Chart หรือ กราฟแท่งเทียน ย่อมาจากชื่อเรียก 4 ชื่อ คือ

1. OPEN Price (ราคาเปิด) ราคาที่เกิดขึ้นระหว่างผู้ซื้อและผู้ขายยื้อกันซื้อขายหุ้นในช่วงเวลาๆนั้นๆ โดยราคาเปิดจะมีความสัมพันธ์กับ บาร์(Bar) ก่อนหน้า หรือง่ายๆ ก็คือราคาซื้อขายแรกของวัน

2. HIGH Price (ราคาสูงสุด) ราคาที่มีการทำธุรกรรมซื้อในช่วงเวลานั้นมากที่สุดและมีการลดระดับลงมา จนปิด โดยจุดสูงสุดนี้ จะมีประโยชน์ตรงที่ว่า เราสามารถใช้เปรียบเทียบกับราคาในอดีตได้ง่าย

3. LOW Price (ราคาต่ำสุด) ราคาที่มีการทำธุรกรรมขายในช่วงเวลานั้นมากที่สุดและมีการซื้อกลับขึ้นขึ้นไปและปิด โดยจุดต่ำสุดนี้ จะมีประโยชน์ตรงที่ว่า เราสามารถใช้เปรียบเทียบกับราคาในอดีต

4. CLOSE Price (ราคาปิด) ราคาปิดนั้นสำคัญมากกว่าราคาเปิด ราคาเปิดนั้นเราสามารถรู้ว่ากราฟเปิดราคา ณ ตรงไหน และ มีการไปทดสอบกี่ครั้งก่อนจะไปทิศทางขึ้นหรือลง ส่วนราคาปิดพิเศษตรงที่ว่า ราคาปิดเปรียบเสมือ ราคาที่สะท้อนอารมณ์ของนักลงทุนหรือเทรดเดอร์ ที่แข่งขันกันซื้อขึ้นหรือลง และปิดตัวลง และ ผลลัพธ์ที่ออกมา ก็จะ บ่งบอกให้รู้ว่า กราฟจะเป็นไปในทิศทางใดในเวลาถัดไป

Credit :http://www.startupforex.com/2019/?p=794

Credit : https://today.line.me

คราวนี้ถึงเวลาที่เราจะนำหุ้นที่สนใจมาลองวิเคราะกันแล้ว และหุ้นตัวนั้นก็คือ หุ้นของบริษัท PTT นั่นเอง แต่นี่เป็นเพียงการนำหุ้นมาทดสอบกับ Model เฉยๆ แค่ชื่อบริษัททุกคนก็คงคิดว่าบริษัทนี้ต้องมีแต่กำไรแน่ๆ เพราะ เป็นบริษัทที่ให้บริการด้านพลังงานที่ใหญ่มากๆที่หนึ่งในประเทศไทย แต่นั่นเป็นเพียงสมมุติฐาน ในฐานะที่พวกเราเป็น ว่าที่ Data Science ฝึกหัด จากคอร์ส DSEs จึงของอาสาพาทุกๆท่านไปพิสูจน์ความจริงด้วยเครื่องมือทางด้าน Data Science กันดีกว่าซึ่งทุกๆท่านจะได้ประโยชน์ และ แนวคิดของ Data Science เพื่อที่จะนำไปต่อยอดหรือพัฒนาให้ดียิ่งๆขึ้นไปครับ

จะเห็นได้ว่ามี 1146 Low และ 5 Columm

แต่เราก็ยังอยากรู้ข้อมูลข้างในอีกเลยใช้คำสั่ง df.info() เพื่อดู data ภายใน data frame

ยังไม่พอแค่นั้นเราสามารถดูข้อมูลทางสถิติภายในการฟด้วยโค้ดเพียงแค่ 1 บรรทัดแต่ที่พวกเราทำมาทั้งหมดมากมายนั้นมีเหตุผล ลองดูจากค่าทางสถิติจะพบว่ามีความผิดปกติเกิดขึ้น ซึ่งนั่นก็คือ ค่า min ของ Volume เป็น 0 ซึ่งเราต้องหาวิธีแก้ไขหรือหาสาเตุให้ได้ว่าเกิดจากอะไรกันแน่ !!!

จากนั้นเพื่อให้สะดวกในการดูข้อมูลรวมๆจึงทำการพลอตกราฟของหุ้น PTT ขึ้นมาโดยจะดูที่ราคาปิดของหุ้น

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

2 . Cleansing & transformation

[Day 3 -4] เมื่อเราได้ Import ชุดข้อมูลเข้ามาแล้ว ขั้นตอนต่อไปคือการ Cleansing ข้อมูล ซึ่งในขั้นตอนนี้จะแบ่งเป็นขั้นตอนย่อยๆอีก 3 ขั้นตอน ที่จะแสดงดังต่อไปนี้

เมื่อเรียกดูข้อมูล 5 ตัวแรก

มีตัวแปร Date เพิ่มเป็น index ในการเข้าถึงข้อมูลแต่ละชุด

2.1 Get feature and target dataframe : เป็นการสร้างตัวแปรใหม่ขึ้นมาจาก data frame อันเก่า

โดยหลักการคือจะทำการ reset index ที่ตัวแปร Date เนื่องจากเราทราบว่าตัวแปร Date ภายในยังมีข้อมูลย่อยๆอีก เช่น วัน , เดือน , ปี ซึ่งเราจนำตัวแปรย่อยๆนี้มาสร้าง feature ใหม่ขึ้นมา จะสังเกตุได้ว่าจะมี ตัวแปร EnglishDay ซึ่งจะเป็นการดึงข้อมูลวันต่างๆ เช่น วันจันทร์ , วันอังคาร ,วันพุธ เป็นต้น เข้ามาเพราะว่า บางครั้งเราอาจจะสกัด feature ใหม่ๆเช่น ในวันจันทร์ที่มีการเปิดตลาดมีคนรอซื้อเยอะไหมเทียบกับตอนที่ปิดตลาด เป็นต้น

Trick เล็กๆน้อยๆจากพี่ๆทีมงาน Botnoi : เนื่องจากเราจะนำ ตัวแปร EnglishDay , Month , Day มาสร้าง featureและ ทำ One hot สเต็ปสุดท้าย ดังนั้นเราจึง แปลง data type มาเป็น Category ก่อน เพื่อที่ตอนที่ทำ One host เราจะได้แสกนแค่ type Category มาอย่างเดียว และสร้าง Dummie จะสะดวกกว่านั่นเอง

หลังจากนั้นเราจะทำการ merge (รวม) ระหว่าง data frame กับ feature ที่สร้างขึ้นมาใหม่โดยจะกลายเป็น data frame ตัวใหม่ ที่มี Cloumn feature รวมอยู่ใน data frame อันเดิม

Trick เล็กๆน้อยๆจากกลุ่ม G_6 : หลายๆคนที่เคยเล่นหุ้นนั้นจะคุ้นกับ Indicators ตัวนึง ที่นิยมใช้กันมากๆ ก็คือ เส้น Moving Average (MA) หรือภาษาไทยเรียกว่า เส้นค่าเฉลี่ยเคลื่อนที่ ซึ่งมีหลายประเภทมากๆ เช่น Simple Moving Average (SMA), Weighted Moving Average (WMA),และ Exponential Moving Average (EMA) เป็นต้น โดยเราจะนำเส้น EMA มาช่วยในการวิเคราะห์กราฟกันด้วย

ทำความรู้จักกับ Moving Average 📊

Moving Average (MA) หรือเส้นค่าเฉลี่ยเคลื่อนที่ เป็นการคำนวณค่าเฉลี่ย (Average) ของราคาหุ้น โดยใช้ข้อมูลของราคาหุ้นย้อนหลังตามที่ระยะเวลาที่เรากำหนด ซึ่งในโปรเจคนี้เราจะใช้ ema_5, ema_10 คือ ใช้ราคาหุ้น 5 วันย้อนหลังจากปัจจุบัน มาคำนวน Exponential moving average ในจำนวน 5 และ 10 วันย้อนหลัง ตามลำดับ

แต่เนื่องจากค่าเฉลี่ยเพียงค่าเดียวไม่สามารถให้ข้อมูลที่เพียงพอกับการวิเคราะห์หุ้นทางเทคนิค ดังนั้นวิธีการแสดงผลของ Moving Average จึงคำนวณค่าเฉลี่ยออกมาจำนนวนหลายๆ ค่า โดยจะคำนวณค่าเฉลี่ยของราคาหุ้นย้อนหลังค่าใหม่ เมื่อมีข้อมูลของราคาตัวใหม่เพิ่มขึ้นมา และวาดกราฟเของ Moving Average ออกมาเป็นกราฟเส้นที่มีการเคลื่อนที่ไปข้างหน้า(Moving) โดยการเรียงข้อมูลค่าเฉลี่ยที่คำนวณได้ต่อเนื่องกัน และวาดควบคู่กันไปกับกราฟของราคา จึงเป็นที่มาของคำว่า “Moving Average

Credit : https://aommoney.com/stories

Credit : https://aommoney.com/stories
https://www.forexinthai.com/1302/

ลักษณะสำคัญของเส้น Moving Average 📈

  1. จะเห็นได้ว่ากราฟของเส้น MA จะดูเรียบง่าย (Smooth) กว่ากราฟของราคาหุ้นที่มีลักษณะผันผวน ยึกยัก ขึ้นลง มากกว่า การวาดกราฟเส้นของ MA เลยเปรียบเหมือนกับการจำลองกราฟการเคลื่อนที่ของราคาหุ้นโดยตัดความผันผวนของราคาออกไปบางส่วน ทำให้มองเห็นการเคลื่อนที่ของราคาหุ้นในรูปแบบที่ง่ายขึ้น
การเปรียบเทียบระหว่างกราฟหุ้นกับเส้น EMA

2. เวลาที่เส้น MA ถูกวาดควบคู่กันไปกับกราฟของราคาหุ้น กราฟเส้นของ MA จะเคลื่อนที่ติดตามกราฟการเคลื่อนที่ของราคาหุ้น และมีทิศทางเดียวกันกับทิศทางแนวโน้มของราคาหุ้น แต่จะเคลื่อนที่ขึ้นหรือลงช้ากว่ากราฟของราคา จากคุณสมบัติข้อนี้ของเส้น MA จึงทำให้นักเทคนิคใช้เส้น MA เพื่อระบุว่าทิศทางแนวโน้มการเคลื่อนที่ของราคาหุ้น ณ ปัจจุบันอยู่ในทิศทางขาขึ้นหรือขาลง ทำให้เส้น MA ถูกเรียกว่าเป็น Indicators ประเภท Trend Following Indicator (คอยติดตามแนวโน้มการเคลื่อนที่ของราคาหุ้น)

3.เส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังสั้นกว่า จะเคลื่อนที่ติดตามกราฟราคาหุ้นได้ใกล้ชิดและเร็วกว่าเส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังนานกว่า เช่น เส้น EMA ที่คำนวณจากข้อมูลราคาหุ้นย้อนหลัง 5 วันจะติดตามการเคลื่อนที่ของกราฟราคาหุ้นได้เร็วกว่า เส้น EMA ที่คำนวณจากข้อมูลราคาหุ้นย้อนหลัง 10 วัน เป็นต้น

4. ในช่วงที่ราคาหุ้นมีทิศทางของแนวโน้มเป็นขาขึ้น กราฟของราคาหุ้นมักจะอยู่เหนือเส้น MA และ เส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังที่สั้นกว่าจะอยู่เหนือเส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังยาวกว่า

5. ในทางกลับกันในช่วงที่ราคาหุ้นมีทิศทางของแนวโน้มเป็นขาลง กราฟของราคาหุ้นมักจะอยู่ใต้เส้น MA และ เส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังที่น้อยกว่าจะอยู่ใต้เส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังยาวกว่า

6. แต่ถ้าราคาหุ้นอยู่ในช่วงที่ไม่มีทิศทางของแนวโน้ม หรือแนวโน้มไม่ขึ้นไม่ลงอย่างชัดเจน (Sideways) ราคาหุ้นบางทีก็อยู่เหนือเส้น MA บางทีก็อยู่ใต้เส้น MA สลับไปมาหรือถ้าสังเกตจะเห็นว่าเส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังที่สั้นกว่า ก็จะตัดเส้น MA ที่คำนวณจากข้อมูลราคาย้อนหลังยาวกว่า ขึ้นๆลงๆ สลับไปมา

ขอบคุณความรู้ดีๆจาก https://aommoney.com

บทความทั้งหมดเรื่องเส้น EMA สามารถเข้าไปดูที่ต้นฉบับได้ที่ : คลิ๊กที่นี่

ดังนั้นกลุ่มพวกเราจึงนำเส้น ema_5 และ ema_10 มาคิดด้วยโดยจะสร้าง Column ใหม่ และ ทำการคำนวนเล็กน้อย เพื่อหา Buy signal โดยผลลัพธ์จะแสดงเป็น คำว่า Buy และ Sell ถ้าหากเส้น ema_5 ลบกับเส้น ema_10 แล้วมีค่ามากกว่า 0 แสดงว่ากราฟมีแนวโน้มขาลง ผลลัพธ์จะแสดงคำว่า “ Buy ” ในทางกลับกันถ้า ema_5 ลบ ema_10 มีค่าน้อยกว่าเท่ากับ 0 แสดงว่ากราฟมีแนวโน้มขาขึ้นให้แสดงคำว่า “Sell” ซึ่งสามารถแสดงดังภาพนี้

หากเส้น ema_5 ลบกับ เส้น ema_10 แล้วค่าน้อยกว่า 0 จะแสดงเป็น Sell

2.2. Get one-hot encoder : เป็นการนำตัวแปรใน Category มาแตกเป็น Column ย่อย ๆ แบบ Binary 0/1 ตาม Value ของข้อมูล ดูตัวอย่างจะเห็นภาพชัดกว่านะครับ

เมื่อเราแปลงข้อมูล Column EnglishDay เป็น One Hot Encoding จะได้ดังนี้

ในวิชาสถิติ จะเรียก Column เหล่านี้ ว่า Dummy Variables

ข้อดีของ One Hot Encoding

1. ข้อมูลที่ Encode แบบ One Hot จะช่วยให้โมเดล Machine Learning ทำงานง่ายขึ้น เปรียบได้กับ แทนที่โมเดลจะเรียนรู้ Pattern จากสัญญาณเดียว 3 ระดับ เปลี่ยนมาเรียนรู้จากสวิทช์ปิดเปิด 3 ตัวแทน

2. ความหมายของข้อมูลแบบ Nominal จะตรงขึ้น

3. สามารถใช้ไป Dot Product กับ Matrix ที่ต้องการ

ข้อเสียของ One Hot Encoding

1. เปลืองเนื้อที่ เปลือง Memory ที่เก็บค่า 0 เป็นส่วนใหญ่ เรียกว่า Sparse Matrix

2. ความหมายของลำดับข้อมูลแบบ Ordinal จะหายไป เนื่องจากทุก Category แตกต่างกันเท่ากันหมด

3. ข้อมูลจะอยู่ได้แต่ 1 Category เท่านั้น ถ้ามากกว่า 1 จะเรียกว่า Multi-Hot Encoding

4. ถ้าข้อมูลมี Value หลากหลายมากจะมีปัญหา

5. ถ้าข้อมูลมีการเพิ่ม Categoryใหม่ ๆ เล็ก ๆ ยิบย่อยอยู่ตลอด จะทำให้มีปัญหา

Credit : https://www.bualabs.com/archives/1902/what-is-one-hot-encoding-benefit-one-hot-encoding-why-one-hot-encoding-in-machine-learning/

ซึ่งสามารถเขียนโค้ดได้ง่ายๆเพียงไม่กี่บรรทัดแสดงดังนี้

และหากเราต้องการดู data frame หลังจากการทำ One Hot Encoding สามารถเขียนโค้ดได้ดังนี้

จะเห็นได้ว่ามี column เพิ่มขึ้นมาเยอะมากๆ

หลักจากนั้นเราทำการสร้างฟังก์ชั่น getX_Y เพื่อแยก feature กับ Label เก็บไว้ในตัวแปล x และ y โดยที่ feature เดิม เป็น ตัวแปร x ส่วน ราคาเปิดเก็บไว้ในตัวแปร y

และมีการเรียกดูค่าัวแปร x ดังนี้

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

ในงานชิ้นนี้ พวกเราได้มีข้อมูล 2 ชุดนั้นคือ ข้อมูลดั้งเดิมที่เราเรียกใช้ในข้างด้น และข้อมูลที่ผ่านกระบวนการทำ feature engineeing แล้ว ในเวลาเรา train เราใช้ข้อมูลอันใหม่ที่มาจากเราทำ feature engineer เปลี่ยน OPEN ไปใช้ PVOPEN แทน

PVOPEN ก็คือ previous ราคา OPEN ของ 6 วันที่แล้ว(เราต้องการทำนาย 7 วันข้างหน้า)

ทีนี้ตอน train model เราใช้ราคาย้อนหลัง(x_train) แต่ตอน predict เราต้องใช้ราคา ณ วันปัจจุบันเลยตั้งตัวแปรใหม่เป็น x2

เนื่องจาก x2 มันก็มาจาก dataset อันเดียวกัน ในฟังชั่น get_x2 เลยเริ่มจากแสกนหา row ที่มี ‘PV’ จากนั้นตัด PV ออก (หา PVOPEN แล้วไปเอา OPEN) แต่บรรทัดที่ 3 คือใส่ String PV กลับให้มันด้วย(แต่จริงๆ แล้วมันคือ OPEN ปัจจุบันนะ) จะได้รัน model ไปพร้อมกันได้

2.3. Split train and test data frame : ขั้นตอนนี้จะเปป็นการแบ่ง data frame เพื่อนำไป Train และ Test

โดยจะทำการแบ่งข้อมูล ในการ train (0.8)80 % และแบ่งข้อมูลเพื่อใช้ test (0.2)20% ซึ่งเราจะ Import math เพื่อที่จะใช้ function Cell โดยที่ function Cell จะทำการปัดเศษให้เป็นจำนวนเต็ม เพราะ เราจะใช้ data frame มาคูณ กับ train_ratio จะเกิดเป็นทศนิยมขึ้น และทำการ spilt ด้วย function iloc เพื่อเก็บค่าไว้ใน X_train และ Y_train

การเลือกแถว และ คอลัมน์

การที่จะเลือกแถว และคอลัมน์ นั้นเราจะต้องระบุว่าต้องการจะเลือกข้อมูลที่อยู่ใน แถวอะไร และคอลัมน์อะไร หรือ Location ที่มีข้อมูลที่ต้องการอยู่นั้นเอง ซึ่งมี 2 วิธี ดังนี้

1. loc : การที่จะใช้ loc นั้น จะต้องระบุชื่อของแถวและ ชื่อของคอลัมน์ลงไปตรงๆ

2. iloc : การที่จะใช้ iloc นั้นไม่สนใจชื่อ แต่สนใจตำแหน่งของแถว และ ตำแหน่งของคอลัมน์

ตัวอย่างข้อมูลโดยแสดงให้เห็นถึงชื่อและตำแหน่งของ แถวและคอลัมน์

บทความนี้มีต้นฉบับที่ Credit : https://medium.com/data-cafe-thailand/pandas-part-ii

Trick เล็กๆน้อยๆจากพี่ๆทีมงาน Botnoi : ถ้าเราลองสังเกตุกราฟจะเห็นได้ว่า กราฟ trend จะอยู่ทางด้านซ้าย ส่วนการ Prediction จะเป็นกราฟทางด้านขวา ซึ่ง 2 กราฟนี้จะต่อกันทำให้เราไม่รู้ว่า เมื่อเทียบที่เวลาเท่ากันกราฟที่ Prediction เมื่อเวลาอดีตจะเท่ากับ กราฟ trend ไหม จึงทำการนำ data frame ที่เหลืออีก 20 % มาเข้าที่โมเดล แล้วให้ โมเดล Predict ค่าออกมา จะได้กราฟออกมา 2 เส้น คือ กราฟ Actual และ กราฟ Predict ที่ ระยะ เวลาเท่ากัน

และทำการ Drop Label OHLC และ Volum ออกไปเนื่องจาก feature ทั้งหมดนั้นจะเป็นผลลัพธ์ที่เกิดขึ้น หากมีการใส่ค่าเหล่านี้เข้าไปจะทำให้การ Predict จะเกิด Error = 0 หรือ ทำนายได้ 100 % เพราะ ตัวโมเดลรู้ราคา OLHC หรือสิ่งที่เกิดขึ้นแล้ว

กำหนด Train side ที่ 0.8
ดูผลลัพธ์ทั้งหมด

Trick เล็กๆน้อยๆจากพี่ๆทีมงาน Botnoi : ถ้าหากเราไม่ใส่คำว่า Display ทาง Colab จะไม่แสดง จำนวนความยาวของ X_train มาให้

เราสามารถเช็คได้ว่า โมเดลที่ใช้ Train และ Test นั้น เริ่มต้นและสิ้นสุดที่วันที่เท่าไรจากซึ่งเวลาจะต้องต่อเนื่องกัน

3. Prediction model

ถึงเวลาที่เราจะมาทำนายกันแล้ว เพื่อไม่ให้เสียเวลา ให้เราสร้างโมเดล Linear Regression เข้าไปถามทางดูก่อน เพื่อดูผลลัพธ์ที่จะเกิดขึ้นว่าจะเป็นเช่นไร

3.1. Model

model_fit คือ การ Train โดยใช้ ชุดข้อมูล X_train , Y_train เข้าไป และใช้ Model Linear Regression ในการ Predict ซึ่งเราจะทำการ normalize ข้อมูลก่อน เพื่อทำการ rescale ตัวแปรให้อยู่ในช่วง [0, 1] ข้อมูลจะได้มีความเท่าเทียมกัน !!! พอเราใส่ชุดข้อมูลไปแล้ว ตัว Model จะทำการ Train ตั้งแต่ต้นจนถึงปัจจุบัน มาเก็บไว้ในตัวแปร y_hat ผลลัพธ์ที่ได้จะเป็น array

โดยผลลัพธ์ที่ได้จะไม่ต่างกันจาก ชุดข้อมูลที่นำไป Train มากนัก

3.2. Error

ต่อไปเรามาลองดู Performance ของ Model เรากันบ้างดีกว่า โดยการ Import Library ที่จำเป็น เช่น mean_squared_error จาก sklearn.metrics , sqrt จาก math เป็นต้น หลายคนอาจจะส่งสัยว่า metrics คืออะไร metrics คือค่าที่ได้จากการคำนวณ/ เปรียบเทียบผล prediction vs. actual ว่าโมเดลของเราทำนายได้ถูกต้องแค่ไหน ซึ่งในหัวข้อนี้เราจะใช้วิธี RMSE กัน

RMSE ย่อมาจาก “Root Mean Square Error” ทำ square root ค่า MSE เพื่อให้ได้ค่า loss ที่มีหน่วยเดียวกับตัวแปร y เหตุผลที่ต้องทำ SQRT เพราะว่าเรายกกำลังสองค่า error ก่อนหาค่าเฉลี่ยทำให้หน่วยมันเปลี่ยนไปจากเดิม

RMSE จะแปลผลง่ายสุดเลย Linear Regression ที่มี RMSE เท่ากับ 2.56 แปลว่าโดยเฉลี่ยโมเดลทำนาย y ผิดไป +/- 2.56 point

MAE,MAD,MAPE MSE, RMSE มีค่ายิ่งต่ำยิ่งดี ถ้าเท่ากับ 0 แปลว่าโมเดลทำนายค่า y ได้ถูกต้องเป๊ะ 100% ในทางปฏิบัติโอกาสที่จะเทรนโมเดลได้ loss = 0 เป็นไปได้ยากมาก เพราะอาจนำไปสู่ปัญหา Overfitting ได้

สามารถอ่านบทความMetrics พื้นฐานสำหรับวัดประสิทธิภาพของโมเดล Machine Learning ที่นำมาเขียนในบทความนี้ได้จาก คลิ๊ก

4. Visualize

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

พบว่าโมเดลสามารถทำนายได้ดีในระดับนึงเลยทีเดียว เยี่มมากๆ ชมกลุ่มตัวเองก็ได้เหรอ 5555 🤣

(แต่ที่จริงแล้วที่โมเดลที่สร้างนั้นดูมีความแม่นยำมาก นั้นเกิดมาจากการที่โมเดลนั้นเรียนรู้จากค่า OHLC และ Volume ของวันนั้นๆ ทำให้การทำนายนั้นเป็นไปอย่างแม่นยำ ในการทำนายจริงๆ นั้นเราจะไม่รู้ค่า OHLC และค่าอื่นๆ การทำนายนั้นอาจจะผิดพลาดมากขึ้น)

5. Feature engineer: Incorporate previous day price and volume features

เมื่อได้ลองดูกราฟการ Predicted แล้ว ผลลัพธ์ออกมาได้หน้าพอใจแต่เพื่อเป็นการเตรียมความพร้อมในอนาคตพวกเราจึงสร้าง Feature ใหม่ขึ้นมา เพื่อที่จะสามารถ เปิด-ปิดการใช้งานได้เพราะว่าเราจะต้องนำFeature นี้ไปใส่ใน Piplineโดยให้ชื่อว่า Feature engineer ถ้า feat_eng=False แปลว่าปิดการใช้งาน function นี้ แต่ถ้าเป็น True แปลว่ากำลังใช้งานอยู่

จากโจทย์ที่เราได้รับมอบหมายมาคือให้หาหุ้นที่น่าจะให้ผลตอบแทนมากที่สุดใน 7 วันถัดไป…..อืม…. เอ๊ะ… ถ้าเราสร้างโมเดลจาก OHLC ในวันที่ปัจจุบัน แล้วใน 7 วันถัดไปเราจะราคาของวันนั้นมาเป็น feature ในการทำนายผลลัพธ์ได้ยังไงล่ะ????

ปิ๊ง!!!…. นั่งไทม์แมชชีนไป….. ก็ไม่น่าจะใช่นะครับ

เราจึงคิดมุมใหม่ ในเมื่อเราไม่มีทางรู้ราคา OHLC ในอนาคตได้ เราก็สร้างโมเดลที่เรียนรู้จากค่า OHLC ในอดีตแทน โดยเราทำ feature engineering โดยกำหนดให้เลื่อนชุดข้อมูลแต่ละใน Feature ในของแต่ละวันเป็นวันก่อนหน้า 6 วัน และนำ concept ของ ARIMA มาใช้

เพื่อให้เข้าใจได้เห็นภาพได้ชัดเจนยิ่งขึ้นจะยกตัวอย่างดังภาพ ด้านล่าง และทำการเปลี่ยนชื่อ feature ใหม่ จะเป็นชื่อที่ขึ้นต้นด้วย “PV_____”

การทำ Feature engineering โดยการเลื่อนข้อมูลก่อนหน้า 6 วันมาเป็นข้อมูลปัจจุบัน

6. Setup our pipeline

ถึงเวลาที่เราจะรวม Function ที่พวกเราได้ทดลองมาอยู่ใน Pipeline กันแล้ว หลังจากที่ทดสอบ Function และ Model อยู่นานหลายวัน โดยมีลายละเอียดดังรูป

โดยเราจะสร้าง Function ขึ้นมาใหม่ ให้ชื่อว่า main ซึ่งหมายถึง Function หลักที่จะนำไปใช้งาน ประกอบไปด้วย Function ต่างๆ ที่สร้างมา คือ Get stock (ดึงราคาหุ้น) , Get engineered features (features ที่สร้างขึ้นมาเพิ่มเติม) , Train test splitting (แบ่ง data frame เพิ่มนำไป Train และ Test) , One-hot encoder (ตัวแปรใน Category มาแตกเป็น Column ย่อย ๆ แบบ Binary 0/1) ,Prediction model (Model การทำนาย) , Prediction (ผลลัพธ์จากการทำนาย) , RMS(ตรวจเช็ค Performance ของ Model)

Test our pipeline

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

เริ่มจากหุ้น ของบริษัท BANPU ก่อนเลยเนื่องจากทำธุรกิจเกี่ยวข้องกับพลังงานเหมือนกัน ค่า RMS ที่ได้ใกล้ 0 มาก แสดงว่ากราฟแทบจะซ้อนทับกันเลย และราคาอยู่ที่ 5.8691 บาท

บริษัท BANPU :เป็นบริษัทดำเนินธุรกิจถ่านหิน ธุรกิจไฟฟ้า และพลังงานที่เกี่ยวเนื่องอย่างครบวงจร ทั้งในและต่างประเทศมากว่า 30 ปี ในด้านการลงทุน สำรวจ พัฒนา และดำเนินการผลิตถ่านหินประเภทให้ความร้อน (Thermal Coal) ตลอดจนถ่านหินสำหรับอุตสาหกรรมถลุงเหล็ก (Coking Coal) มีความเชี่ยวชาญทางด้านเหมืองถ่านหินแบบเปิดและเหมืองใต้ดิน บริษัทยังมีการพัฒนา Smart Energy Solution

แต่ทางทีมงาน Botnoi ได้แนะนำ library pycaret ซึ่งจะแตกต่างกว่า starfishx ตรงที่มันสามารถคำนวณได้ว่า train model แบบไหนเหมาะกับ data set เราที่สุด (กลุ่มเราใช้ LinearRegression) จะเพิ่มความแม่นยำในการ Predict มากขึ้น

ตัวอย่างจากพี่ๆทีมงาน Botnoi

ตัวเดียวน้อยไปลอง 5 ตัวดูก่อน

มีแต่บริษัทใหญ่ๆทั้งนั้นเลย ลองมาดูผลลัพธ์กัน

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

แต่คิดว่าการแสดงผลเมื่อดูแล้วยังตัดสินใจยากอยู่ดังนั้นพวกเราจึงใช้วิธีเบสิกที่สุดที่เรียนกันมาสมัยเด็กๆนั่นก็คือ การคำนวณหาค่าคลาดเคลื่อนร้อยละ หรือ % error นั่นเอง

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

แต่เราจะติดเป็นค่าตัวเลขปกติเอาไว้ไม่ต้องคูณ 100 เพื่อทำเป็นเปอร์เซนต์ จะได้ว่า

ซึ่งโปรเจคนี้ Dr. win CEO ของบริษัท Botnoi Sponsor เงินมา 10,000 บาท เพื่อนำไปลงทุน ซึ่งขอขอบพระคุณมากๆที่ เชื่อใจในความสามารถของพวกเรา ดังนั้นเราควรทำให้ดีที่สุด ด้วยการนำหุ้นทั้ง Set 100 มาใส่ในโมเดล ซึ่งให้ผลลัพธ์ดังนี้

ซึ่งผลลัพธ์ที่ได้ก็คือออ !!!!

สรุป หุ้นที่เราเลือกในสัปดาห์นี้ก็คือ “ TASCO” นั่นเองง !!!!! ซึ่งเราจะสรุปเป็นหัวข้อต่างๆที่มีผลในการเลือกดังต่อไปนี้

  1. ราคาปัจจุบัน : อยู่ที่ “ 17.40 บาท ”
  2. ราคาที่ Model Predict ได้ (7 วันข้างหน้า) : อยู่ที่ “ 20.5982บาท”
  3. RMS : อยู่ที่ “ 1.46
  4. % Change : อยู่ที่ “0.18

เลือกจาก % Change ที่มีค่ามากที่สุดเป็นอันดับแรกนั่นเอง

คำเตือน !!!

Model นี้สร้างขึ้นใช้เวลาเพียงแค่ 1 สัปดาห์ อาจไม่เหมาะสมที่จะนำไป Predict จริงจัง ถ้าอยากนำไปใช้งานจริงอย่างมีประสิทธิภาพ จำเป็นต้องสร้างหรือหา feature ที่มีผลกับราคาขึ้น-ลงของหุ้นอีกมาก และยังต้องทดสอบอีกนาน “การลงทุนมีความเสี่ยง ผู้ลงทุนควรศึกษาข้อมูลมาอย่างถี่ถ้วน”

เนื่องจากเวลามีจำกัดอาจทำให้ Model นี้ใช้งานได้ไม่เต็มประสิทธิภาพและบางวันอาจมีข่าวต่างๆที่ส่งผลให้ราคาของหุ้นตกลงมาได้แต่เรายังขาด feature ที่จะไปเติมเต็มส่วนนั้น ดังนั้นพวกเราจึงนำผลลัพธ์ที่ได้มาร่วมกันตัดสินใจกันอีกทีนึง เพื่อที่จะลดความผิดพลาดหรือถ้าผิดพลาดก็อยากให้ Dr. Win ขาดทุนน้อยที่สุดนั่นเอง

อย่างไรก็ตามบทความนี้จะเป็นจุดเริ่มต้นในการสร้าง Data Science ขึ้นมาไม่มากก็น้อยอย่างแน่นอน ถึงจะขาดทุนเรื่องราคา แต่เชื่อว่าทุกคนที่เข้ามาอ่านบทความนี้และทีมงาน ฺBotnoi ได้รับกำไรความรู้อย่างมากมาย และ ผลลัพธ์ที่ทางทีมงานหวังว่าจะเป็นเช่นนั้น แน่นอนครับ เหมือนดั่งที่ Warren Buffet กล่าวไว้ว่า

สรุปผล

กระบวนการในการทำ Trend forecasting ด้วย Machine Learning มีรายละเอียดดังนี้

  1. Get data : เป็นการนำข้อมูลราคาของหุ้นเข้ามาโดยดึงราคามาจาก ตลาดหลักทรัพย์แห่งประเทศไทยซึ่งใช้ฟังก์ชั่น loadHistData ()
  2. Cleansing & transformation : เป็นการทำความสะอาดข้อมูลหรือเช็คความผิดพลาดของข้อมูลที่ถูกนำเข้ามาใน data set เนื่องจากข้อมูลที่นำเข้ามาในโปรเจคนี้เป็นข้อมูลจริง จะไม่มีความผิดผลาดอยู่แล้วดังนั้นจึงทำการจัดรัเบียบข้อมูลให้สามารถดึงมาใช้งานได้ง่ายๆแทน มีรายละเอียดดังนี้

2.1. Get feature and target dataframe :เป็นการสร้างตัวแปรใหม่ขึ้นมาจาก data frame อันเก่า ซึ่งจะกลายเป็น feature ที่เรานำมาประยุกต์ใช้งานได้

2.2. Get one-hot encoder : เป็นการนำตัวแปรใน Category มาแตกเป็น Column ย่อย ๆ แบบ Binary 0/1 ตาม Value ของข้อมูล

2.3. Split train and test data frame : ขั้นตอนนี้จะเปป็นการแบ่ง data frame เพื่อนำไป Train และ Test

3. Prediction model : เป็นการสร้าง model เพื่อ Predict ผลลัพธ์ออกมา มีรายละเอียดดังนี้

3.1. Model : ซึ่งในโปรเจคนี้จะ Model ง่ายๆ เบสิก คือ Linear Regression

3.2. Error : เป็นการดู Performance ของ Model ว่าเหมาะสมกับข้อมูลไหม

4. Visualize : เป็นการนำผลลพธ์ที่ได้จาก Model มา พล็อตกราฟ

5. Feature engineer: Incorporate previous day price and volume features : เป็นการสร้าง feature เพิ่มเติมเพื่อมา support ชุดข้อมูลของเรา

6. Setup our pipeline : เป็นการนำ function ที่เราสร้างไว้ทั้งหมดมารวมไว้ที่เดียวกัน เพื่อสะดวกในการนำไปใช้งาน

Test our pipeline : ขั้นตอนสุดท้ายคือการทดลอง Pipe line ที่สร้างมาว่าถ้านำชุดข้อมูลหุ้นตัวอื่นไปใส่จะให้ผลลัพธ์เป็นเช่นไร

Future work:

จากตัวอย่างที่พวกเรากลุ่ม G6 ได้เลือกทำนั้น เราได้เลือกทดลองใช้ model Linear regression เพียงอย่างเดียว ควรมีการศึกษาลักษะและการกระจายกันของหุ้นแต่ละตัว และปรับเลือกใช้ Algorithm ที่ให้ความแม่นยำที่สูงขึ้น ซึ่ง Pycaret ก็เป็น library หนึ่งที่ช่วยลดเวลาในการเปรียบเทียบลักษณะประสิทธิภาพของโมเดล

ตัวอย่างผลลัพธ์การทดสอบด้วย Pycaret

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

เป็นยังไงกันบ้างครับและนี่ก็คือ บทความพี่พวกเรากลุ่ม G6 ได้ร่วมแรงร่วมใจเพื่อสร้างสรรค์ผลงานที่มีคุณภาพ ได้รวบรวมข้อมูลจากทั้ง Class DSEs , ข้อมูลจากพี่ๆ เพื่อนๆ , ข้อมูลจากพี่ๆทีมงาน Botnoi พวกเราขอขอบคุณคุณผู้อ่านทุกๆท่าน พี่ๆทีมงาน Botnoi และ พี่ๆเพื่อนๆทั้งกลุ่ม G6 และกลุ่มอื่นๆด้วยครับ

คำคมในวันนี้ : อดีตอาจจะเป็นรากฐานของปัจจุบัน… แต่เราอย่าตัดสินกันที่อดีตครับ… หุ้นก็เช่นกัน

-thank you -

DSEs_G6

--

--