3-2. [트레이딩 전략 구현] 샤프 지수(Sharpe Ratio)

2021. 6. 12. 23:18Financial Analysis

샤프 지수

샤프 지수(Sharpe Ratio)측정된 위험 단위당 수익률을 계산한다. 포트폴리오 수익률에서 무위험률을 뺀 뒤,

 

포트폴리오 수익률 표준편차로 나눈다. 효율적 투자선 내에서 위험률 대비 가장 높은 수익률을 얻을 수 있는 

 

지점을 찾아보자. 

class efficient_frontier:
	def __init__(self, stock_list, start_date, end_date):
        	self.daily_ret = []
        	self.annual_ret = []
        	.
        	.
        	.
        	self.sharpe_ratio = []  #샤프지수 변수를 추가
        	.

클래스 멤버에 샤프지수를 나타내는 변수를 추가한다. 

    def monte_carlo_sim(self, stock_list):
        for _ in range(20000):
            .
            .
            .
            self.sharpe_ratio.append(returns/risk) #Returns을 Risk로 나눈다.

        portfolio = {'Returns' : self.port_ret, 'Risk' : self.port_risk, 'Sharpe':self.sharpe_ratio}

몬테카를로 시뮬레이션 함수에서 for문 내에서 각 반복문(포트폴리오 마다)의 샤프 지수를 계산하고, 

 

축적된 Sharpe Ratio들을 포트폴리오의 'Sharpe' 이라는 이름의 칼럼에 추가한다. 

>>>print(portfolio)

        Returns      Risk    Sharpe     금호타이어      호텔신라    CJ대한통운      대한항공
0      0.038132  0.259904  0.146716  0.220245  0.292545  0.298144  0.189065
1      0.043784  0.268687  0.162956  0.201686  0.243987  0.263023  0.291305
2      0.043069  0.292185  0.147404  0.250997  0.177178  0.150927  0.420898
3      0.064321  0.279856  0.229836  0.073110  0.125840  0.402251  0.398800
4      0.065453  0.273435  0.239372  0.080946  0.041724  0.543731  0.333599
...         ...       ...       ...       ...       ...       ...       ...
19995  0.036815  0.275971  0.133401  0.261308  0.258643  0.177979  0.302070
19996  0.066381  0.285159  0.232784  0.051895  0.144307  0.382255  0.421543
19997  0.054749  0.276843  0.197763  0.154137  0.136906  0.320213  0.388744
19998  0.047276  0.273960  0.172566  0.202805  0.176702  0.265743  0.354750
19999  0.020469  0.261155  0.078379  0.352573  0.327478  0.227736  0.092212
        portfolio = pd.DataFrame(portfolio)
        max_sharpe = portfolio.loc[portfolio['Sharpe'] == portfolio['Sharpe'].max()]
        min_risk = portfolio.loc[portfolio['Risk'] == portfolio['Risk'].min()]

portfolio를 데이터프레임 형태로 변환하고, Sharpe 칼럼에서 가장 큰 인덱스를 구한다. 다시말해 포트폴리오 케이스 중

 

가장 큰 샤프 지수를 지니는 포트폴리오를 구한다. 마찬가지 방법으로 Risk 칼럼에서 가장 최소값을 지니는 포트폴리오도

 

구한다.

	portfolio.plot.scatter(x='Risk', y='Returns', c='Sharpe', cmap = 'viridis',edgecolors='k', grid=True)
        plt.scatter(x=min_risk['Risk'], y=min_risk['Returns'], c='r', marker='X', s=200)
        plt.scatter(x=max_sharpe['Risk'], y=max_sharpe['Returns'], c='r', marker='*', s=300)
        plt.title("Efficient Frontier")
        plt.xlabel('Risk')
        plt.ylabel('Expected Returns')
        plt.show()

기존 효율 투자선 그래프에서 샤프 지수를 표시하고, 최소 리스크의 경우와, 최대 샤프 지수의 경우를 각각 표시해준다.

>>>print(max_sharpe)

       Returns      Risk    Sharpe     금호타이어      호텔신라    CJ대한통운      대한항공
15496  0.075799  0.288491  0.262744  0.005562  0.018628  0.577573  0.398236

>>>print(min_risk)

      Returns      Risk    Sharpe     금호타이어      호텔신라    CJ대한통운      대한항공
7429  0.029065  0.247075  0.117637  0.327582  0.163388  0.433786  0.075244

붉은 색으로 표시된 지점이 각각 최소 리스크를 지닌 포트폴리오와 최대 샤프 지수의 포트폴리오를 나타내므로

 

투자를 함에 있어서 참고할 수 있는 유용한 지표로 활용할 수 있다.