มาถึงตรงนี้คุณก็จะมีพื้นฐานการ Optimization แล้ว ไอเดียฝั่งการเงินว่าผลตอบแทนคือ mean ของข้อมูล ความเสี่ยงคือ variance ของข้อมูลก็พร้อมแล้วเหมือนกัน ก็คงถึงเวลาประกบทั้ง 2 อย่างเข้าด้วยกัน เป็นการใช้งานจริงแล้วล่ะ
โพสต์นี้จะเล่าไอเดียจาก colab ด้านล่างนะ (อ่านจบแล้วถ้าอยากเข้าใจต้องไปเปิดโค้ดอ่านต่อนะครับ เอาเข้าจริงเราได้อธิบายไอเดียที่ใช้ในโค้ดไปเกือบหมดแล้ว จะมีก็เรื่องการ implement โค้ดนี่แหละ)
colab รวบรวม/จัดทำโดย อาจารย์อุดมศักดิ์ รักวงษ์วาน และคุณกฤติพัฒน์ กฤตาคม
โดยถ้าลืม ๆ ไปแล้ว สามารถกลับไปศึกษา part ก่อน ๆ ได้ที่ด้านล่าง
1.) Introduction to Portfolio Optimization - ต่อให้ Optimize แล้ว Port จะดีไม่ดีก็ขึ้นอยู่กับ View ของเราเอง
2.) วิธีแก้ปัญหา Optimization บน Python ด้วย CVXPY
3.) โจทย์ปัญหา การแก้ปัญหา Optimization ด้วย CVXPY
แต่ถ้าผมต้องรีแคป colab ที่แนบมาแบบสั้น ๆ ง่าย ๆ ผมจะสรุปว่า ตอนแรกเราก็ดูดข้อมูลจาก yahoo เข้ามาก่อน จะเอาช่วงเวลาตั้งแต่เท่าไหนถึงเท่าไหนก็ว่าไป หุ้นตัวไหนบ้างก็ว่าไป ต่อมาก็กรองข้อมูลพวกนั้นให้เหลือแต่ closing price
ละทีนี้เราก็จะเริ่มเล่นกับ closing price แล้ว ก็เอาไปแปลงเป็น mean ของ log return, covariance matrix แต่คือข้อมูล 2 อย่างนี้มันเป็นต่อวัน เราก็คูณ 30 เข้าไปให้กลายเป็นต่อเดือน (โดยมี disclaimer อย่างนึงว่าถ้าเราคูณขึ้นไปให้มันเพิ่มขึ้นแบบ linear ตรง ๆ แบบนี้ นั่นคือเรากำลังเดาว่าข้อมูลนี้มีการกระจายแบบ normal นะ)
ต่อมาก็เอาตัวแปรที่มีไปแก้ปัญหา optimization (ในเคสนี้คือการโยกว่าหุ้นแต่ละตัวมีจะให้มี weight ของตนเองว่าจะลงเท่าไหร่ มีผลตอบแทนมากกว่าเท่ากับเท่าไหร่ ถึงจะเสี่ยงน้อยที่สุดได้) พอกด enter ปึ้ง เราก็จะได้ผลกลับมาเป็น weight ที่เราต้องลง ซึ่ง optimize อยู่บน view ของเรา (ถ้า view เรามันมั่ว งาน optimize อันนั้นก็โดนขยายให้มั่วยิ่งกว่า ถ้า view เราใช้ได้ มันก็ optimize อยู่บนความใช้ได้อันนั้น)
โอเค ตั้งแต่ขั้นถัดไปจะเป็นสิ่งที่เราไม่เคยคุยกันมาก่อน คือการ run simulation เพื่อดูว่าถ้าเราลงทุนตามที่ผลการ optimize บอกให้เราลงแล้ว ผลที่ได้มันจะเป็นประมาณไหน
โดยข้อมูลดิบที่ใช้กับการ sim นี้ คือ mean, covariance matrix (คิดภาพว่า mean เป็นค่าเฉลี่ยอยู่ตรงกลางกราฟ และ covariance matrix คือตัวที่ทำให้ฐานกราฟมันกว้างขึ้น) โดยเรา sim ให้มัน run ไปแสนครั้ง และผลที่ได้กลับมาก็คือใน 1 แสนกรณีนั้น port ที่เรา optimize มามี performance เป็นยังไงบ้าง
หลังจากนั้นใน colab ก็ลองกลับไปโยกเปลี่ยนค่า (ให้ return ขั้นต่ำที่ได้มีค่าเยอะขึ้น) ตอนกำลังทำ optimization แล้วลองทำต่อมาจนถึงแบบย่อหน้าที่แล้ว แล้วเอาอันนี้เป็นกรณีที่ 2 เปรียบเทียบกับกรณีแรก ได้เป็นกราฟ normal สีส้มกับสีฟ้า ตามลำดับ
โดยอยากให้สังเกตว่ากราฟสีส้มที่เราพยายามปรับให้ return มันเยอะขึ้น จะมี risk มากกว่า (กราฟฐานกว้างกว่า) ซึ่งก็ตรงตามไอเดียที่ว่า return กับ risk มันเป็นเหรียญคนละด้านของเรื่องเดียวกันเลย และจะเห็นว่ากราฟสีส้มมันเตี้ยกว่าด้วย ซึ่งก็เพราะจำนวนครั้งที่สุ่มมันก็แสนครั้งเท่า ๆ กัน แต่กราฟมันต้องกว้างขึ้นนั่นเอง ก็เลยเป็นแบบนั้น
สุดท้ายก็จะเป็นเรื่อง efficient frontier ซึ่งจริง ๆ จะเห็นว่าใน colab เหมือนเป็นกราฟสรุปสำหรับ portfolio ทุกอันที่เป็นไปได้ คือเอามา vary ให้ดูว่าถ้าเราตั้ง required return เป็น constraint เท่านี้ แล้วเราจะได้ minimum sd กลับมาเท่าไหร่ ก็คือเหมือนทำเพื่อให้เห็นภาพรวมของการทำ portfolio optimization นั่นเอง (จะเห็นว่าช่วงท้ายของ colab ก็จะเป็นการเปรียบเทียบพล็อต required return - minimum sd ระหว่าง short กับ long)
ถ้าอ่านมาถึงตรงนี้แล้วยังไม่ได้กดเข้าไปอ่านโค้ด อย่าลืมกดเข้าไปดูกันนะครับบ
Comments