자산배분

해리 마코위츠의 포트폴리오 최적화

unius 2022. 10. 23. 00:13
728x90
반응형

나는 현재 미국시장의 개별주식과 나스닥3배 레버리지 ETF(TQQQ)에 투자하고 있다. 이글을 작성하는 시점에 TQQQ ETF의 수익률은 -40% 근처를 헤매고 있을 정도로 처참하다. 개별주식은 애플, 마이크로소프트, 엔비디아 3개 종목에 투자하고 있고 역시 손실을 보고 있지만 TQQQ 만큼 처참하지는 않다. 다행히 환율 효과로 인해 지난 9월 결산글에서도 밝혔듯이 원화 기준 수익률은 견딜만한 수준이다.

 

(9월 결산)미국주식

미국시장의 주식투자를 위해서 지난 3월부터 꾸준히 환전을 하며 본격적으로 4월부터 투자를 시작했다. 벌써 미국주식에 입문한지 6개월이 흘렀다니 시간은 참 빨리 간다. 4월에 투자를 시작할

myportfolio.tistory.com

TQQQ 기본적으로 나스닥 지수의 변동성을 3배로 추종하는 ETF 이므로 나스닥 전체시장의 개별종목의 시가총액 비중별로 자동적으로 투자가 되는 것이다. 문득 내가 투자하고 있는 3개의 개별종목의 투자비중은 어떻게 하는 것이 최적일까? 하는 생각이 들었다.

인터넷을 폭풍검색 해본 결과 해리 마코위츠(Harry Markowits)의 포트폴리오 이론을 접하게 되었다. 분산투자의 중요성을 말할 때 빠지지 않는 오래된 증시의 격언인 '계란을 한 바구니에 담지 말라' 는 말의 이론적 토대가 되는 현대 포트폴리오 이론의 창안자라고 한다.


간단하게 원리를 요약해보면 포트폴리오를 구성하는 개별종목의 기대수익률과 변동성[각주:1] 그리고 종목간 상관계수를 사용하여 개별종목의 비중에 따른 포트폴리오의 기대수익률과 표준편차를 계산하여 투자자가 인내할 수 있는 리스크 수준에서 최적의 기대수익률을 제공하는 포트폴리오 집합을 찾을 수가 있다는 것이다. 아래의 수식을 참고하도록 하자.

 

포트폴리오 수익률

$ R_{p} = Σ_{i=1}^{k}w_{i}R_{i} = \textbf{w}^{\textbf{T}} \textbf{R} $

  • $w_{i}$ : 자산$_{i}$ 비중
  • $R_{i}$ : 자산$_{i}$ 기대수익률
  • $w^{T}$ : 자산 비중 전치행렬


포트폴리오 변동성

$ \sigma_{p} = \sqrt{Σ_{i=1}^{k}Σ_{j=1}^{k}w_{i}w_{j}σ_{i}σ_{j}ρ_{ij}} = \sqrt{Σ_{i}^{k}Σ_{j}^{k}w_{i}w_{j}σ_{ij}} = \sqrt{\textbf{w}^{\textbf{T}} \textbf{Σ} \textbf{w}} $

  • $σ_{i}$ : 자산$_{i}$ 표준편차
  • $σ_{ij}$ : 자산$_{ij}$ 공분산
  • $ρ_{ij}$ : 자산$_{ij}$ 상관계수
  • $Σ$ : 공분산 행렬

 

공분산행렬

\begin{pmatrix} \sigma_{1}^{2} & \sigma_{1}\sigma_{2}\rho_{12} & \cdots & \sigma_{1}\sigma_{n}\rho_{1n} \\ \sigma_{2}\sigma_{1}\rho_{21} & \sigma_{2}^{2} & \cdots & \sigma_{2}\sigma_{n}\rho_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{n}\sigma_{1}\rho_{n1} & \sigma_{n}\sigma_{2}\rho_{n2} & \cdots & \sigma_{n}^{2} \end{pmatrix}

 

파이썬으로 그린 그래프를 보자. 그래프에서 각각의 점들은 몬테카를로 시뮬레이션을 통해 애플, 마이크로소프트, 엔비디아의 비중을 서로 다르게 구성한 20,000개 포트폴리오들의 리스크에 따른 기대수익률을 나타낸 것이다. 그래프에서 가장 왼쪽의 최소 변동성을 갖는 지점들을 따라서 연결한 가상의 선이  효율적 투자선(Efficient Frontier)으로 가장 효율이 높은 포트폴리오들을 이어 놓은 것이다. 즉, 효율적 투자선 상의 포트폴리오들은 동일 리스크 대비 최대 수익 및 동일 수익 대비 최소위험을 갖는 포트폴리오 집합을 의미한다.

효율적 투자선 상에 있는 포트폴리오 중에서 어떤 것을 선택할 지는 투자자가 인내할 수 있는 리스크와 기대수익률에 따른 선택이 되는 것이다. 여기서 투자자 선택의 고민을 줄여줄 수 있는 지표가 하나 더 있다. 노벨상 수상자인 윌리엄 샤프가 고안한 샤프지수를 참조하는 방법이 있다. 샤프지수에 대한 글은 다음에 이어서 작성할 예정이고 다음글을 통해서 현재 내가 투자하는 개별종목 포트폴리오의 최적의 비중을 확인해보고 포트폴리오 최적화 글을 마무리 하고자 한다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf

# 애플,마이크로소프트,엔비디아 주가 다운로드
df=yf.download("AAPL MSFT NVDA", start="1999-01-01", end="2022-10-13")
orgn_df = df.copy()
# 수정주가 컬럼만 남기고 다른 컬럼 제거
df.drop(['Open','High','Low','Close','Volume'], inplace=True, axis=1)
adj_df = df.droplevel(0, axis=1).dropna()

daily_ret = adj_df.pct_change()
annual_ret = daily_ret.mean() * 252
# 공분산, 종목별 일간변동율간의 상관관계, 0보다 크면 양의 상관관계, 0보다 작으면 음의 상관관계, 0이면 상관없음 -> 공분산을 표준화한 것이 상관계수
daily_cov = daily_ret.cov()
annual_cov = daily_cov * 252

port_ret = []
port_risk = []
port_weights = []

# 몬테카를로 시뮬레이션을 이용해 2만개의 포트폴리오 생성
for idx in range(20000):
  weight = np.random.random(len(adj_df.columns))
  # weight 합이 1이 되도록 비중 계산
  weight /= np.sum(weight)
  # 포트폴리오 수익률
  returns = np.dot(weight, annual_ret)
  # 포트폴리오 리스크
  risk = np.sqrt(np.dot(weight.T, np.dot(annual_cov, weight)))

  port_ret.append(returns)
  port_risk.append(risk)
  port_weights.append(weight)

portfolio = {'Returns':port_ret, 'Risk':port_risk, 'Sharpe':sharpe_ratio}
for idx, s in enumerate(adj_df.columns):
  #print(f'idx : {idx:d}')
  portfolio[s] = [weight[idx] for weight in port_weights]

final_df = pd.DataFrame(portfolio)

plt.figure(figsize=(10,7))
plt.scatter(x=final_df['Risk'], y=final_df['Returns'], c=final_df['Sharpe'], marker='o')
plt.title('Portfolio Optimization')
plt.xlabel('Risk')
plt.ylabel('Expected Returns')
plt.show()

위 코드는 김황후 저자의 파이썬 증권 데이터 분석을 참고하였다.

  1. 주가의 리스크를 의미하며 실제수익률이 기대수익률에서 차이가 나는 정도인 표준편차를 사용한다 [본문으로]
728x90
반응형