การหาค่า Sharpe ratio ด้วย Python
การทำ portfolio optimization ด้วย google colab vIII
ในการลงทุนเราจะเลือกการลงทุนที่ผลตอบแทนสูงที่สุด ณ ระดับความเสี่ยงหนึ่ง หรือ ความเสี่ยงตํ่าที่สุด ณ ระดับผลตอบแทนหนึ่ง แต่ถ้าผลตอบแทนและความเสี่ยงไม่เท่ากันเลยเราจะเลือกยังไง
คำถามข้างต้นเป็นที่มาของ Sharpe ratio เพื่อเปรียบเทียบผลตอบแทนกับความเสี่ยงที่ถูกพัฒนาขึ้นโดย Nobel laureate William F. Sharpe จนเป็นที่ยอมรับในทฤษฎีการลงทุนสมัยใหม่
Sharpe ratio มักจะใช้เพื่อเปรียบเทียบการเปลี่ยนแปลงในลักษณะผลตอบแทนความเสี่ยงโดยรวมเมื่อมีการเพิ่มสินทรัพย์หรือหมวดสินทรัพย์ใหม่ในพอร์ต ตัวอย่างเช่นนักลงทุนกำลังพิจารณาเพิ่มการจัดสรรกองทุนเฮดจ์ฟันด์ให้กับพอร์ตโฟลิโอที่มีอยู่ซึ่งปัจจุบันแบ่งระหว่างหุ้นและพันธบัตรและได้รับผลตอบแทน 15% ในปีที่ผ่านมา อัตราผลตอบแทนปราศจากความเสี่ยงในปัจจุบันคือ 3.5% และความผันผวนของผลตอบแทนของพอร์ตการลงทุนอยู่ที่ 12% ซึ่งทำให้อัตราส่วน Sharpe 95.8% หรือ (15% — 3.5%) หารด้วย 12%
นักลงทุนเชื่อว่าการเพิ่มกองทุนเฮดจ์ฟันด์ลงในพอร์ตจะลดผลตอบแทนที่คาดหวังไว้ที่ 11% สำหรับปีถัดไป แต่ยังคาดว่าความผันผวนของพอร์ตจะลดลงถึง 7% นักลงทุนสันนิษฐานว่าอัตราผลตอบแทนปราศจากความเสี่ยงจะยังคงเหมือนเดิมในปีถัดไป ใช้สูตรเดียวกันกับตัวเลขในอนาคตโดยประมาณนักลงทุนพบว่าพอร์ตมีอัตราส่วนชาร์ปที่คาดว่าจะ 107% หรือ (11% — 3.5%) หารด้วย 7%
ที่นี่นักลงทุนได้แสดงให้เห็นว่าถึงแม้ว่าการลงทุนกองทุนเฮดจ์ฟันด์จะลดผลตอบแทนของพอร์ตโฟลิโอ แต่ก็มีการปรับปรุงประสิทธิภาพการทำงานบนพื้นฐานการปรับความเสี่ยง หากการเพิ่มการลงทุนใหม่ลดอัตราส่วน Sharpe ก็ไม่ควรเพิ่มในพอร์ตการลงทุน
เปิด Colab เริ่มกันเลย
สิ่งแรกที่เราต้องทำคือ load packages เหมือนเดิมเพื่อความอุ่นใจ
# load packages
import pandas as pd
import numpy as np
import pandas_datareader as pdr
import seaborn as sns
from matplotlib import pyplot as plt
import pandas_datareader as web
import datetime# not needed, only to prettify the plots.
import matplotlib
from IPython.display import set_matplotlib_formats
%matplotlib inline
%autoreload 2
%matplotlib inline
ต่อมาคือดึงข้อมูลวันนี้ผมใช้ข้อมูลออันนี้นะครับ https://github.com/nutdnuy/Portfolio_optimization_with_Python/blob/master/data/ind49_m_ew_rets.csv
ind = pd.read_csv("https://raw.githubusercontent.com/nutdnuy/Portfolio_optimization_with_Python/master/data/ind30_m_ew_rets.csv", header=0, index_col=0)/100ind.index = pd.to_datetime(ind.index, format="%Y%m").to_period('M')
print มาดูหน่อย
ind.head(10)
คำนวณ Sharpe Ratio
คำนวณตามสูตรข้างบนเลย แต่เราต้องเปลี่ยนผลตอบแทนรายเดือนของเราให้เป็นรายปีโดยการโดยการบวกหนึ่งยกกำลัง 12แล้วลบ 1 ออกมา
sharpe_ratio_1 = ((((ind.mean()+1)**12)-1) - 0.03) /ind.std()
sharpe_ratio_1
สร้างฟังชั่นจะได้ประมาณนี้
def sharpe_ratio(r, riskfree_rate, periods_per_year):rf_per_period = (1+riskfree_rate)**(1/periods_per_year)-1excess_ret = r - rf_per_periodann_ex_ret = annualize_rets(excess_ret, periods_per_year)ann_vol = annualize_vol(r, periods_per_year)return ann_ex_ret/ann_vol
จะเห็นว่าในฟังชั่นก็ต้องมีการเปลี่ยนผลตอบแทนให้เป็นรายปี
def annualize_rets(r, periods_per_year):compounded_growth = (1+r).prod()n_periods = r.shape[0]return compounded_growth**(periods_per_year/n_periods)-1
ค่าความผันผวนก็ต้องเปลี่ยนเป็นรายปีนะครับ
def annualize_vol(r, periods_per_year):return r.std()*(periods_per_year**0.5)
เรียบร้อย
sharpe_ind = sharpe_ratio(ind, 0.02, 12)sharpe_ind
อยากดูเป็นกราฟทำตามนี้เลย
risk_free_rate = 0.02periods_per_year = 12sharpe_ratio(ind["2000":], risk_free_rate, 12).sort_values().plot.bar(title='Industry Sharpe Ratios since 2000')
ใช้ ffn
ถ้าใครขี้เกียจเขียนใช้ ffn ก็ง่ายดี ปกติถ้าผมไม่ได้เอาไปทำอะไรต่อก็จะใช้ ffn เป็นหลักนี้แหละ
!pip install ffnimport ffn#%pylab inline
จบในบรรทัดเดียว
ffn.core.calc_risk_return_ratio(ind)
ถ้าใครสังเกตจะเห็นว่ามันไม่ให้ใส่ ผลตอบแทนปราศจากความเสี่ยงจริงๆแล้วเราต้องเขียนเเบบนี้
ffn.core.calc_sharpe(ind, rf=0.01, nperiods=12, annualize=True)
พอตกราฟดู
ffn.core.calc_sharpe(ind, rf=0.01, nperiods=12, annualize=True).sort_values().plot.bar(title='Industry Sharpe Ratios')
สังเกตเห็นอะไรใหมครับ ถ้าเราหา shape ratio จาก ffn เราจะไม่มีค่าติดลบ
Note book ; https://colab.research.google.com/drive/1DlLyX1xtlgP919OhU_f96WmOczVVIp1q
อ้างอิง;
อ่านตอนอื่นๆได้ที่
- การคำนวณผลตอบแทนการลงทุนด้วย 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