3-2. [트레이딩 전략 구현] 샤프 지수(Sharpe Ratio)
2021. 6. 12. 23:18ㆍFinancial 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
붉은 색으로 표시된 지점이 각각 최소 리스크를 지닌 포트폴리오와 최대 샤프 지수의 포트폴리오를 나타내므로
투자를 함에 있어서 참고할 수 있는 유용한 지표로 활용할 수 있다.
'Financial Analysis' 카테고리의 다른 글
4-2. [트레이딩 전략 구현] 볼린저 밴드 지표 : %b, 밴드폭(bandwidth) (0) | 2021.06.13 |
---|---|
4-1. [트레이딩 전략 구현] 볼린저 밴드 지표 (0) | 2021.06.13 |
3-1. [트레이딩 전략 구현] 효율적 투자선 구하기 (0) | 2021.06.12 |
2-2. DB에서 시세 조회하는 API 만들기 (0) | 2021.06.06 |
2-1. 스크래핑한 데이터를 DB에 저장하기 (2) | 2021.06.05 |