본문 바로가기

프로젝트/통계적 분석

[Python] (2)올웨더 기반 효율적 투자선 구현 : 수익률, 리스크, 샤프지수 계산

https://bigdata-doctrine.tistory.com/10

 

[Python] (1)올웨더 기반 효율적 투자선 구현 : 데이터 수집

이번 프로젝트는 효율적 투자선을 파이썬을 통하여 시각화를 해 보는 것입니다. 단순히 효율적 투자선을 시각화하는 것뿐만 아니라 샤프지수가 가장 높은 포트폴리오, 위험률이 가장 낮은 포트

bigdata-doctrine.tistory.com

 

 

오늘은 이전 시간에 수집한 포트폴리오 각 종목의 연간 수익률과 리스크를 가지고 포트폴리오들의 수익률과 리스크를 구해보도록 하겠습니다.

 

또한 샤프지수가 가장 큰 포트폴리오, 리스크가 가장 작은 포트폴리오, 올웨더 포트폴리오의 종목 비중과 수익률, 리스크, 샤프지수 또한 구해보도록 하겠습니다.

 

 

포트폴리오 연간 수익률, 리스크 구하기


종목의 비율을 달리 한 10만 개의 포트폴리오를 가지고 각 포트폴리오의 수익률, 리스크, 종목 비중, 샤프지수를 차례로 구해보도록 하겠습니다.

 

또한 샤프지수가 가장 높은 포트폴리오와 리스크가 가장 높은 포트폴리오를 골라 내 보겠습니다.

 

# 종목 비중을 달리한 몬테카를로 시뮬레이션
port_ret = []
port_risk = []
port_weights = []
sharpe_ratio = []

for _ in range(100000):  #1
    weight = np.random.random(5)  #2
    weight /= np.sum(weight)  #3

    weighted_annual_ret = np.dot(weight.T, annual_ret)  #4
    weighted_annual_risk = np.sqrt(np.dot(weight.T, np.dot(annual_cov, weight)))  #5

    port_ret.append(weighted_annual_ret)
    port_risk.append(weighted_annual_risk)
    port_weights.append(weight)
    sharpe_ratio.append(weighted_annual_ret/weighted_annual_risk)  # 6

port_df = pd.DataFrame({"Returns":port_ret, "Risk":port_risk,
                    "Sharpe":sharpe_ratio})  #7

for i, etf in enumerate(etf_lst):  #8
    port_df[etf] = [w[i] for w in port_weights]

max_sharpe = port_df[port_df["Sharpe"] == port_df["Sharpe"].max()]  #9
min_risk = port_df[port_df["Risk"] == port_df["Risk"].min()]  #10
  1. 10만 개의 포트폴리오를 생성하기 위해 10만 번 반복하는 for문을 생성합니다. 이처럼 매우 많은 난수를 이용해 함수의 값을 확률적으로 계산하는 것을 몬테카를로 시뮬레이션이라 합니다.
  2.  0과 1사이의 무작위 수 5개가 담겨있는 리스트를 변수에 저장합니다.
  3.  리스트 안의 수들을 모두 더한 수로 각각의 수들을 나누어줍니다. 이렇게 할 경우 리스트 안의 각각의 수를 더하면 1이 됩니다.
  4.  포트폴리오의 수익률을 구하기 위해 종목 비율(가중치) 리스트와 연간 수익률 리스트의 내적곱을 구해줍니다.
  5.  포트폴리오의 리스크를 구하기 위해 (종목 비율)((종목별 연간 공분산)(종목 비율))의 행렬 내적곱 계산을 해준 후 제곱근을 구해줍니다. 
  6.  샤프지수를 구하는 방식은 (수익률-무위험수익률)/표준편차(리스크)이고 계산의 편의를 위해 무위험수익률은 0으로 가정하였습니다.
  7.  포트폴리오 수익률, 리스크, 샤프지수를 차례로 데이터프레임에 저장합니다.
  8.  각 포트폴리오의 종목 비율을 데이터프레임에 저장합니다. 
  9.  샤프지수가 가장 큰 데이터프레임의 행을 변수에 저장합니다.
  10.  리스크가 가장 작은 데이터프레임의 행을 변수에 저장합니다.

몬테카를로 시뮬레이션을 통해 종목 비율을 달리 한 10만 개의 포트폴리오의 수익률과 리스크, 샤프지수를

구해보았습니다.

 

또한 샤프지수가 가장 큰 데이터프레임의 행과 리스크가 가장 작은 데이터프레임의 행을 추출해내었습니다.

 

몬테카를로 시뮬레이션에 대한 기초적인 설명을 밑의 포스팅에 해두었으니 이해가 잘 되지 않는다면 밑의 링크 참조하시길 바랍니다.

 

https://bigdata-doctrine.tistory.com/15

 

[Python] 몬테카를로 방법을 이용하여 원주율, 파이(π)값 구하기

오늘은 몬테카를로 방법을 이용하여 원주율, 파이(π)의 값을 구해보도록 하겠습니다. 몬테카를로 방법이란 무작위 추출된 난수를 이용하여 모델(함수)을 구하는 알고리즘을 부르는 용어입니다.

bigdata-doctrine.tistory.com

 

 

샤프지수 최대, 리스크 최소, 올웨더 포트폴리오 확인


# 샤프지수 최댓값 (무위험수익률 0%가정)
max_sharpe

max_sharpe의 출력 결과는 다음과 같습니다.

max_sharpe 출력 결과

연간 수익률은 9.9%, 리스크(표준편차)는 8.9%, 주식 35.1%, 중기채 1.4%, 장기채 20.4%, 금 36%, 원자재 7%가량의 비중을 가지고 있는 포트폴리오입니다. 샤프지수는 1.1입니다.

 

중기채를 제외한 종목들이 골고루 들어있는 것을 알 수 있습니다.

 

 

# 리스크 최솟값
min_risk

min_risk의 출력 결과는 다음과 같습니다.

min_risk 출력 결과

연간 수익률은 3.6%, 리스크(표준편차)는 4.7%, 주식 9.6%, 중기채 76.3%, 장기채 0.5%, 금 8.6%, 원자재 5%가량의 비중을 가지고 있는 포트폴리오입니다. 샤프지수는 0.8입니다.

 

max_sharpe의 출력 결과와는 다르게 중기채의 종목 비중이 가장 큰 것을 알 수 있습니다.

 

리스크를 많이 줄이기 위해서는 중기채의 비중을 높게 가져가야 한다는 것을 의미하겠죠?

 

 

# 올웨더 포트폴리오 연간 수익률, 연간 리스크
all_weather_weight = [0.3, 0.15, 0.4, 0.075, 0.075]  # 올웨더 가중치

allweather_returns = np.dot(weight.T, annual_ret)
allweather_risk = np.sqrt(np.dot(weight.T, np.dot(annual_cov, weight)))

print("All Weather Returns: ", allweather_returns)
print("All weather Risk: ", allweather_risk)

다음은 올웨더 포트폴리오의 연간 수익률과 리스크를 구하는 코드입니다.

 

올웨더는 주식 30%, 중기채 15%, 장기채 40%, 금 7.5%, 원자재 7.5%의 종목 비중을 가집니다.

 

위에서 각 포트폴리오의 연간 수익률과 리스크를 구했던 방식 그대로 계산합니다.

 

출력 결과는 다음과 같습니다.

출력 결과

올웨더 포트폴리오의 연간 수익률은 6.3%, 연간 리스크는 6.6%입니다.

 

 

위의 결과는 무작위 10만 번의 시뮬레이션을 통해 도출된 결과이므로 실행시킬 때마다 약간씩 달라질 수 있습니다.

(크게 달라지지는 않습니다)

 

또한 과거(2016년부터)의 데이터를 가지고 도출해낸 결과이기 때문에 미래에도 같은 수익률과 리스크를 보일지는 아무도 알 수 없습니다.

 

따라서 투자 전략을 고민할 때 무작정 과거에 많은 수익률을 냈다고 해서 그것을 선택하는 것은 옳지 않을 수 있습니다.

 

 


이번 시간에는 이전 시간에 수집한 포트폴리오 각 종목의 연간 수익률과 리스크를 가지고 포트폴리오들의 수익률과 리스크를 구해보았습니다.

 

또한 샤프지수 최대 포트폴리오, 리스크 최소 포트폴리오, 올웨더 포트폴리오의 종목 비중과 수익률, 리스크, 샤프지수 또한 구해보았습니다.

 

다음 시간에는 효율적 투자선을 시각화를 통해 직접 구현해보고 샤프지수 최대 포트폴리오와 리스크 최소 포트폴리오, 올웨더 포트폴리오의 위치를 효율적 투자선 안에서 확인해보도록 하겠습니다.

 

 

https://bigdata-doctrine.tistory.com/12

 

[Python] (3)올웨더 기반 효율적 투자선 구현 : 시각화

https://bigdata-doctrine.tistory.com/10 [Python] (1)올웨더 기반 효율적 투자선 구현 : 데이터 수집 이번 프로젝트는 효율적 투자선을 파이썬을 통하여 시각화를 해 보는 것입니다. 단순히 효율적 투자선을

bigdata-doctrine.tistory.com