การหาค่า Sharpe ratio ด้วย Python

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

NUTHDANAI WANGPRATHAM
3 min readMay 4, 2020

ในการลงทุนเราจะเลือกการลงทุนที่ผลตอบแทนสูงที่สุด ณ ระดับความเสี่ยงหนึ่ง หรือ ความเสี่ยงตํ่าที่สุด ณ ระดับผลตอบแทนหนึ่ง แต่ถ้าผลตอบแทนและความเสี่ยงไม่เท่ากันเลยเราจะเลือกยังไง

คำถามข้างต้นเป็นที่มาของ 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

อ้างอิง;

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

  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