본문 바로가기

프로젝트/시각화

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

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

 

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

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

bigdata-doctrine.tistory.com

 

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

 

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

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

bigdata-doctrine.tistory.com

 

오늘은 이전 시간에 구한 각 포트폴리오들의 수익률과 리스크를 사용하여 효율적 투자선을 시각화해보겠습니다.

 

또한 샤프지수 최대 포트폴리오, 리스크 최소 포트폴리오, 올웨더 포트폴리오의 위치를 효율적 투자선 안에서

확인해 보도록 하겠습니다.

 

마지막으로는 샤프지수에 따른 컬러맵을 추가해보겠습니다.

 

 

효율적 투자선 시각화


# 효율적 투자선 시각화
port_df.plot.scatter(x="Risk", y="Returns", figsize=(15,10), grid=True) #1
plt.scatter(x=max_sharpe["Risk"], y=max_sharpe["Returns"], c="r", marker="*", #2
        s=200)
plt.scatter(x=min_risk["Risk"], y=min_risk["Returns"], c="r", marker="X", #3
        s=200)
plt.scatter(x=allweather_risk, y=allweather_returns, c="r", marker="o", #4
        s=200)
plt.title("Efficient Frontier") #5
plt.xlabel("Risk") #6
plt.ylabel("Returns") #7
plt.show()
  1. port_df 데이터프레임에서 "Risk"열의 데이터는 x축에, "Returns"열의 데이터는 y축에 표시하는 산점도를 생성합니다. 사이즈는 가로 15, 세로 10으로 하고 격자 표시를 넣어줍니다.
  2. 이전에 구했던 "max_sharpe"행의 "Risk"열을 x축에, "Returns"열을 y축에 표시하는 별 모양 점을 생성합니다. 색깔은 빨간색, 사이즈는 200으로 합니다.
  3.  "min_risk"행 역시 마찬가지로 해주고 X모양 마커를 생성합니다.
  4.  올웨더 포트폴리오의 리스크와 수익률 마커 또한 생성합니다. 모양은 동그라미입니다.
  5.  그래프의 제목은 "Efficient Frontier"로 해줍니다.
  6.  그래프의 x축 제목은 "Risk"로 해줍니다.
  7.  그래프의 y축 제목은 "Returns"로 해줍니다. 

 

 

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

출력 결과

  1. 파란색 점들은 이전 시간에 10만 번의 시뮬레이션을 통해 각자 다르게 종목 비율이 생성된 포트폴리오 집합입니다.
  2. 별표 모양 점은 샤프지수가 가장 높은 점입니다. 샤프지수란 한 단위의 리스크 대비 수익률을 나타냅니다. 샤프지수가 높다는 것은 리스크 대비 수익률이 좋다는 뜻입니다.
  3. X모양 점은 리스크가 가장 낮은 점입니다. 리스크가 x 축이기 때문에 가장 왼쪽에 있는 점이 되겠습니다. 리스크가 낮은 대신 수익률 또한 낮은 것을 확인할 수 있습니다.
  4.  O 모양 점은 올웨더 포트폴리오의 위치입니다. 효율적 투자선의 이론에 따르면 올웨더 포트폴리오는 비효율적인 포트폴리오가 될 수 있겠습니다. 왜냐하면 리스크를 현재에서 더 줄이거나 수익률을 늘릴 여지가 있기 때문입니다.

 

 

그렇다면 효율적 투자선은 어느 부분을 의미하는 걸까요?

 

위의 산점도에서 효율적 투자선은 밑에 제가 검은색으로 칠한 부분입니다.

효율적 투자선 (검은선은 제가 따로 칠한겁니다)

위의 검은 선 위에 있는 포트폴리오 점들은 더 이상 리스크를 줄이거나 수익률을 증가시킬 여지가 없는 효율적인 포트폴리오입니다.

 

올웨더 포트폴리오는 2016년 1월 1일부터 2022년 3월 6일까지의 데이터로 보았을 때에는 비효율적인 포트폴리오라고 할 수 있습니다.

 

하지만 산점도 그래프가 항상 저 그대로 인 것은 아닙니다.

 

위의 점들은 모두 특정 기간의 데이터를 가지고 만든 것이고, 기간을 어떻게 하느냐에 따라서 위의 점들의 위치는 모두 달라질 수 있습니다.

 

더 나아가 위 산점도의 효율적 투자선위에 있는 포트폴리오를 선정한다고 해서 앞으로도 효율적 투자선 위에 있지는 않을 수도 있다는 것입니다.

 

 

효율적 투자선 시각화 (컬러맵 추가)


# 효율적 투자선 시각화 (컬러맵 추가)
port_df.plot.scatter(x="Risk", y="Returns", c="Sharpe", cmap="viridis", 
                     edgecolors="k", figsize=(15,10), grid=True)
plt.scatter(x=max_sharpe["Risk"], y=max_sharpe["Returns"], c="r", marker="*",
        s=200)
plt.scatter(x=min_risk["Risk"], y=min_risk["Returns"], c="r", marker="X",
        s=200)
plt.scatter(x=allweather_risk, y=allweather_returns, c="r", marker="o",
        s=200)
plt.title("Efficient Frontier")
plt.xlabel("Risk")
plt.ylabel("Returns")
plt.show()

다른 것은 위에 했던 것과 모두 같고 컬러맵을 추가했습니다.

 

cmap은 컬러맵으로서 x축과 y축외의 3차원 데이터의 크기를 나타내기 위해 사용됩니다.

 

3차원 데이터는 "c"변수에 저장해 줍니다. 3차원 데이터는 port_df 데이터프레임의 "Sharpe"열입니다. 샤프지수를 의미합니다. 

 

"viridis"는 색상표의 이름입니다. 엣지컬러는 검은색으로 설정합니다.

 

 

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

출력 결과

샤프지수가 높은 포트폴리오는 노란색으로 표시됩니다.

 

대부분의 노란색 점이 효율적 투자선 위에 있다는 것을 확인할 수 있습니다.

 

반면에 샤프지수가 낮은 포트폴리오들은 효율적 투자선 안쪽에 위치하고 있습니다.

 

 


이번 시간에는 이전 시간에 구한 각 포트폴리오들의 수익률과 리스크를 사용하여 효율적 투자선을 시각화해보았습니다.

 

또한 샤프지수 최대 포트폴리오, 리스크 최소 포트폴리오, 올웨더 포트폴리오의 위치를 효율적 투자선 안에서

확인해 보았습니다.

 

마지막으로는 샤프지수에 따른 컬러맵도 추가해보았습니다. 

 

다시 한번 말씀드리지만 위의 데이터는 2016년 1월 1일부터 2022년 3월 6일까지의 데이터를 바탕으로 만들어졌기 때문에 효율적 투자선 내에서 가장 효율적인 포트폴리오를 골라 종목 비율 그대로 투자한다고 해도 앞으로도 그만큼의 수익률과 리스크를 보장한다는 것은 아닙니다.

 

모두 각자 자신만의 투자법을 찾고 투자해보시길 바랍니다.

 

효율적 투자선을 회귀 분석 하여 리스크와 수익률 간의 관계를 나타낸 후속 프로젝트를 밑에 남겨놓겠습니다.

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

 

[Python] 리스크 변화에 따른 수익률 변화 회귀 분석

오늘은 올웨더 포트폴리오 종목인 주식, 중기채, 장기채, 금, 원자재의 5가지 etf로 구성된 효율적 투자선을 통해 리스크 변화에 따른 수익률의 변화를 회귀분석으로 분석해보겠습니다. 이전 포

bigdata-doctrine.tistory.com

 

 

밑에 코랩 링크 남겨 놓으니 궁금하신 분은 실행해보셔도 좋습니다.

https://colab.research.google.com/drive/1HWCTbC7PxKcjVN8uKEnlBherUgzOWarn

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com