지난 글에서 평균-분산 그래프에 주식 자산과 예금을 나타내고, 분산 투자한 포트폴리오도 위치시켜 보았습니다. 위험 자산 + 안전 자산 혼합 포트폴리오는 가장 간단한 분산 투자 포트폴리오입니다. 이 글에서는 변동성이 있는 두 자산을 혼합한 결과를 평균-분산 그래프에 나타내 보고, 분산 투자로 수익률 분포가 어떻게 변했는지 확률 분포 그래프로 살펴봅니다. 지난 글: [파이썬 분석 6] 산점도(scatter plot)에 자산의 특성을 나타내고, 예금과 혼합 효과도 표현해 보자
주의: 이 글은 특정 상품 또는 특정 전략에 대한 추천의 의도가 없습니다. 이 글에서 제시하는 수치는 과거에 그랬다는 기록이지, 앞으로도 그럴 거라는 예상이 아닙니다. 분석 대상, 기간, 방법에 따라 전혀 다른 결과가 나올 수 있습니다. 데이터 수집, 가공, 해석 단계에서 의도하지 않은 오류가 있을 수 있습니다. 일부 설명은 편의상 현재형으로 기술하지만, 데이터 분석에 대한 설명은 모두 과거형으로 이해해야 합니다.
S&P 500 지수에 투자하는 대표적인 주식 자산인 SPY와 주식과 음의 상관성이 있는 미국 장기 국채 ETF인 TLT에 분산 투자한 결과를 그려보겠습니다. 이전 글에서 이어지기에 공통 코드 부분은 생략합니다. 참고: 거듭 말씀드리지만, 직접 해보지 않으면 여러분이 천재가 아닌 이상 실력이 거의 늘지 않습니다.
df = fdr.DataReader('SPY, TLT').dropna()
df_252 = df.pct_change(252)
for col in df_252.columns:
plt.scatter(df_252[col].std(), df_252[col].mean(), label = col)
mean_l, std_l = [], []
for w in np.arange(0.02, 1, 0.02):
port = df_252.SPY * w + df_252.TLT * (1 - w)
mean_l.append(port.mean())
std_l.append(port.std())
plt.scatter(std_l, mean_l, s = 5, label= 'SPY + TLT')
# 이하 생략
주요 코드 부분을 살펴봅니다.
df = fdr.DataReader('SPY, TLT').dropna()
SPY와 TLT 수정 종가를 가져와서 공통 기간을 뽑아 df에 넣었습니다.
df_252 = df.pct_change(252)
252거래일 수익률을 구해 df_252에 넣었습니다.
for col in df_252.columns:
plt.scatter(df_252[col].std(), df_252[col].mean(), label = col)
SPY와 TLT 각각에 대해 점을 표시하고, 범례에 쓸 이름도 붙였습니다. 하나의 명령어로 그리면 동일한 색상으로 표현되고, 이름도 각각 부여하기 불편하기에 따로 그린 것입니다.
mean_l, std_l = [], []
for w in np.arange(0.02, 1, 0.02):
port = df_252.SPY * w + df_252.TLT * (1 - w)
mean_l.append(port.mean())
std_l.append(port.std())
SPY와 TLT에 분산 투자하는 여러 포트폴리오를 동일한 색상으로 한 번에 그리기 위해 평균과 표준 편차를 담을 mean_l, std_l이라는 리스트(일종의 배열)를 정의했습니다.
투자 비중을 바꿔가며 포트폴리오 수익률을 계산한 후 평균과 표준 편차를 각각의 변수에 하나씩 추가했습니다. append()는 리스트의 마지막에 추가하라는 명령입니다.
plt.scatter(std_l, mean_l, s = 5, label= 'SPY + TLT')
표준 편차를 x값으로 평균은 y값으로 산점도에 점으로 나타냅니다. 이렇게 한 번에 그리면 범례에 쓸 이름을 지정할 수 있습니다.
나머지는 앞의 코드와 동일합니다. 다음과 같은 결과가 나옵니다.
앞에서 본 예금은 변동성이 없었기에 SPY와 혼합 시 포트폴리오의 궤적이 직선으로 표현되었습니다. SPY와 TLT는 상관성이 있기에, 적절히 혼합하면 표준 편차가 줄어듭니다. 투자자에 따라서는 적절한 위험 수준으로 만족할만한 수익률을 얻을 수 있습니다. 참고: 이 연재에서는 표준 편차의 의미를 자세히 소개하지 않습니다.
예금도 표시하고, SPY와의 혼합 포트폴리오도 함께 그려보겠습니다. SPY와 예금을 혼합하면 포트폴리오 궤적은 직선이 되기에, 간단하게 선을 그려 나타내어 봅니다. SPY + TLT 혼합 포트폴리오를 그리는 코드 뒤에 아래 코드를 추가합니다.
plt.scatter(0, 0.02, label = 'Bank')
plt.plot([0, df_252.SPY.std()], [0.02, df_252.SPY.mean()],
ls = ':', label = 'SPY + Bank')
(0, 2%)에 은행 예금에 해당되는 점을 찍고, plt.plot()으로 선분을 그렸습니다. 첫 번째 인자 []가 [x1, x2]이고, 두 번째 인자 []가 [y1, y2]입니다. (0, 2%)에서 (SPY 표준 편차, SPY 평균)을 잇는 선분이 그어집니다.
df_252 DataFrame에는 SPY와 TLT 칼럼이 있습니다. df_252.SPY라고 지정하면 SPY 칼럼에 대해 이후 지정한 처리를 하게 됩니다. 땡땡이 점선으로 표시하기 위해 선 형식(ls; line style)을 콜론(:)으로 지정했습니다.
다음과 같은 결과가 나옵니다.
그래프를 보면 x축의 동일한 표준 편차에 대해 SPY + TLT의 평균 수익률이 SPY + Bank보다 위에 있는 경우가 있습니다. 예를 들어 표준 편차 10%에 대해 SPY + Bank는 8% 초반 수익률이지만, SPY + TLT는 9% 초반 수익률입니다. 투자자가 10% 수준의 표준 편차 위험을 고려하고 있었다면, SPY에 예금을 혼합하는 것보다 TLT를 혼합하는 것이 유리했다고 볼 수 있습니다.
평균-분산 그래프의 의미와 해석은 평균-분산(Mean-Variance) 그래프 해석 방법 및 주의 사항을 참고하기 바랍니다.
분산 투자로 수익률 분포에 어떤 변화가 생겼는지 살펴봅니다. SPY, TLT, 그리고 SPY와 TLT에 반반씩 투자한 포트폴리오의 수익률 분포를 그리는 코드입니다.
plt.hist(df_252, bins = 100, histtype = 'step', density = True, label = df_252.columns)
w = 0.5
port = df_252.SPY * w + df_252.TLT * (1 - w)
plt.hist(port, bins = 100, density = True, alpha = 0.5, label = 'SPY + TLT')
plt.gca().xaxis.set_major_formatter(PercentFormatter(xmax = 1, decimals = 0))
plt.legend(reverse = True)
plt.show()
SPY + TLT의 수익률 분포는 투명도(alpha)가 있는 채워진 형태로 표시해서 구분이 용이하도록 설정했습니다.
한눈에 보기에도 SPY + TLT는 SPY 및 TLT에 비해 수익률 분포가 가운데에 집중되어 있습니다. SPY와 TLT의 수익률이 약한 음의 상관성을 가지고 있었기 때문입니다.
왼쪽과 오른쪽을 보면 이러한 현상을 확연하게 드러납니다. SPY와 TLT는 각각 낮은 수익률 또는 높은 수익률을 거둔 빈도가 어느 정도 있었지만, SPY + TLT에서는 그 빈도가 현저하게 줄어들었습니다. SPY와 TLT는 약한 음의 상관성이 있었기 때문입니다. 어느 한 자산의 수익률이 높으면, 다른 자산의 수익률은 낮았기에, 변동성이 줄어든 것입니다.
정리하며
변동성이 있는 두 자산 및 두 자산의 혼합 포트폴리오를 평균-분산 그래프에 나타내어 보았습니다. 두 자산의 상관성에 따라 혼합 포트폴리오가 그려지는 궤적은 달라집니다. 서로 보완성이 강하면 즉 상관성이 낮으면, 위험이 크게 줄어들 수 있습니다. SPY와 TLT 혼합 포트폴리오로 그 현상을 관찰하였고, 수익률 분포에 어떤 변화가 발생했는지도 살펴보았습니다.
현실에서 투자자가 선택할 수 있는 자산의 수는 2개 이상인 경우가 대부분입니다. 3개의 자산에 분산 투자한 결과를 평균-분산 그래프를 포함한 여러 방식으로 표현하고 분석할 수 있다면, 그 이상의 자산에 대해서는 동일합니다. 계산량이 좀 더 많아지고, 결과가 복잡해 보이는 것뿐입니다. 이어지는 글에서 3개의 자산에 대한 분산 투자 효과를 평균-분산 그래프로 그려봅니다.
참고: 연재와 관련한 질문은 댓글로 남겨주시기 바랍니다. 답변을 드리거나 이후 연재에서 다룰 수 있도록 노력하겠습니다.
참고 서적: 왜 위험한 주식에 투자하라는 걸까? - 장기 투자와 분산 투자에 대한 통계학적 시각
이어지는 글: [파이썬 분석 8] 세 가지 자산에 분산 투자한 결과를 살펴보자 (+재사용을 위한 함수 정의)
연재 목록: 자산 배분 분석 방법 책 소개, 연재글 및 사례 모음 [목록]
함께 읽으면 좋은 글 (최신 글)
- [파이썬 분석 6] 산점도(scatter plot)에 자산의 특성을 나타내고, 예금과 혼합 효과도 표현해 보자
- [파이썬 분석 5] 환율을 적용해 보고 어떤 변화가 발생했는지 살펴보자
- [파이썬 분석 4] 수익률의 기초 통계량을 추출해 보고 확률 분포를 그려보자
- [파이썬 분석 3] 누적 수익률로 그래프로 그려 보자 (로그 스케일에 수익률을 표현하는 방법)
- [파이썬 분석 2] PR(배당 미고려)과 TR(배당 재투자) 주가 흐름을 그래프로 그려 보자 (FinanceDataReader 모듈 사용)
함께 읽으면 좋은 글 (인기 글)
'파이썬' 카테고리의 다른 글
[파이썬 분석 10] 사용자 포트폴리오를 나타내 보고, 특정 위치의 포트폴리오의 투자 비중을 살펴 보자 (1) | 2025.04.16 |
---|---|
[파이썬 분석 9] 세 가지 자산에 분산 투자한 결과를 분석해 보자 (+결과 재사용을 위한 함수 정의) (0) | 2025.04.15 |
[파이썬 분석 6] 산점도(scatter plot)에 자산의 특성을 나타내고, 예금과 혼합 효과도 표현해 보자 (0) | 2025.04.13 |
[파이썬 분석 5] 환율을 적용해 보고 어떤 변화가 발생했는지 살펴보자 (0) | 2025.04.13 |
[파이썬 분석 4] 수익률의 기초 통계량을 추출해 보고 확률 분포를 그려보자 (0) | 2025.04.12 |
[파이썬 분석 3] 누적 수익률로 그래프로 그려 보자 (로그 스케일에 수익률을 표현하는 방법) (0) | 2025.04.12 |
[파이썬 분석 2] PR(배당 미고려)과 TR(배당 재투자) 주가 흐름을 그래프로 그려 보자 (FinanceDataReader 모듈 사용) (1) | 2025.04.12 |
[파이썬 분석 1] 주가 흐름을 그래프로 그려 보자 (구글 코랩을 써 보자! 인공지능 너도 실수하는구나?) (1) | 2025.04.11 |