datascience/Finanace

금융 투자 기본 개념(샤프비율, 효율적 투자선)

patrck_jjh 2021. 5. 8. 05:04

2021.05.02 - [finanace] - 금융 투자 기본 개념(Return, Risk)

 

금융 투자 기본 개념(Return, Risk)

금융 투자를 하는데 있어 가장 기초가 되는 개념들이 있다 Return(수익): 개별 자산의 수익률(R_i)을 각 자산의 가중치(x_i)를 곱하여 합하면 포트폴리오 수익률을 구할 수 있다. Risk(위험): 개별 자산

patrickstar-jjh.tistory.com

 이전 글에서 설명했던 수익률과 위험에서 더 나아가 샤프비율, 효율적 투자선에 대해 알아보자.

 

 


 

 

 

샤프비율(Sharpe Ratio): $\frac{포트폴리오 초과수익 }{포트폴리오 변동성}$ 이다.  (쉽게말해 포트폴리오의 $\frac{수익률}{위험}$)

                                     

 

 

 

효율적 투자선(Efiicient Frontier): 같은 위험 수준에서 가장 높은 수익률을 나타내는 포트폴리오들의 집합이다.

 

출처: 한국투자증권

 

 


 

 

 몬테카를로 시뮬레이션을 통해 삼성전자, SK하이닉스, LG전자, NAVER 4가지 주식을 포트폴리오에 담아 가중치 별로 총 20000개의 포트폴리오를 만들었다. 최종적으로 데이터프레임에 수익률, 위험, 샤프지수 그리고 비중에 대한 데이터를 담았다.

 

port_ret = []       # 포트폴리오 수익률
port_risk = []      # 포트폴리오 리스크
port_weights = []   # 종목 비중
sharpe_ratio = []   # 샤프비율 리스트 설정

for _ in range(20000):                         # 20000개의 포트폴리오 생성
    
    weights = np.random.random(len(stocks))    # 4가지 종목 난수생성
    weights /= np.sum(weights)                 # weights의 총합으로 나누어 총합 1이되게 조정

    returns = np.dot(weights, annual_ret)      #각 종목 비중과 수익률을 곱해 해당 포트폴리오의 수익률 계산
    risk = np.sqrt(np.dot(weights.T, np.dot(annual_cov, weights)))    #해당 포트폴리오 리스크 계산
    SR = returns/risk                   # 샤프지수 계산
    
    port_ret.append(returns)            # 각 리스트에 append
    port_risk.append(risk) 
    port_weights.append(weights) 
    sharpe_ratio.append(SR)             # 샤프지수 append

portfolio = {'Returns': port_ret, 'Risk': port_risk, 'Sharpe' : sharpe_ratio}     # portfolio 딕셔너리에 각 종목별로 비중값 추가

for i, s in enumerate(stocks): 
    portfolio[s] = [weight[i] for weight in port_weights]      # 개별주식의 weight값 append
    
df = pd.DataFrame(portfolio) 
df = df[['Returns', 'Risk','Sharpe'] + [s for s in stocks]] 
df

 

 

 

 

 몬테카를로 시뮬레이션을 통해 생성한 데이터프레임을 시각화해보자.

 

# Mean-Varinance portfolio(평균분산포트폴리오) : 최대 샤프지수 ~ 탄젠트
max_sharpe = df.loc[df['Sharpe'] ==df['Sharpe'].max()]
max_sharpe

# Mininum-Variance portfolio(최소분산포트폴리오) : 최소 Variance(=Risk)
min_risk = df.loc[df['Risk'] == df['Risk'].min()]
min_risk


# minimum-variance portfolio와 mean-variance portfolio 시각화
df.plot.scatter(x='Risk', y='Returns', c='Sharpe', cmap='viridis',
    edgecolors='k', figsize=(11,7), grid=True)   

plt.scatter(x=max_sharpe['Risk'], y=max_sharpe['Returns'], c='r',      # 평균분산포트폴리오 *표시
    marker='*', s=300)  

plt.scatter(x=min_risk['Risk'], y=min_risk['Returns'], c='r',          # 최소분산포트폴리오 X표시
    marker='X', s=200)  

plt.title('Portfolio Optimization') 
plt.xlabel('Risk') 
plt.ylabel('Expected Returns') 
plt.show()

 

 시각화 결과 그래프의 아래쪽에 있는 포트폴리오들은 낮은 샤프비율을 나타내고 위쪽에 있을 수록 밝은 샤프비율을 나타낸다. 위쪽 방향에 위치할 수록 같은 위험수준이라도 높은 수익률을 나타내기 때문이다. 위쪽 곡선을 따라 생성되는 포트폴리오들은 밝은 연두색으로 가장 샤프비율이 높음을 알 수 있는데 바로 이 선이 효율적 투자선이다.

 

 붉은색 X로 표시된 포트폴리오는 최소분산(Minimum-Variance)포트폴리오로서 가장 낮은 위험을 가진 포트폴리오이고 붉은색★로 표시된 포트폴리오는 가장 높은 샤프비율을 나타내는 평균분산(Mean-Variance)포트폴리오를 의미한다.

 

 

 

<Reference>

파이썬증권데이터분석 (김황후, 한빛미디어)

 

<Github>

github.com/dudungE/AI_Finance/blob/master/%EA%B8%88%EC%9C%B5%ED%88%AC%EC%9E%90_basic.ipynb