การหาความผันผวนของพอร์ตการลงทุนด้วย Python

การทำ portfolio optimization ด้วย google colab II

NUTHDANAI WANGPRATHAM
3 min readApr 5, 2020

นอกจากผลตอบแทนแล้วอีกสิ่งหนี่งที่สำคัญในการลงทุนคือความเสี่ยง โดยทั่วไปหากผลตอบแทนเท่ากันนักลงทุนจะเลือกการลงทุนที่มีระดับความเสี่ยงที่ตํ่ากว่า แต่ความเสี่ยงคืออะไรและวัดอย่างไรยังคงเป็นคำถามที่น่าสนใจที่เราจะมาคุยกัน

ความหมายของความเสี่ยง

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

มาตรวัดความเสี่ยง

ในทางการเงินมาตรวัดความเสี่ยงมีหลากหลาย แต่มาตรวัดความเสี่ยงหลักได้แก่

  1. ส่วนเบี่ยงเบนมาตรฐาน ส่วนเบี่ยงเบนมาตรฐานเป็นวิธีการวัดการกระจายข้อมูลที่เกี่ยวข้องกับค่าเฉลี่ยของชุดข้อมูลและให้การวัดเกี่ยวกับความผันผวนของการลงทุน เนื่องจากเกี่ยวข้องกับการลงทุนค่าเบี่ยงเบนมาตรฐานจะวัดว่าผลตอบแทนจากการลงทุนแตกต่างจากผลตอบแทนปกติหรือค่าเฉลี่ยที่คาดหวังมากเพียงใด
  2. R-Squared วัดเปอร์เซ็นต์ของการเคลื่อนไหวของการลงทุนที่เกิดจากการเคลื่อนไหวในดัชนีอ้างอิง ค่า R-squared หมายถึงความสัมพันธ์ระหว่างผลการลงทุนและดัชนีอ้างอิงที่เกี่ยวข้อง ตัวอย่างเช่นค่า R-squared ที่ 95 จะถือว่ามีความสัมพันธ์สูงในขณะที่ค่า R-squared ที่ 50 อาจถือว่าต่ำ
  3. Sharpe Ratio วัดผลตอบแทนตามที่ปรับโดยความเสี่ยงที่เกี่ยวข้อง ซึ่งทำได้โดยการลบอัตราผลตอบแทนจากการลงทุนที่ไม่มีความเสี่ยง
  4. เบต้า จะวัดความผันผวนหรือความเสี่ยงเชิงระบบของกองทุนเมื่อเปรียบเทียบกับตลาดหรือดัชนีอ้างอิงที่เลือก เบต้าหนึ่งบ่งชี้ว่ากองทุนคาดว่าจะย้ายร่วมกับมาตรฐาน เบตาต่ำกว่าหนึ่งถือว่ามีความผันผวนน้อยกว่ามาตรฐานในขณะที่มากกว่าหนึ่งถือว่ามีความผันผวนมากกว่ามาตรฐาน
  5. อัลฟ่า วัดความเสี่ยงที่เกี่ยวข้องกับตลาดหรือดัชนีอ้างอิงที่เลือก ตัวอย่างเช่นหาก S&P 500 เป็นดัชนีอ้างอิง สำหรับกองทุน เฉพาะกิจกรรมของกองทุนจะถูกนำไปเปรียบเทียบกับผลตอบแทนที่ได้รับจากดัชนีที่เลือก หากกองทุนมีประสิทธิภาพดีกว่าเกณฑ์มาตรฐานจะถือว่ามีอัลฟาเป็นบวก หากกองทุนต่ำกว่าผลการดำเนินงานของเกณฑ์มาตรฐานก็จะถือว่ามีค่าติดลบ

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

สูตรส่วนเบี่ยงเบนมาตรฐาน

ส่วนเบี่ยงเบนมาตรฐานสามารถคำนวณได้จากสูตรดงต่อไปนี้

มาเริ่มที่กันเลย colab

เริ่มต้นด้วยการ Import liberly ที่คิดว่าจะใช้เพื่อความอุ่นใจกันก่อน

# load packagesimport pandas as pdimport numpy as npimport pandas_datareader as pdrimport seaborn as snsfrom matplotlib import pyplot as plt
# not needed, only to prettify the plots.import matplotlibfrom IPython.display import set_matplotlib_formats%matplotlib inline

ก่อนที่จะไปหาค่าได้เราต้องดึงข้อมูลกันก่อน โดยเราจะดึงข้อมูลมาจาก yahoo finance เพื่อให้ง่ายต่อการเรียกใช้ เราจะ import data reader ดังนี้

from pandas_datareader import data as pdrimport fix_yahoo_finance as yfyf.pdr_override() # <== that's all it takes :-)

อันดับต่อมาให้เรียนวันที่เราจะดึง และข้อมูลที่เราจะดึง วันนี้เราจะดึงข้อมูลของ Vanguard S&P 500 ETF (VOO)

# ===========today = "2020-01-01"  # to make static this script.tckr = 'VOO'# download datadata = pdr.get_data_yahoo(tckr, "2010-01-01", today)# add frequency needed for some pandas functionalities releated with offsetsdata = data.asfreq('B')data.columns = data.columns.map(lambda col: col.lower())data.head(20)  # first values

เราจะได้ข้อมูลมาแบบนี้

คอลัมที่เราจะเรียกใช้คือ close และเอาค่า Na ออก

prices = data[[‘close’]]prices = prices.dropna()

ต่อมาคือการหาค่า return และเราจะเปลี่ยนชื่อคอลัมต์ จาก close ไปเป็น returns_Vanguard_S&P_500_ETF

returns = prices.pct_change()returns = returns.dropna()returns.rename(columns={'close':'returns_Vanguard_S&P_500_ETF'},inplace=True)

จากสูตร SD เราสามารถ หา ตัวแปรต่างๆจากสมการ SD แล้วมาแทนในสูตร

number_of_obs = returns.shape[0]mean_squared_deviations = squared_deviations.sum()/(number_of_obs-1)volatility = np.sqrt(mean_squared_deviations)volatility

หรืออีกวิธีโดยการแตกเป็นกระบวนการย่อย โดยหาค่า deviations = ค่าผลตอบแทน ลบด้วย ผลตอบแทนเฉลี่ย squared deviations เท่ากับ deviations ยกกำลังสอง และหาค่าเฉลี่ยของ squared deviations ก็จะได้ค่า ส่วนเบี่ยงเบนมาตรฐาน

deviations = returns - returns.mean()squared_deviations = deviations**2mean_squared_deviations = squared_deviations.mean()

หลายคนคงคิดในใจทำใมมันยากเย็นอย่างนี้ เราสามารถใช้ฟังชั่นของ numpy ดังนี้

returns.std()

หากเราต้องการปรับค่าความผันผวนให้เป็นรายปีวิธีที่ง่ายที่สุดคือ นำค่าความผันผวนที่เราหาได้จากรายวันคูณด้วยสแควร์รูท(หรือยกกำลัง0.5)ของจำนวนวัน

annualized_vol = returns.std()*(300**0.5)annualized_vol

การใช้ SD. พยากรณ์การเคลื่อนไหวของราคา

ค่า SD สามารถพยากรณ์ หาช่วงการเคลื่อนไหวของราคาในแต่ละวันได้ดังนี้

returns_mean = returns.mean()min_return = returns_mean — returns.std()max_return = returns_mean + returns.std()print(min_return*100)print(max_return*100)

Note book;

https://gist.github.com/nutdnuy/Calcurate_return_withPython/master/การหาผลตอบแทนด้วยPython%20ตอนที่%201

อ้างอิง;

คู่มือการทดสอบหลักสูตร ผู้แนะนำการลงทุนตราสารทัวไป

อ่านตอนอื่นๆได้ที่

  1. การคำนวณผลตอบแทนการลงทุนด้วย Python
  2. การหาความผันผวนของพอร์ตการลงทุนด้วย Python
  3. การหา Max Drawdown ด้วย Python
  4. การวัด การเบี่ยงเบนของผลตอบแทนด้วย Python
  5. การวัด SemiDeviation ด้วย Python
  6. การวัด VaR. และ CVaR. ด้วย Python
  7. รีวิวการใช้ ffn. ใน Python
  8. การหา Top Drawdown ด้วย Python
  9. การหาค่า Sharpe ratio ด้วย Python
  10. การหากลุ่มหลักรัพย์ที่เส้นประสิทธิภาพ Efficient Frontier ด้วย Python
  11. การหา shape ratio สูงสุดและเส้น CML ด้วย Python
  12. การสร้างมูลค่าตลาดแบบถ่วงน้ำหนักด้วย PYTHON
  13. ข้อจำกัดของการกระจายความเสี่ยงและการทำประกันพอร์ตการลงทุน
  14. การจำลอง ผลตอบแทนด้วย RANDOM WALK Generation และ Montecarlo simulation
  15. Sharpe Style Analysis
  16. Factor Investing ด้วย Python
  17. วิเคราะห์ ประเภทกองทุนรวมด้วย Python
  18. การทำ Portfolio optimization
  19. สร้างแนวรับแนวต้านวิเคราะห์หุ้นด้วย Python

--

--

NUTHDANAI WANGPRATHAM
NUTHDANAI WANGPRATHAM

Written by NUTHDANAI WANGPRATHAM

I am a learner and have a multipotential life. You can contact me at nutdnuy@gmail.com

No responses yet