“การลงทุนที่ดีที่การลงทุนที่กำไรมากที่สุด” นั่นมันสำหรับมือใหม่เค้าว่ากันครับ การลงทุนที่ได้กำไรมากๆ อาจจะเป็นการลงทุนที่ห่วยแตกก็ได้ และเราไปสนใจกับแค่ช่วงเวลาหนึ่งๆ (one point in time) แล้วพบว่าระบบลงทุนของเรานี่มันดี เพราะทำกำไรได้มาก แต่จริงๆ อาจจจะฟลุ๊กก็ได้ ในการลงทุนที่ดี สิ่งที่ต้องสนใจไม่แพ้ผลกำไร ก็คือ “ความเสี่ยง” ครับ portfolio ที่ดีจะต้องให้น้ำหนักกับเรื่องนี้ให้มาก วันนี้เราเลยจะมาดูเรื่องผลกระทบของการ “Rebalance Portfolio” กันครับ โดยตัวอย่างที่ผมเลือกมาเพื่อให้เราเห็นว่า การลงทุนที่ดีที่สุดไม่จำเป็นต้องทำกำไรมากที่สุด และทำไมต้อง Rebalanced Portfolio กันครับ ก่อนอื่นดึง library ที่ต้องใช้มาก่อน ก็ตัวเดิมๆทั้งนั้น ดึงข้อมูลหุ้น สองตัว Google และ 3M อันนี้เราจะเลือกสุ่มๆนะครับ และเพื่อความเรียบง่าย ผมจะใช้แค่หุ้น 2 ตัวในพอร์ตเป็นตัวอย่าง เราจะสมมุติว่าการถือหุ้นสองตัวนี้จะแบบ equal weight จะดีกับ risk profile ก็แล้วกันครับ หา return ของหุ้นทั้ง 2…
Category: Algorithmic Trading
จัดการข้อมูลอย่าง Quants [Part2: จัดการ Missing Value และ คำนวณ Statistics สำหรับข้อมูลทั้งตลาด]
บทความชุดนี้เราจะมาเอาใจสายลงทุนกัน ด้วยบทความชุด “จัดการข้อมูลอย่าง Quants” ซึ่งจะประกอบไปด้วย 3 บทความด้วยกัน ดังนี้ 1.จัดการข้อมูลอย่าง Quants [Part 1: ดึงข้อมูลหุ้น S&P500 ทั้ง 500 ตัว] 2. หลากหลายวิธีกับการจัดการกับ “Missing Value” 3. จัดการข้อมูลอย่าง Quant [Part2: จัดการ Missing Value และ คำนวณ Statistics สำหรับข้อมูลทั้งตลาด บทความทั้งหมดจะเป็น Tutorial สำหรับผู้ที่สนใจการดึงข้อมูลหุ้นเพื่อการลงทุนแบบไม่เสียค่าใช้จ่าย! อ่านไปด้วย Coding ไปด้วยได้เลยครับ บทความที่ 3 นี้ นี้เป็นตัวต่อจากบทความที่แล้ว ฉะนั้นเราคาดหวังว่าผู้อ่านจะมีไฟล์ “sp500_data.xlsx” ที่เราทำกันมาในบทความที่ 1 กันแล้วนะครับ ถ้าท่านใดยังไม่มีไฟล์ สามารถอ่านวิธีการจัดการดาวน์โหลดข้อมูล และสร้างไฟล์ได้ที่ บทความที่ 1 “จัดการข้อมูลอย่าง Quants [Part…
จัดการข้อมูลอย่าง Quants [Part 1: ดึงข้อมูลหุ้น S&P500 ทั้ง 500 ตัว!]
บทความชุดนี้เราจะมาเอาใจสายลงทุนกัน ด้วยบทความชุด “จัดการข้อมูลอย่าง Quants” ซึ่งจะประกอบไปด้วย 3 บทความด้วยกัน ดังนี้ บทความทั้งหมดจะเป็น Tutorial สำหรับผู้ที่สนใจการดึงข้อมูลหุ้นเพื่อการลงทุนแบบไม่เสียค่าใช้จ่าย! ซึ่งจะสอนตั้งแต่การหาข้อมูล การเขียนโปรแกรมทุกขั้นตอนจนกระทั่งได้ข้อมูล .CSV พร้อมใช้งาน ไม่เพียงแค่นี้ นอกจากสอนดึงข้อมูลแล้ว เรายังสอนการจัดการกับข้อมูลเบื้องต้น การทำความสะอาดข้อมูล (Data Cleaning) เพื่อเตรียมข้อมูลให้พร้อมสำหรับการวิเคราะห์ในขั้นตอนต่อไปอีกด้วย ไปเริ่มกันเลยครับ อ่านไปด้วย Coding ไปด้วยได้เลยครับ ดึงข้อมูลหุ้นทั้ง 500 ตัวจาก S&P500 Import ไลบารี่ที่จำเป็นกันก่อน เริ่มด้วยไปที่ Wikipedia ที่ List รายชื่อหุ้นในกลุ่ม S&P500 ไว้ทั้งหมด เราใช้ฟังก์ชั่น pd.read_html เพื่ออ่านหน้าเพจจากเว็ปไซต์ https://en.wikipedia.org/wiki/List_of_S%26P_500_companies เราจะได้ list ที่ใส่ ข้อมูลในเว็ปไซต์หลายตัว แต่เราสนใจเฉพาะตารางที่บรรจุชื่อ ที่ตารางแรกเราสนใจ columns ที่ชื่อ Symbol ที่จะให้ชื่อของหุ้นทุกตัว จากนั้นเราทำด้านบนให้เป็นฟังก์ชั่น เรียกใช้ฟังก์ชั่นเก็บชื่อหุ้นใส่ตัวแปรชื่อ…
รายละเอียดคอร์ส AI for Investment: from AI to Fundamental Investing
คอร์สนี้เป็นคอร์ส “ประยุกต์ใช้ศาสตร์ Artificial Intelligence ในการลงทุน” ภายในคอร์ส เราจะเขียนโปรแกรมที่สามารถ “เลือกหุ้น” ที่จะลงทุนในระยาว ตั้งแต่ 1 ปีขึ้นไป โดยการใช้เทคนิค Machine learning เพื่อคัดแยกหุ้นที่น่าลงทุนมาให้เรา เป้าหมายของคอร์ส สร้างโปรเจคเพื่อ“คัดแยกหุ้นที่น่าสนใจด้วย Machine Learning” เราจะพาทุกท่านมาสร้าง ตะแกรงร่อนหุ้น เพื่อเฟ้นหาหุ้นที่น่าสนใจท่ามกลางหุ้นนับพันตัว!!! รายละเอียดหัวข้อต่างๆ ที่เราจะได้เรียนรู้จากการเรียนคอร์สนี้ เรียนรู้วิธีการหาข้อมูลหุ้น ข้อมูลงบการเงิน ประเภทข้อมูล ข้อมูลสูงระดับล้านแถว เรียนรู้วิธีการจัดการข้อมูลงบการเงิน และการสร้าง Financial Feature ที่ส่งผลต่อการทำนายด้วย โมเดล Machine Learning การทำความสะอาดข้อมูล (Data Cleaning) เพื่อเตรียมพร้อมสำหรับการสร้างโมเดล AI ความรู้เบื้องต้นเกี่ยวกับ Machine Learning เช่น การแบ่งข้อมูล Train-Test Set ปัญหา Overfittingการหาจุดสมดุลของโมเดล (Bias Variance Tradeoff) Machine…
จากต้นไม้แห่งการตัดสินใจ (Decision tree) สู่ ต้นไม้เพื่อการลงทุน (Investing tree)
บทความนี้ เราจะมาทำความรู้จักกับ Machine Learning algorithm ที่มีชื่อว่า “Decision Tree” กัน ถึงแม้จะเป็น Algorithm ที่ไม่ซับซ้อน แต่ก็นับว่ามีประสิทธิภาพ และเป็นพื้นฐานที่สำคัญของ Algorithm ที่รู้จักกันดี อย่าง “Random Forest” เป็นเป็น Algorithm ที่มีประสิทธิภาพมากๆ และสามารถประยุกต์ใช้งานได้อย่างหลากหลาย อีกทั้งเป็นหนึ่งอ Algorithm ที่ AlgoAddict เลือกนำมาสอนอย่างละเอียดในคอร์ส “AI เพื่อการลองทุน” จึงนับเป็นอีกหนึ่ง Algorithm ที่ควรจะทำความรู้จัก ต้นไม้ตัดสินใจ หรือ Decision Tree เป็นอีกหนึ่งอัลกอริทึ่มของ Machine Learning ประเภท มีผู้สอน (Supervised Learning) ที่มีข้อดีหลักๆ อยู่ 4 ข้อคือ สร้างได้ง่าย ใช้งานได้ง่าย แปลผลได้ง่าย สามารถใช้ได้กับทั้งปัญหาแบบ Classification และ Regression…
มาลองใช้ Random Forest ช่วยในการลงทุนกันดีกว่า
บทความนี้ เราจะมาลองใช้ Machine Learning ตัวที่ขึ้นชื่อว่าดีมากอีกตัวหนึ่งคือ Random Forest มาช่วยในการทำนายการเปลี่ยนแปลงของราคาหุ้นกัน ระหว่างที่เรากำลังจัดทำเนื้อหาคอร์สใหม่ ที่ปัจจุบันเสร็จไปแล้วกำลังอยู่ในขั้นตอนการอัดวีดีโอนะครับ และในคอร์สนั้นเราก็มีการใช้ Random Forest ในการทำนายราคาหลักทรัพย์เช่นกัน วันนี้เราเลยเอามาแปะให้เห็นภาพแบบคร่าวๆก่อนนะครับ (เนื้อหาในคอร์สลึกว่านี้เยอะมาก) ทำไมต้อง Random Forest Random Forest เป็นอีกหนึ่งอัลกอริทึ่มที่ได้รับการยอมรับกันอย่างแพร่หลาย และทำผลงานได้ค่อนข้างดี ในขณะที่ตัวโมเดลเองก็ไม่ได้ซับซ้อนจนเกินไป Random Forest เป็นอัลกอริทึ่มที่พัฒนาต่อยอดจากอัลกอริทึ่มพื้นฐานอย่าง Decision Tree ที่มีการใช้ต้นไม้ในการตัดสินใจ โดยในการสร้างต้นไม้ที่ใช้ในการตัดสินใจขึ้นนั้น จะอาศัยหลักการสร้างกฏสำหรับการแบ่งต้นไม้ออกเป็นกิ่งๆ และจัดให้ข้อมูลที่มีเงื่อนไขตรงตามที่กำหนดถูกจัดอยู่ในใบของแต่ละกิ่งที่ได้รับการแบ่งข้างต้น Decision Tree ถือเป็นอัลกอริทึ่มที่พยายามจัดการกับข้อมูลด้วยการสร้างต้นไม้เพียงแต่ 1 ต้น เท่านั้น ทำไม่ยังไม่สามารถจัดการกับข้อมูลที่ซับซ้อนได้อย่างมีประสิทธิภาพ ดังนั้น จึงมีการคิดค้นอัลกอริทึ่มที่ประกอบไปด้วยต้นไม้มากกว่า 1 ต้นในการตัดสินใจ คือ Random Forest หรือ “ป่า” ที่ใช้ในการตัดสินใจ ขึ้นมา ซึ่งในการทำงานของ Random Forest นี้…
การทำ Recursive Feature Section ง่ายๆ ใน Python Sklearn ที่ช่วยให้การเขียนโค้ดเลือก Feature ไม่ยุ่งยากอีกต่อไป [แจก Source Code]
อะไรคือ Feature Section? Feature Selection แปลเป็นไทยได้ตรงตัวเลยก็คือ “การเลือกฟีเจอร์” หรือ การเลือกคุณลักษณะของข้อมูลที่เหมาะสมสำหรับการทำงานของ Machine Learning ถ้าพูดให้ง่ายขึ้นอีกก็คือ เลือกว่าคอลัมน์ไหนในตัวข้อมูลที่เราจะเลือกใช้งานนั่นเอง จากบทความที่แล้ว ในเรื่อง “พอกันทีกับความผิดพลาดเดิมๆ ด้วยการสร้างโมเดล Machine Learning ด้วยฟีเจอร์ทั้งหมดที่มี!“ จากบทความที่แล้ว ผู้อ่านก็จะเห็นแล้วว่าการโยนฟีเจอร์ทั้งหมดเข้าไปทำงานทันทีโดยไม่ผ่านกระบวนการใดๆ เลย สามารถก่อให้เกิดปัญหาใหญ่ๆได้หลายอย่าง ดังนั้น ในบทความนี้ เราจึงขอนำเสนอหนึ่งในวิธีการพื้นฐานที่ใช้สำหรับการเลือกฟีเจอร์ที่มีชื่อว่า “Recursive Feature Selection” ซึ่งเป็นวิธีการที่ไม่ซับ สามารถนำมาประยุกต์ใช้ในการเลือกฟีเจอร์สำหรับมือใหม่ได้อย่างไม่ยากค่ะ ทำให้สามารถหลีกเลี่ยงปัญหาที่อาจจะเกิดขึ้นได้จากการมีฟีเจอร์ที่มากเกินไปได้ระดับหนึ่งค่ะ Recursive Feature Selection “Recursive Feature Selection” เป็น โมดูลนึงที่ Sklearn เตรียมเอาไว้ให้ผู้ใช้ที่ต้องการทำ Machine Learning ด้วย Python ได้เรียกใช้เพื่อการกำหนดการเลือกฟีเจอร์ที่จะนำมาใช้งานได้อย่างไม่ยาก โมดูนี้มีหลักการทำงานที่ง่ายๆ คือ การวนลูปเลือกฟีเจอร์ หรือกลุ่มของฟีเจอร์ แล้วทำการทดสอบการสร้างโมเดลด้วย Machine Learning…
พอกันทีกับความผิดพลาดเดิมๆ ด้วยการสร้างโมเดล Machine Learning ด้วยฟีเจอร์ทั้งหมดที่มี!
จริงอยู่ที่มีโลกแห่งความเป็นจริงในปัจจุบัน ข้อมูลนั้นหาได้ง่ายมาก เมื่อเราสนใจเรื่องใดเรื่องนึง ก็มักจะมีข้อมูลที่เกี่ยวข้องอยู่นับไม่ถ้วน ส่งผลให้เมื่อเราทำการเก็บข้อมูลเพื่อนำมาใช้ในการสร้างโมเดล Machine Learning ด้าต้าของเราก็จะมีจำนวน คอลัมน์ หรือ ฟิลด์ ที่เกี่ยวข้ออยู่มากมายนั่นเอง การมีคอลัมน์มาก หมายถึง เรามี information ที่ใช้ในการอธิบายข้อมูลมากขึ้น สามารถอธิบายข้อมูลได้ละเอียดขึ้น มีมิติในการมองข้อมูลมากขึ้น ลักษณะแบบนี้ ฟังดูดีกันใช่มั้ยคะ? แต่มันจะดีสำหรับเจ้า Machine Learning ในการเรียนรู้รึเปล่า? ตอบได้เลยว่า “ไม่ดี” ค่ะ การมีฟีเจอร์เยอะแยะมากมาย มีโอกาสเกิดการซ้ำซ้อนกันได้สูง (Redundant Features) หรือ ฟีเจอร์บางตัวแทบจะไม่มีความสัมพันธ์ (Irrelevant Features) กับสิ่งที่เราทำนายเลยด้วยซ้ำ เจ้าความซ้ำซ้อน และ ความไม่เกี่ยวข้อง ตัวนี้เอง ที่ก่อให้เกิดผลเสียต่อการเรียนรู้ของโมเดล Machine Learning โดยเฉพาะอย่างยิ่ง ในกรณีที่จำนวนข้อมูลมีจำกัด (มีจำนวนแถวข้อมูลน้อย ในขณะที่มีจำนวนคอลัมน์เยอะ) ดังนั้น ในการสร้างโมเดล Machine Learning นั้น เราไม่นิยมโยนฟีเจอร์ที่มีอยู่ทั้งหมดมาใช้งานตู้มเดียวเลย เนื่องด้วย…
โมเดลไหนเหมาะกับการลงทุนที่สุด? ต้องใช้โมเดลที่ซับซ้อนขนาดไหนถึงจะมีประสิทธิภาพเพียงพอ? โมเดลยิ่งยากยิ่งดีจริงหรือไม่?
พักหลังมานี้ผมได้รับคำถามหลังไมค์มาค่อนข้างบ่อย ว่าโมเดลไหนกันแน่ที่ลงทุนได้ผลดีที่สุด ผมจะสอนถึงไป deep learning หรือเปล่า คำตอบคือทำแน่ครับ แต่มันเป็นควรจะแยกไว้ต่างหากอีกเรื่องหนึงเลย แต่เอาเถอะ มาที่คำถามกันว่าโมเดลไหนดีที่สุดกันก่อน ในความคิดของผมอันที่จริง ปัญหานี้นับเป็นปัญหาของมือใหม่อย่างหนึ่งครับ คือความคิดที่เป็น myth ที่ว่า machine learning model ยิ่งลึกซึ้ง ยิ่งซับซ้อนมากๆ จะยิ่งดี ความคิดที่ว่า โมเดลพื้นฐานอย่าง linear หรือ logistic regression เป็นโมเดลที่แย่ เพราะง่ายเกินไป! ถ้าเพิ่มความละเอียดไปเป็น support vector machine มันก็จะยิ่งได้ผลลัพธ์ที่ดียิ่งขึ้น หรือ เพิ่มรายละเอียดไปถึงโมเดลที่ลึกซึ่งมากขึ้นอย่างโมเดลที่โด่งดังในช่วง 4 -5 ปีมานี้่อย่าง neural network deep learning ก็จะยิ่งดีขึ้นไปอีก โมเดลยิ่งซับซ้อนยิ่งดีจริงหรือเปล่า? คำตอบของผมคือ ไม่ครับ ไม่จริงซะทีเดียว ML หลายๆโมเดลมันก็เป็นแค่การแก้ปัญหาเชิง geometric เท่านั้น แล้วโมเดลไหนเหมาะกับปัญหาของเราทีสุด? คำตอบสั้นๆ ก็คือ…
Backtesting Part3: Adjusting entry exit prices
หลังจากเพิ่มเติม stoploss ไปแล้ว เราจะมาเพิ่มรายละเอียดกับการ Backtest กับอีกซักหน่อยหนึง จากบทความที่แล้ว ยังมีความไม่สมจริงอยู่บางอย่างคือ การคิดกำไรเมื่อตอนเราเปิดสัญญา Long หรือ Short การคิดคำนวณแบบนี้มันคงไม่มีปัญหาอะไรถ้าเราจริงๆ ถ้าเรามีสัญญา Long อยู่ หุ้นขึ้นจาก 10 บาท ไป 12 บาทเราก็ควรจะได้กำไร (12/10)-1 = 0.2 หรือคิดเป็นกำไร 20% อยู่แล้วถ้าเรามีหุ้นตัวนั้นอยู่ใน Portfolio ของเรา แต่มันยังมีเคสความไม่สมจริงอยู่ คือในกรณีที่เราเข้าซื้อวันแรก สมมุติว่า เรามีสัญญาณซื้อวันที่ 5มกราคม เราก็จะต้องไปซื้อหุ้นเข้าพอร์ตนะวันที่ 6 หรือวันถัดมานั่นเอง ถ้าราคาหุ้น วันที่ 5 ปิดที่ 10 บาท ราคาเปิดของวันที่ 6 เปิดที่ 11 บาท และไปปิดที่ 12 บาท ในกรณีนี้ การคำนวณโดยใช้ (ราคาปิดเมื่อวาน/ราคาปิดวันนี้)-1…
Backtesting Part2: Adding Stoploss
หลังจากเราทำ backtest แบบง่ายๆไปกันแล้ว เรามาลองเพิ่มรายละเอียดให้กับมันโดยใช้การหยุดการขาดทุน หรือ Stoploss กันดีกว่าครับ เราจะใช้ Technical Analysis indicator ซักตัวหนึงมาใช้เพื่อรักษาระดับกำไรของเราไว้ ในบทความนี้ก็ยังคงพื้นๆอยู่ครับ แต่หลังจากโพสนี้ ยังมีรายละเอียดเกี่ยวการ backtest อีกหลายอย่าง เช่น ความสมจริงของราคาซื้อ-ขาย การเก็บ log วันที่ซื้อ-ขาย หรือปัญหาทาง assumption ทางคณิตศาสตร์ของการ backtest (รวม vectorize ด้วย) ที่เราจะมาพูดคุยและค่อยๆประกอบมันกันครับ เราจะใช้อินดิเคเตอร์ชื่อดังอย่าง Average True Range (ATR) มาช่วยในการรักษาระดับกำไรของเรา อินดิเคเตอร์ตัวนี้ถูกคิดค้นโดยคุณ J. Welles Wilder Jr. ที่เปิดตัวในหนังสือในตำนานทางเทคนิคคอลชื่อ New Concepts in Technical Trading Systems คุณคนนี้เค้ายังคิดค้นเทคนิคอลอินดิเคเตอร์ที่เรารู้จักกันดี และยังใช้กันอยู่ในทุกวันนี้อีกหลายตัวด้วยกัน เช่น Relative strength index(RSI), Average…
Backtesting Part1: อย่างง่าย แบบ Non-vectorization ฉบับจับมือทำ [แจกโค้ด]
อย่างที่เรารู้กันมาว่าการเขียนโปรแกรม Python ให้ดีคือการหลีกเลี่ยงการใช้ foor loop ที่อาจจะส่งผลให้โปรแกรมทำงานได้ช้าลง เราจะนำไป Optimization ก็อาจจะทำให้ใช้เวลามากเกินจำเป็น แต่บางครั้งก็มีความจำเป็นที่จะต้องทำแบบ Non-Vectorization บ้างเหมือนกัน บทความนี้ขอชวนทุกท่านมาทดลองทำ Backtesting ด้วยตัวเองแบบง่ายๆ กันครับ โดยบทความชุดนี้จะเป็นบทความชุด ในบทความแรกนี้จะไม่มีรายละเอียดมากนัก แต่จะทำเป็น Building blog ให้เราค่อยๆเพิ่มเติมรายละเอียดให้กับการเขียน Backtest เพิ่มเติมต่อไปครับ ทำเองใช้เอง ไม่ต้องง้อใคร เพื่อทดสอบสมมุติฐานของเราในเบื้องต้น มือใหม่ก็เข้าใจได้ แถมแจกโค้ดไปรันกันเองให้หนำใจไปเลย ใครที่เพิ่งเริ่มต้นศึกษา ยิ่งได้ทดลองทำด้วยตัวเอง ก็จะช่วยให้เข้าใจหลักการของการทำ Backtest มากขึ้นไปอีกครับ เกริ่นนำกันมาพาพอสมควรแล้ว อย่าเสียเวลาเลยครับ เรามาเริ่มต้นทำกันดีกว่า กับ Backtesting ฉบับจับมือทำ Step 1: Import Libraries ที่จำเป็น ก่อนอื่นเรามาเริ่มต้นด้วยการ Import ไลบรารี่ที่จำเป็นกันก่อน ในที่นี้เราจะ 4 ไลบรารี่ด้วยกัน ดังนี้ Step 2: ดึงข้อมูลหุ้นจาก…