ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 샤프비율, 정보비율 계산하기
    투자/파이썬 2023. 2. 12. 11:55
    반응형

    샤프비율Sharpe Ratio, 정보비율Information Ratio은 초과수익률을 리스크로 나눈 비율이다.

    즉, 리스크 대비 초과수익률을 나타낸다. 투자성과를 요약할 때 반드시 사용하는 지표 중 하나다

    필요한 이유

    • 투자에서 동일한 수익률을 기록했다고 해서 동일한 성과를 올렸다고는 할 수 없다. 수익률이 같다면 덜 위험한 투자가 더 뛰어난 투자라고 할 수 있다
    • 그래서 리스크 대비 얼마나 잘했는가(risk-adjusted return)가 중요하고, 그 정도를 나타내는 비율이 샤프비율과 정보비율이다

    계산법

    • 샤프비율은 무위험수익률 대비 초과수익을 표준편차로 나눠서 계산한다. 무위험수익률은 단기 국채와 같이 리스크가 사실상 0인 투자의 수익률을 의미한다
    • 정보비율은 벤치마크 대비 초과수익을 표준편차로 나눠서 계산한다. 벤치마크는 투자시 기준이 되는 수익률, 장기적으로 아웃퍼폼하는 것이 목적인 투자의 수익률을 의미한다
    • 이때의 수익률과 표준편차는 일반적으로 연율화된 수치를 이용한다
      • 일반적으로 주식시장은 1년 252일 열린다고 가정한다
      • 따라서 연수익률은 총수익률 ^ (252/데이터기간)
      • 연변동성은 수익률의 표준편차 ^ (252^0.5)

    코드

    1. 입력한 일별 가격 데이터를 일별 수익률로 고쳐준다
    2. 일별 수익률을 통해 총수익률을 계산한다
    3. 데이터의 기간을 계산하여 수익률, 변동성을 연율화한다
    4. 무위험수익률 혹은 벤치마크 수익률로 초과수익률을 계산하고 이를 연변동성으로 나눠준다
    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년간 샤프비율

    2023년 2월 10일 종가 기준 최근 1년간 샤프비율(무위험수익률 3% 가정)을 계산하면,

    다우존스 -0.32, 나스닥 -0.65, S&P500 -0.51의 결과가 나온다 

    반응형

    댓글

Designed by Tistory.