-
[Python] 샤프비율, 정보비율 계산하기투자/파이썬 2023. 2. 12. 11:55반응형
샤프비율Sharpe Ratio, 정보비율Information Ratio은 초과수익률을 리스크로 나눈 비율이다.
즉, 리스크 대비 초과수익률을 나타낸다. 투자성과를 요약할 때 반드시 사용하는 지표 중 하나다
필요한 이유
- 투자에서 동일한 수익률을 기록했다고 해서 동일한 성과를 올렸다고는 할 수 없다. 수익률이 같다면 덜 위험한 투자가 더 뛰어난 투자라고 할 수 있다
- 그래서 리스크 대비 얼마나 잘했는가(risk-adjusted return)가 중요하고, 그 정도를 나타내는 비율이 샤프비율과 정보비율이다
계산법
- 샤프비율은 무위험수익률 대비 초과수익을 표준편차로 나눠서 계산한다. 무위험수익률은 단기 국채와 같이 리스크가 사실상 0인 투자의 수익률을 의미한다
- 정보비율은 벤치마크 대비 초과수익을 표준편차로 나눠서 계산한다. 벤치마크는 투자시 기준이 되는 수익률, 장기적으로 아웃퍼폼하는 것이 목적인 투자의 수익률을 의미한다
- 이때의 수익률과 표준편차는 일반적으로 연율화된 수치를 이용한다
- 일반적으로 주식시장은 1년 252일 열린다고 가정한다
- 따라서 연수익률은 총수익률 ^ (252/데이터기간)
- 연변동성은 수익률의 표준편차 ^ (252^0.5)
코드
- 입력한 일별 가격 데이터를 일별 수익률로 고쳐준다
- 일별 수익률을 통해 총수익률을 계산한다
- 데이터의 기간을 계산하여 수익률, 변동성을 연율화한다
- 무위험수익률 혹은 벤치마크 수익률로 초과수익률을 계산하고 이를 연변동성으로 나눠준다
def all_time_ratio(prices : pd.Series, rate : float) -> float : ''' 데이터의 전체 기간 샤프비율, 정보비율 계산 rate : 무위험수익률 혹은 벤치마크 연수익률 ''' ret = prices.pct_change() # 가격을 수익률로 고침 cum_ret = (1+ret).prod() # 총수익률 periods = ret.shape[0] # 전체 기간 ann_ret = cum_ret ** (252/periods)-1 # 총수익률을 연율화 vol = ret.std() ann_vol = vol * (252**0.5) # 총변동성을 연율화 ratio = (ann_ret - rate) / ann_vol return ratio
def rolling_ratio(prices : pd.Series, rate : float) -> float : ''' 데이터의 최근 1년간(영업일 252일) 샤프비율, 정보비율 계산 rate : 무위험수익률 혹은 벤치마크 연수익률 ''' ret = prices.pct_change()[-252:] # 가격을 수익률로 고침 ann_ret = (1+ret).prod() -1 # 연수익률 vol = ret.std() # 연변동성 ann_vol = vol * (252**0.5) # 총변동성을 연율화 ratio = (ann_ret - rate) / ann_vol return ratio
2023년 2월 10일 종가 기준 최근 1년간 샤프비율(무위험수익률 3% 가정)을 계산하면,
다우존스 -0.32, 나스닥 -0.65, S&P500 -0.51의 결과가 나온다
반응형'투자 > 파이썬' 카테고리의 다른 글
[Python] 주식 가격 데이터 불러오기, yfinance 사용법 (0) 2023.02.18 [Python] 주식 보조지표 사용하기 - TA 라이브러리 (0) 2023.02.17 [Python] 주식 스프레드 계산하는 방법 (0) 2023.02.11 [Python] 최대낙폭 MDD 계산하는 방법 (0) 2023.02.11