Smart stock market analysis with PowerBI tool (ตอนที่ 2)

 การสร้าง AI โมเดลสำหรับการทำนายมูลค่าของหุ้นด้วย Python

 ทักษะที่ต้องมี การเขียนโปรแกรมด้วยภาษา Python

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

 ส่วนที่ 1 การใช้ API ดึงข้อมูลหุ้น
        เราเริ่มต้นด้วยการโหลดข้อมูล AOT จาก Yahoo API ในช่วงเวลาระหว่าง ‘2017-01-01’ และ ‘2023-03-30’ จากโค้ดในกรอบด้านล่าง

และสามารถตรวจสอบข้อมูลที่โหลดมาได้ด้วยคำสั่ง

AOT.head() ซึ่งจะแสดงข้อมูลที่ Yahoo API ให้มาตามรูป

บันทึกข้อมูลที่โหลดมาได้เก็บเป็นไฟล์ excel ไว้ก่อน เพื่อนำไปใช้ในครั้งถัดหรือใน PowerBI ในตอนถัดไป

แยกเฉพาะข้อมูลราคาปิดออกมาจากข้อมูลที่ได้มา

 ส่วนที่ 2 การเตรียมข้อมูล
       การจัดการกับข้อมูลที่จะใช้สอนโมเดลอัจฉริยะเพื่อทำนายราคาหุ้น ในบทความนี้
1. จากข้อมูลที่โหลดมาทั้งหมด ข้อมูล 80% จะถูกนำมาใช้สอนโมเดล และอีก 20% จะแยกไว้ใช้ทดสอบโมเดลที่สอนได้ (โมเดลจะไม่เห็นข้อสอบ 20% นี้ก่อน)

2. ก่อนนำไปเข้าโมเดล บทความจะทำการแปลงข้อมูลราคาหุ้นให้อยู่ในช่วงที่เหมาะสมคือ 0-1 ด้วยเทคนิค Min-Max scaler ขั้นตอนแปลงข้อมูลจะทำหรือไม่ก็ได้หรือใช้วิธีอื่นก็ได้เช่นกัน อย่างไรก็ดีถ้ามีการปรับข้อมูลสำหรับใช้ป้อนเพื่อสอนโมเดล ข้อมูลทดสอบจะต้องถูกแปลงก่อนเข้าสู่โมเดลเช่นเดียวกัน

ขั้นตอนข้อ 1 และ 2 จะเขียนด้วยโค้ดด้านล่าง

3. กำหนดรูปแบบของข้อมูลที่จะนำเข้าไปสอนโมเดลอัจฉริยะเพื่อทำนายราคาหุ้น ในบทความนี้เราจะทำนายราคาหุ้นของวันพรุ่งนี้ (y_train) โดยใช้ข้อมูลราคาหุ้น 30 วันก่อนหน้า (x_train) ดังนั้นจะสร้างชุดข้อมูลแบบกรอบหน้าต่าง หน้าต่างละ 30 วัน ข้อมูลแบบลิสที่ได้จะถูกแปลงเป็น numpy array และปรับขนาดข้อมูลโดยใช้ฟังก์ชั่น reshape เพื่อใช้ในการคำนวณต่อไป ผู้อ่านสามารถใช้คำสั่งพิมพ์ตรวจสอบขนาดของข้อมูลได้ “print x_train.shape” เพราะว่าจำนวนชุด (x_train, y_train) จะต้องสอดคล้องหรือเท่ากัน เช่น เมื่อเราต้องการสอนโมเดลด้วยข้อมูล 1000 ชุด ในข้อมูล 1000 ชุดนั้นจะประกอบไปด้วย

3.1 ข้อมูลราคา 30 วันจำนวน 1000 ชุด
3.2 ข้อมูลผลลัพธ์ของราคาที่จะทำนายจากข้อมูลข้อแรก 1000 ชุด

ดังนั้น โค้ดด้านล่างจะถูกนำมาสร้าง รูปแบบของข้อมูล (x_train, y_train)

 

บันทึกข้อมูลที่โหลดมาได้เก็บเป็นไฟล์ excel ไว้ก่อน เพื่อนำไปใช้ในครั้งถัดหรือใน PowerBI ในตอนถัดไป

  ส่วนที่ 3 สร้าง สอนและบันทึกโมเดล
        เมื่อเตรียมข้อมูลพร้อมสำหรับการสอนโมเดลเพื่อใช้ทำนายราคาหุ้นในส่วนที่ 2 เสร็จเรียบร้อย สิ่งถัดไปคือการสร้างโครงสร้างของโมเดลที่ไม่ได้กำหนดค่าภายใน เปรียบเสมือนเช่น เราสร้างโมเดลสมองเทียม 1 ชุด เราจะการสร้างโหนดในสมองเทียม การเชื่อมต่อโหนดต่างๆ ความลึก ความซับซ้อน สำหรับบทความนี้ผมได้ยกตัวอย่างง่ายๆ สำหรับการโมเดลของการเรียนรู้เชิงลึก มีเพียง 5 ลำดับชั้น ซึ่งเหมาะสมสำหรับการเรียนรู้และทำความเข้าใจเบื้องต้น ในการสร้างโมเดลทำนายจริงๆ เราสามารถสร้างโมเดลที่ซับซ้อนกว่านี้ (ผมเองก็ใช้โมเดลที่ซับซ้อนกว่านี้ในการอ้างออิง แต่ขอไม่กล่าวถึง เพราะไม่ใช่เป้าหมายของบทความ) เช่น
– เพิ่มข้อมูลอื่นที่เกี่ยวข้องกับราคาหุ้น (ข้อมูลปริมาณการซื้อขาย, ดอกเบี้ย เป็นต้น)
– เพิ่มโครงสร้างแบบขนาน (อันนี้ขอข้ามไปก่อน เพราะไม่เหมาะสำหรับการเริ่มต้น)
– อื่นๆ

โมเดล (model) ที่ใช้ในบทความด้วยโค้ดด้านล่างจะมีโครงสร้างดังต่อไปนี้

– LSTM layer = ชั้น LSTM สำหรับข้อมูลราคา 30 วัน
– Pooling layer =ชั้นลดขนาดโดยการใช้ค่าเฉลี่ย
– LSTM layer = ชั้น LSTM สำหรับข้อมูล 10 ค่า
– Dense layer = ชั้นที่เชื่อมโหนดทุกอันของชั้นก่อนหน้า มี 20 โหนด
– Dense layer = ชั้นที่เชื่อมโหนดทุกอันของชั้นก่อนหน้าสำหรับผลลัพธ์ราคาทีทำนาย

ตั้งค่าการสอนโมเดล (model) แบบอดัม (adam) และสอนโมเดลโดยป้อนข้อมูลเข้าจำนวน 25 รอบด้วยโค้ดด้านล่าง

– บันทึกโมเดลที่สอน (model) บทความได้เซฟโมเดลไว้ที่ path = “/content/gdrive/My Drive/Resource/Vision/Model” ผู้อ่านจำเป็นต้องเปลี่ยนข้อความที่ขีดเส้นใต้ให้ตรงกับ path ที่มีจริง ในชื่อไฟล์ ‘stockmodel.h5’

 ส่วนที่ 4 การทดสอบโมเดล
       เนื้อหาที่ผ่านมาเป็นการสร้างและบันทึกโมเดลเชิงลึกที่เราสอนขึ้นมา เราสามารถนำโมเดลที่สร้างขึ้นไปใช้ใน PowerBI ได้เลย ส่วนเนื้อหาถัดไปจะเป็นการทดสอบการทำนายบน python โดยใช้ข้อมูล 20 % ที่เหลือซึ่งเราได้แยกออกมาทำให้โมเดลไม่ได้รู้จักข้อมูลส่วนนี้มาก่อน

4.1 การเตรียมข้อมูลทดสอบ (test_data, y_test)   สำหรับข้อมูลทดสอบ x_test เราใช้รูปแบบเดียวกันกับการเตรียมข้อมูลสอนโมเดลในส่วนที่ 2 ดังนั้นผมขอข้ามการอธิบายในส่วนนี้เพราะเนื้อหาจะคล้ายกับการเตรียมข้อมูลสำหรับการสอนโมเดล

4.2 การทดสอบโมเดลด้วยการทำนายจากข้อมูลทดสอบ ข้อมูลที่ทำนาย (predictions) จากโมเดลจะถูกแปลงกลับหลังจากมีการทำการแปลงข้อมูลก่อนนำเข้าสู่โมเดลในข้อ 4.1

4.3 การแสดงเปรียบเทียบผลการทำนายด้วยกราฟ เนื่องจากข้อมูลจะถูกการแบ่งเป็น 2 ช่วง – ช่วงแรกนำมาสอนโมเดลเชิงลึก ช่วงแรกจะแสดงด้วยเส้นสีฟ้า (Train) – ช่วงที่ 2 ใช้ทดสอบโมเดลเชิงลึก ในช่วงของการทดสอบจะมีข้อมูลราคาจริง (validation [‘Close’]) ที่เกิดขึ้นในตลาดหุ้นกับราคาที่ทำนาย (validation [‘Predictions’]) ซึ่งแสดงด้วยเส้น Val สีส้ม กับ Predictions สีเขียวตามลำดับ

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

4.4 บันทึกข้อมูลทดสอบเป็นไฟล์ excel เพื่อใช้เป็นข้อมูลใน PowerBI (จำเป็นต้องบันทึกไฟล์นี้เพื่อใช้ในตอนที่ 3)

สร้างไฟล์เก็บข้อมูลที่จะใช้ทดสอบโมเดลบน PowerBI

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

This entry was posted in Blog 101. Bookmark the permalink.