1. 마코위츠 모델(Markowitz Model) 개요
마코위츠 모델(Modern Portfolio Theory, MPT)은 해리 마코위츠(Harry Markowitz)가 1952년에 제안한 포트폴리오 최적화 이론으로, 투자자의 기대수익과 리스크를 고려하여 효율적 프론티어(Efficient Frontier)를 기반으로 최적의 자산 배분을 결정하는 방법론입니다.
(1) 마코위츠 모델의 기본 원리
- 분산 투자(Diversification): 서로 다른 자산을 조합하여 전체 포트폴리오의 리스크를 줄임
- 기대수익률(Expected Return): 각 자산의 예상 수익률을 기반으로 포트폴리오의 기대수익을 계산
- 포트폴리오 리스크(Portfolio Risk): 개별 자산의 변동성과 상관관계를 고려하여 포트폴리오의 총리스크를 계산
- 효율적 프론티어(Efficient Frontier): 동일한 리스크 수준에서 가장 높은 수익률을 제공하는 포트폴리오의 집합
(2) 포트폴리오 수익률과 리스크 공식
- 포트폴리오 기대수익률:
E(R_p) = w_1 * E(R_1) + w_2 * E(R_2) + ... + w_n * E(R_n)
- 포트폴리오 리스크(표준편차):
σ_p = sqrt( ΣΣ w_i * w_j * Cov(R_i, R_j) )
2. 효율적 포트폴리오 구성
(1) 효율적 프론티어(Efficient Frontier) 개념
효율적 프론티어는 주어진 리스크에서 가장 높은 기대수익을 제공하는 포트폴리오의 집합을 나타냅니다. 이를 그래프로 나타내면, 곡선의 아래쪽 포인트들은 비효율적인 포트폴리오이며, 곡선 위쪽의 포인트가 투자자가 선택할 수 있는 최적의 포트폴리오입니다.
(2) 포트폴리오 최적화 Python 구현
① 데이터 준비
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 자산 데이터 다운로드 (삼성전자, 현대차, 카카오)
tickers = ["005930.KQ", "005380.KQ", "035720.KQ"]
data = yf.download(tickers, start="2020-01-01", end="2024-01-01")["Close"]
# 로그 수익률 계산
returns = np.log(data / data.shift(1)).dropna()
② 포트폴리오 수익률과 리스크 함수 정의
# 포트폴리오 성과 측정 함수
def portfolio_performance(weights, mean_returns, cov_matrix):
port_return = np.dot(weights, mean_returns)
port_volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return port_return, port_volatility
③ 최적 포트폴리오 찾기
# 기대수익률과 공분산 행렬 계산
mean_returns = returns.mean()
cov_matrix = returns.cov()
# 목적 함수 (샤프 비율 최대화)
def negative_sharpe(weights, mean_returns, cov_matrix, risk_free_rate=0.02):
port_return, port_volatility = portfolio_performance(weights, mean_returns, cov_matrix)
sharpe_ratio = (port_return - risk_free_rate) / port_volatility
return -sharpe_ratio
# 제약 조건 (합이 1이어야 함)
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = [(0, 1) for _ in range(len(tickers))]
initial_weights = np.array([1/len(tickers)] * len(tickers))
# 최적화 실행
optimal_result = minimize(negative_sharpe, initial_weights, args=(mean_returns, cov_matrix),
method="SLSQP", bounds=bounds, constraints=constraints)
optimal_weights = optimal_result.x
print(f"최적 포트폴리오 비중: {optimal_weights}")
3. 리스크 분산 전략
(1) 자산군 분산 (Asset Class Diversification)
다양한 자산군(주식, 채권, 원자재, 암호화폐 등)에 분산 투자하여 리스크를 줄이는 전략입니다.
(2) 지역 분산 (Geographic Diversification)
한 국가의 경제 상황에 의존하지 않도록 글로벌 시장에 투자하는 전략입니다.
(3) 팩터 분산 (Factor Diversification)
- 가치(Value): 저평가된 종목 투자
- 모멘텀(Momentum): 상승 추세가 강한 종목 투자
- 저변동성(Low Volatility): 변동성이 낮은 종목 선호
4. 리밸런싱(Rebalancing) 전략
(1) 리밸런싱 개념
포트폴리오의 목표 비중을 유지하기 위해 일정 주기마다 자산을 매매하여 조정하는 과정입니다.
(2) 리밸런싱 방법
- 주기적 리밸런싱(Periodic Rebalancing): 일정한 주기(분기별, 연간)로 포트폴리오 조정
- 밴드 기반 리밸런싱(Band Rebalancing): 특정 자산의 비중이 목표 비중에서 일정 범위를 벗어나면 조정
(3) 리밸런싱 Python 구현
# 목표 비중 설정 (최적 포트폴리오 비율)
target_weights = optimal_weights
current_values = data.iloc[-1] * target_weights
portfolio_value = current_values.sum()
# 현재 비중 계산
current_weights = current_values / portfolio_value
# 리밸런싱 필요 여부 확인
threshold = 0.05 # 목표 비중 대비 ±5% 이상 차이나면 리밸런싱
rebalance_needed = np.abs(current_weights - target_weights) > threshold
print("리밸런싱 필요 여부:", rebalance_needed)
5. 결론
마코위츠 모델을 활용하면 최적의 포트폴리오를 구성할 수 있으며, 분산 투자와 리밸런싱 전략을 통해 장기적인 수익률을 개선할 수 있습니다.
포트폴리오 최적화를 위한 체크리스트
- 자산군, 지역, 팩터를 고려한 분산 투자
- 효율적 프론티어를 활용한 최적 포트폴리오 구축
- 리스크 대비 수익률(샤프 비율) 분석
- 정기적인 리밸런싱을 통해 목표 비중 유지
이러한 전략을 통해 보다 안정적인 장기 투자 성과를 기대할 수 있습니다.