การลงทุนด้วยปัจจัยได้รับความนิยมอย่างมากในด้านการจัดการพอร์ตโฟลิโอสมัยใหม่ เพราะเป็นแนวทางการลงทุนอย่างเป็นระบบที่เน้นปัจจัยเสี่ยงหรือลักษณะการลงทุนเฉพาะ เช่น มูลค่า ขนาด โมเมนตัม และคุณภาพ เพื่อสร้างพอร์ตการลงทุน ความเติบโตของแมชชีนเลิร์นนิงในการลงทุนด้านปัจจัยมีที่มาที่จุดบรรจบของการพัฒนาที่เอื้ออำนวย 3 ประการ ได้แก่ ความพร้อมใช้งานของข้อมูล ความสามารถในการคำนวณ และพื้นฐานทางเศรษฐกิจ ในบทความชุดนี้เราจะพาทุกท่านเรียนรู้การประยุกต์ใช้ ML ในกรอบการลงทุนเชิงปัจจัยหรือ Factor Investing กัน
Factor investing และ asset pricing anomalies
การลงทุนเชิงปัจจัยหรือ Factor investing ได้รับความนิยมอย่างมากในด้านการจัดการพอร์ตโฟลิโอสมัยใหม่ หมายถึงแนวทางการลงทุนอย่างเป็นระบบที่เน้นปัจจัยเสี่ยงหรือลักษณะการลงทุนเฉพาะ เช่น มูลค่า ขนาด โมเมนตัม และคุณภาพ เพื่อสร้างพอร์ตการลงทุน เชื่อกันว่าปัจจัยเหล่านี้แสดงค่าพรีเมียที่มีความเสี่ยงแบบถาวรในอดีต ซึ่งสามารถใช้ประโยชน์เพื่อให้ได้ผลตอบแทนที่ปรับตามความเสี่ยงได้ดีขึ้น
รากฐานทางประวัติศาสตร์ของการลงทุนเชิงปัจจัยสามารถย้อนกลับไปได้หลายทศวรรษที่ผ่านมา ในช่วงทศวรรษที่ 1960 นักวิชาการรุ่นบุกเบิกอย่าง Eugene F. Fama และ Kenneth R. French ได้ทำการวิจัยที่ก้าวล้ำซึ่งเป็นรากฐานสำหรับการลงทุนด้านปัจจัยสมัยใหม่ พวกเขาระบุปัจจัยเสี่ยงเฉพาะที่สามารถอธิบายความผันแปรของผลตอบแทนของหุ้นได้ เช่น ปัจจัยด้านมูลค่า (หุ้นที่มีอัตราส่วนราคาต่อบัญชีต่ำมักจะมีประสิทธิภาพดีกว่า) ปัจจัยด้านขนาด (หุ้นขนาดเล็กมักจะมีประสิทธิภาพดีกว่าหุ้นขนาดใหญ่) และปัจจัยด้านโมเมนตัม (หุ้นที่มีแนวโน้มราคาเป็นบวกเมื่อเร็วๆ นี้มักจะทำผลงานได้ดีกว่า)
ด้วยการรวมกลยุทธ์ที่อิงตามปัจจัยเข้ากับพอร์ตการลงทุน นักลงทุนสามารถตั้งเป้าที่จะบรรลุการกระจายความเสี่ยงที่เพิ่มขึ้น ผลตอบแทนที่ปรับตามความเสี่ยงที่ดีขึ้น และการจัดการความเสี่ยงที่ดีขึ้น การลงทุนด้วยปัจจัยเป็นอีกทางเลือกหนึ่งสำหรับกลยุทธ์การถ่วงน้ำหนักตามราคาตลาดแบบดั้งเดิม ช่วยให้นักลงทุนมีโอกาสได้รับผลตอบแทนส่วนเกินโดยมุ่งเน้นไปที่ปัจจัยเสี่ยงเฉพาะที่แสดงให้เห็นถึงประสิทธิภาพในอดีต
สาเหตุหลักที่ทำให้การลงทุนแบบ Factor Investing เป็นที่นิยมนั้นอาจเป็นเพราะว่าการลงทุนแบบ Factor Investing สามารถอธิบายได้ง่าย และมีประสิทธิภาพในการบริหารการลงทุน
การสร้างแบบจำลองเชิงปปัจจัยไม่ใช่เรื่องยากหรือแม้เเต่การใช้จาก Provider ต่าง ๆ อาทิเช่น MSCI แต่ความยากของงานการลงทุนเชิงปัจจัยคือการพยายามหาปัจจัยที่สามารถให้ผลตอบแทนชนะตลาด หรือแม้กระทั้งการระบุปัจจัยที่เหมาะสมกับสภาวะตลาด เพื่อให้เข้าใจสิ่งนี้เราจะไปลองทำพร้อมกันด้วย Python กันเลย
Factor investing with Python
เราจะใช้ชุดข้อมูล “200+ Financial Indicators of US stocks (2014–2018)” จาก Kaggle เพื่อแยกแยะรูปแบบและความแตกต่างระหว่างหุ้นที่มีประสิทธิภาพดีเมื่อเทียบกับหุ้นที่ไม่มีประสิทธิภาพ โดยใช้ประโยชน์จากความรู้ที่ได้รับจากการวิเคราะห์นี้ แบบจำลองสามารถทำนายว่าหุ้นใดมีแนวโน้มที่จะมีกำไรจากการลงทุน อย่างไรก็ตามบทความนี้เป็นเพียงจุดเริ่มต้น และแม้ว่ามันอาจจะไม่สมบูรณ์แบบ
Import Data
ผมเขียน code ไว้ในnotebook แล้ว คุณสามารถทำตามได้ สิ่งแรกที่เราจะทำคือนำเข้าข้อมูล ฉันได้ดาวน์โหลดข้อมูลและบันทึกไว้ใน Google ไดรฟ์
!gdown --id 10asORoUJ1Sj07bNNbVVWqPAxQhqsVEXw
!gdown --id 1nJAE7FJeV9cZZiqjpXEawhK41xdkFybb
!gdown --id 1WvpO8OmgFPG-aLM-iDZJ5A6O73u2Lo-b
!gdown --id 1AiRax6xFAq3zTm625xY5Kx91bbRvx-kO
!gdown --id 1we3vPt1ldoR5CksuaiIvEhf4_xdnTkKh
df_2014 = pd.read_csv("2014_Financial_Data.csv")
df_2015 = pd.read_csv("2015_Financial_Data.csv")
df_2016 = pd.read_csv("2016_Financial_Data.csv")
df_2017 = pd.read_csv("2017_Financial_Data.csv")
df_2018 = pd.read_csv("2018_Financial_Data.csv")
Prepare data & Exploration analysis
การทำความเข้าใจข้อมูลเป็นขั้นตอนสำคัญในกระบวนการแมชชีนเลิร์นนิง ไม่แนะนำให้ป้อนข้อมูลลงในแบบจำลองโดยปราศจากความเข้าใจที่ถูกต้องเกี่ยวกับคุณลักษณะ คุณภาพ และความเกี่ยวข้องกับปัญหาที่มีอยู่ จำเป็นอย่างยิ่งที่จะต้องวิเคราะห์ข้อมูลอย่างถี่ถ้วนและเข้าถึงข้อมูลนั้นด้วยกรอบความคิดที่เฉียบแหลม
ในฐานะผู้ปฏิบัติงานที่รับผิดชอบด้านแมชชีนเลิร์นนิง เราต้องใช้วิธีการวิเคราะห์ข้อมูลอย่างพิถีพิถัน ซึ่งรวมถึงการประมวลผลข้อมูลล่วงหน้าเพื่อจัดการกับค่าที่ขาดหายไป ปรับข้อมูลให้เป็นมาตรฐาน และระบุค่าที่ผิดปกติ เทคนิคการวิเคราะห์ข้อมูลเชิงสำรวจ (EDA) ยังสามารถให้ข้อมูลเชิงลึกที่มีค่าและช่วยเปิดเผยรูปแบบภายในข้อมูล
เราใช้ฟังก์ชัน describe() เพื่ออธิบายข้อมูล
df_2014.describe()
แน่นอนว่ามีตัวแปรมากมาย และการทำความเข้าใจข้อมูลอาจไม่ใช่เรื่องง่าย นอกจากนี้ ข้อมูลบางอย่างมีมาตราส่วนที่แตกต่างกัน การใช้ตัวแปรเลยไม่ใช่ความคิดที่ดี เราจะกลับมาที่สิ่งนี้ในภายหลัง ตอนนี้เราจะดูที่ตัวแปรเป้าหมาย (ราคา VAR [%])
fig = plt.figure(figsize =(10, 7))
# Creating plot
plt.boxplot(data)
เราจะเห็นว่าข้อมูลมีค่า Outlier ผมแนะนำให้เราตัดค่าผิดปกติออก
df_no_outliers = df[df["PRICE VAR [%]"] > df["PRICE VAR [%]"].quantile(.05) ] & df[df["PRICE VAR [%]"] < df["PRICE VAR [%]"].quantile(.95) ]
นอกจากวิธีนี้แล้ว เรายังสามารถแทนค่าที่เกินขีดจำกัดที่เรากำหนดเป็นค่าในขีดจำกัดของเราได้อีกด้วย
ในขั้นตอนถัดไป เราต้องการรวมข้อมูลในช่วงหลายปี โดยใช้ตัวแปรเป็นผลตอบแทน โดยไม่สนใจผลกระทบของตลาด เราต้องลบผลตอบแทนของตลาดออกก่อน ซึ่งโดยทั่วไปเราใช้ผลตอบแทนของดัชนี แต่ที่นี่เราไม่มีผลตอบแทน ดังนั้นเราอาจใช้ค่ามัธยฐาน (Mean/mod) แทน
df_2014["Alpha"] = df_2014["2015 PRICE VAR [%]"] - df_2014["2015 PRICE VAR [%]"].mean()
df_2015["Alpha"] = df_2015["2016 PRICE VAR [%]"] - df_2015["2016 PRICE VAR [%]"].mean()
df_2016["Alpha"] = df_2016["2017 PRICE VAR [%]"] - df_2016["2017 PRICE VAR [%]"].mean()
df_2017["Alpha"] = df_2017["2018 PRICE VAR [%]"] - df_2017["2018 PRICE VAR [%]"].mean()
df_2018["Alpha"] = df_2018["2019 PRICE VAR [%]"] - df_2018["2019 PRICE VAR [%]"].mean()The next step we
df_all = pd.concat([df_2014, df_2015, df_2016, df_2017, df_2018], axis=0)
เรามีทั้งหมด 230 คอลัมน์ มันคงบ้าไปแล้วถ้าเราจะนั่งดูทีละตัวแปรเลยต้องตัดบางตัวแปรออกไปก่อน เราจะจัดการกับข้อมูล na และปล่อย na ให้มากขึ้น
data_info = pd.set_option('display.max_columns', None)
data_info=pd.DataFrame(df_all.dtypes).T.rename(index={0:'column type'})
data_info=data_info.append(pd.DataFrame(df_all.isnull().sum()).T.rename(index={0:'null values (nb)'}))
data_info=data_info.append(pd.DataFrame(df_all.isnull().sum()/df_all.shape[0]*100).T.
rename(index={0:'null values (%)'}))
display(data_info)
เราจะลบตัวแปรที่มี na มากกว่า 2,500
nas_by_feature = df_all.isnull().sum(axis=0)
features_to_drop = nas_by_feature[nas_by_feature>2500].index
df_all.drop(features_to_drop, axis=1, inplace=True)
Look for Correlation
ณ จุดนี้ เราอาจสร้างตัวแปรเพิ่มเติมมากมาย เช่น การจัดอันดับ ซึ่งใช้กันทั่วไปในการดำเนินการนี้ ปัจจัยการลงทุนแต่จะขอไม่กล่าวถึงในที่นี้
ความสัมพันธ์หมายถึงการวัดทางสถิติของความสัมพันธ์หรือความสัมพันธ์ระหว่างตัวแปรสองตัว บ่งชี้ว่าตัวแปรทั้งสองมีความสัมพันธ์กันอย่างใกล้ชิดเพียงใด ตลอดจนทิศทางและความแข็งแกร่งของความสัมพันธ์
correlation = df_all.corr()
correlation["Alpha"]
correlation["Alpha"].sort_values( ascending=False).head(10)
เราจะมีความสัมพันธ์เชิงบวกกับตัวแปรอัลฟ่า และเราสามารถหาตัวแปรสัมพันธ์เชิงลบได้เช่นกัน
มาถึงจุดนี้เราก็จะเห็นได้ว่า Factor ใดส่งผลต่อค่า alpha ในอดีตหากเราคาดว่า Factor ดังนั้นกล่าวตลาดยังไม่รับรู้ Factor นั้นก็ยังคงให้ alpha ต่อไป
สรุป
เราได้รู้จักการลงทุนเชิงปัจจัยเบื่องต้นรวมถึงการใช้ Python ในงานด้านการลงทุนเชิงปัจจัย ในคราวหน้าเราจะมาต่อยอดด้วย ML กัน
Comments