การหาความผันผวนของพอร์ตการลงทุนด้วย Python
การทำ portfolio optimization ด้วย google colab II
นอกจากผลตอบแทนแล้วอีกสิ่งหนี่งที่สำคัญในการลงทุนคือความเสี่ยง โดยทั่วไปหากผลตอบแทนเท่ากันนักลงทุนจะเลือกการลงทุนที่มีระดับความเสี่ยงที่ตํ่ากว่า แต่ความเสี่ยงคืออะไรและวัดอย่างไรยังคงเป็นคำถามที่น่าสนใจที่เราจะมาคุยกัน
ความหมายของความเสี่ยง
ความเสี่ยงจากการลงทุนคือโอกาสที่เราจะไม่ได้รับผลตอบแทนตามที่เราคาดหวังไว้จากการลงทุน จากนิยามนี้ความเสี่ยงแบ่งเป็นสองด้านคือความเสี่ยงด้านลบและความเสี่ยงด้านบวก
มาตรวัดความเสี่ยง
ในทางการเงินมาตรวัดความเสี่ยงมีหลากหลาย แต่มาตรวัดความเสี่ยงหลักได้แก่
- ส่วนเบี่ยงเบนมาตรฐาน ส่วนเบี่ยงเบนมาตรฐานเป็นวิธีการวัดการกระจายข้อมูลที่เกี่ยวข้องกับค่าเฉลี่ยของชุดข้อมูลและให้การวัดเกี่ยวกับความผันผวนของการลงทุน เนื่องจากเกี่ยวข้องกับการลงทุนค่าเบี่ยงเบนมาตรฐานจะวัดว่าผลตอบแทนจากการลงทุนแตกต่างจากผลตอบแทนปกติหรือค่าเฉลี่ยที่คาดหวังมากเพียงใด
- R-Squared วัดเปอร์เซ็นต์ของการเคลื่อนไหวของการลงทุนที่เกิดจากการเคลื่อนไหวในดัชนีอ้างอิง ค่า R-squared หมายถึงความสัมพันธ์ระหว่างผลการลงทุนและดัชนีอ้างอิงที่เกี่ยวข้อง ตัวอย่างเช่นค่า R-squared ที่ 95 จะถือว่ามีความสัมพันธ์สูงในขณะที่ค่า R-squared ที่ 50 อาจถือว่าต่ำ
- Sharpe Ratio วัดผลตอบแทนตามที่ปรับโดยความเสี่ยงที่เกี่ยวข้อง ซึ่งทำได้โดยการลบอัตราผลตอบแทนจากการลงทุนที่ไม่มีความเสี่ยง
- เบต้า จะวัดความผันผวนหรือความเสี่ยงเชิงระบบของกองทุนเมื่อเปรียบเทียบกับตลาดหรือดัชนีอ้างอิงที่เลือก เบต้าหนึ่งบ่งชี้ว่ากองทุนคาดว่าจะย้ายร่วมกับมาตรฐาน เบตาต่ำกว่าหนึ่งถือว่ามีความผันผวนน้อยกว่ามาตรฐานในขณะที่มากกว่าหนึ่งถือว่ามีความผันผวนมากกว่ามาตรฐาน
- อัลฟ่า วัดความเสี่ยงที่เกี่ยวข้องกับตลาดหรือดัชนีอ้างอิงที่เลือก ตัวอย่างเช่นหาก 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
อ้างอิง;
คู่มือการทดสอบหลักสูตร ผู้แนะนำการลงทุนตราสารทัวไป
อ่านตอนอื่นๆได้ที่
- การคำนวณผลตอบแทนการลงทุนด้วย Python
- การหาความผันผวนของพอร์ตการลงทุนด้วย Python
- การหา Max Drawdown ด้วย Python
- การวัด การเบี่ยงเบนของผลตอบแทนด้วย Python
- การวัด SemiDeviation ด้วย Python
- การวัด VaR. และ CVaR. ด้วย Python
- รีวิวการใช้ ffn. ใน Python
- การหา Top Drawdown ด้วย Python
- การหาค่า Sharpe ratio ด้วย Python
- การหากลุ่มหลักรัพย์ที่เส้นประสิทธิภาพ Efficient Frontier ด้วย Python
- การหา shape ratio สูงสุดและเส้น CML ด้วย Python
- การสร้างมูลค่าตลาดแบบถ่วงน้ำหนักด้วย PYTHON
- ข้อจำกัดของการกระจายความเสี่ยงและการทำประกันพอร์ตการลงทุน
- การจำลอง ผลตอบแทนด้วย RANDOM WALK Generation และ Montecarlo simulation
- Sharpe Style Analysis
- Factor Investing ด้วย Python
- วิเคราะห์ ประเภทกองทุนรวมด้วย Python
- การทำ Portfolio optimization
- สร้างแนวรับแนวต้านวิเคราะห์หุ้นด้วย Python