포트폴리오 최적화에서 Mean-Variance·CVaR·Black-Litterman 선택하기
Mean-Variance, CVaR, Black-Litterman의 위험 관리 방식과 제약조건 설계, 백테스트 및 운영 검증 기준을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
수익률 추정 하나로 배분 결과가 흔들린다
기관, 운용사, 로보어드바이저의 포트폴리오 최적화는 기대수익과 위험을 계산하는 방식만으로 끝나지 않는다. 공분산의 추정오차, 손실 꼬리 구간의 취급, 투자자 견해의 반영 방식에 따라 같은 자산 집합에서도 전혀 다른 가중치가 나온다.
Markowitz Mean-Variance, CVaR(Conditional Value at Risk), Black-Litterman은 이 문제를 서로 다른 출발점에서 다룬다. 선택할 때는 목표와 데이터 조건, 운용 제약을 함께 봐야 한다.
Markowitz Mean-Variance
Mean-Variance는 기대수익과 공분산으로 분산을 최소화하거나 샤프비율을 최대화하는 포트폴리오를 구한다. 효율적 프론티어가 이 접근의 기반이다.
수익률의 정규성과 2차 모멘트의 충분성을 가정한다. 기대수익과 공분산의 작은 추정오차에도 결과가 민감하게 바뀔 수 있으므로, 공분산 수축과 정규화가 필요하다.
CVaR (Conditional Value at Risk)
CVaR는 신뢰수준 α에서 꼬리 손실의 조건부기대치를 최소화한다. 평균적 위험보다 손실이 큰 구간을 통제하려는 목적에 맞는다.
선형계획(LP)으로 정식화할 수 있으며, 비정규·비대칭 분포에도 대응한다. 대신 결과의 신뢰도는 시나리오 품질과 커버리지 설계에 크게 좌우된다.
Black-Litterman
Black-Litterman은 시장균형에서 얻은 사전 수익률과 투자자 견해를 베이지안 방식으로 결합해 사후 기대수익을 추정한다. 시장가치 가중의 균형수익을 사전값으로 두고, 방향·상대 비교·불확실성 행렬(Ω)로 견해를 표현한다.
견해를 그대로 기대수익에 얹는 방식보다 결과가 안정적이며, 과도한 코너 솔루션을 완화하는 데 쓰인다.
최적화 전에 설계해야 할 입력과 제약
기대수익은 단순 평균, 지수평활, 팩터 리그레션, Black-Litterman 사후 수익 추정으로 만들 수 있다. 위험모형에는 공분산 수축(Ledoit–Wolf), 저순위 근사, 팩터 공분산을 적용할 수 있다.
목적함수도 운용 목표에 맞춰 정한다. Mean-Variance에서는 위험 최소화, 샤프 최대화, 추적오차 최소화를 선택할 수 있고, CVaR에서는 CVaR 최소화 또는 CVaR 제약 아래 기대수익 최대화를 설정한다. 롱온리·레버리지, 섹터·자산군 한도, 턴오버·거래비용 페널티 같은 제약은 실제 주문 가능 범위를 결정한다.
L2(L2-regularization)는 가중치 분산을 줄이고, L1은 희소성과 거래비용 근사에 사용된다. 리샘플링·부트스트랩·강건 최적화는 추정오차에 대한 내성을 높이는 수단이다.
검증에는 히스토리컬·부트스트랩·몬테카를로·스트레스 시나리오를 사용한다. 워크포워드 또는 롤링 백테스트에는 슬리피지와 스프레드 같은 프릭션을 반영해야 한다. 운영 단계에서는 리밸런싱 주기와 턴오버 캡, 시장폐쇄·실행 실패 예외를 규정하고, 효율·드리프트·트레이드 기준의 성과 귀속과 리스크 한도도 모니터링한다.
방법론별로 달라지는 트레이드오프
| 항목 | Markowitz Mean-Variance | CVaR | Black-Litterman |
|---|---|---|---|
| 성능(샤프/비용 대비) | 중간(추정오차 민감) | 테일 리스크 개선, 샤프 안정 | 안정적 샤프, 견해 품질 의존 |
| 확장성(자산 수 증가) | 공분산 추정 부담 증가 | 시나리오 수에 비례 증가 | 시장정보 활용, 규모 확장 용이 |
| 일관성(추정 견고성) | 낮음→수축 필요 | 시나리오 의존, 중간 | 높음(사전·견해 융합) |
| 안정성(드로우다운) | 중간 | 높음 | 중간~높음 |
| 운영 편의(튜닝 난이도) | 낮음 | 중간(α·시나리오) | 중간~높음(Ω·τ 설정) |
운용 목적에 맞춘 적용 방식
연금의 코어-위성 운용에서는 코어를 Black-Litterman으로 시장균형 기반의 안정 배분에 두고, 위성에는 Mean-Variance로 초과수익 전략을 배치할 수 있다. 자산군·ESG 한도를 적용하고, 연 4회 리밸런싱과 턴오버 20% 캡을 둔다.
헤지펀드의 테일 리스크 관리에서는 CVaR α=95% 최소화로 크레딧·상품 비중을 조절할 수 있다. 금리 급등과 유가 급락 스트레스 시나리오를 병행하고, 거래비용 L1 페널티와 익스포저 상·하한을 포함한다.
은행 ALM·커버드본드 풀에서는 듀레이션·키레이트 제약 아래 Mean-Variance로 TE(추적오차)를 최소화한다. 금리 시나리오 기반 CVaR 제약을 함께 적용해 규제 리스크 한도를 준수할 수 있다.
로보어드바이저는 Black-Litterman으로 테마와 리스크 선호 같은 사용자 견해를 반영한다. 소액 분할 체결을 고려해 라운딩과 최소단위 제약도 함께 둔다.
Python으로 구현하는 최적화 흐름
전제조건은 다음과 같다.
- Python 3.11, numpy>=1.26, pandas>=2.0, cvxpy>=1.3, PyPortfolioOpt>=1.5, scikit-learn(optional), yfinance(optional)
- 리턴 데이터: T×N 행렬, 일간 또는 월간 단위. 수수료·슬리피지 별도 모델링 권장.
PyPortfolioOpt로 효율적 프론티어 계산
# pip install pandas numpy pypfopt yfinance
import pandas as pd, numpy as np, yfinance as yf
from pypfopt import EfficientFrontier, risk_models, expected_returns, objective_functions
tickers = ["SPY","EFA","AGG","GLD","VNQ"]
prices = yf.download(tickers, period="5y", interval="1d")["Adj Close"].dropna()
rets = prices.pct_change().dropna()
mu = expected_returns.mean_historical_return(prices, frequency=252)
cov = risk_models.CovarianceShrinkage(prices, frequency=252).ledoit_wolf()
ef = EfficientFrontier(mu, cov, weight_bounds=(0.0, 0.6))
ef.add_objective(objective_functions.L2_reg, gamma=10) # 가중치 분산 완화
ef.add_constraint(lambda w: w[2] >= 0.1) # 예: AGG 최소 10%
weights = ef.max_sharpe()
cleaned = ef.clean_weights()
perf = ef.portfolio_performance(verbose=True)
print(cleaned)
공분산에는 수축을 적용한다. 장기 평균 수익을 추정할 때는 지수평활 또는 Black-Litterman 사후 수익을 사용할 수 있다. 제약조건은 선형화해 수치안정성을 확보한다.
CVXPY에서 CVaR를 최소화하는 시나리오 모델
# pip install cvxpy pandas numpy
import cvxpy as cp, numpy as np, pandas as pd
# R: T×N 수익률 행렬, 여기서는 예시로 난수 또는 과거 리턴 사용
np.random.seed(0)
T, N = 1000, 5
R = np.random.normal(0.0003, 0.01, size=(T, N)) # 예시용
alpha = 0.95
w = cp.Variable(N)
t = cp.Variable() # VaR 근사 변수
u = cp.Variable(T, nonneg=True)
loss = -R @ w # 손실 시나리오
cvar = t + (1/(1-alpha))/T * cp.sum(u)
constraints = [
cp.sum(w) == 1,
w >= 0, # 롱온리
u >= loss - t, # u_t >= L_t - t
# 기대수익 하한 예: 일 0.02% 이상
cp.sum(cp.multiply(R.mean(axis=0), w)) >= 0.0002
]
prob = cp.Problem(cp.Minimize(cvar), constraints)
prob.solve(solver=cp.ECOS)
print("status:", prob.status)
print("CVaR:", cvar.value, "weights:", w.value.round(4))
시나리오 수 T를 충분히 확보하고, 비정상성에는 부트스트랩·블록부트스트랩을 적용한다. 거래비용은 + lambda_ * cp.norm1(w - w_prev)와 같이 L1 페널티로 근사할 수 있다.
Black-Litterman 사후 수익률로 QP 구성
# pip install pypfopt pandas numpy
import numpy as np, pandas as pd
from pypfopt import risk_models, EfficientFrontier
from pypfopt.black_litterman import BlackLittermanModel, market_implied_prior_returns
# 입력: 가격, 시가총액, 견해(P, Q, Ω)
prices = ... # 가격 DataFrame
caps = ... # 시가총액 Series (index=티커)
cov = risk_models.CovarianceShrinkage(prices).ledoit_wolf()
market_weights = caps / caps.sum()
delta = 2.5 # 시장 리스크 선호 파라미터(캘리브레이션)
pi = market_implied_prior_returns(market_weights, delta, cov)
# 견해 예시: SPY가 EFA 대비 2%p 아웃퍼폼
P = pd.DataFrame([[1, -1] + [0]*(len(prices.columns)-2)], columns=prices.columns)
Q = pd.Series([0.02], index=[0])
Omega = np.diag([0.002**2]) # 견해 불확실성
bl = BlackLittermanModel(cov, pi=pi, P=P, Q=Q, omega=Omega, tau=0.05)
mu_bl = bl.bl_returns() # 사후 기대수익
cov_bl = bl.bl_cov() # 조정 공분산
ef = EfficientFrontier(mu_bl, cov_bl, weight_bounds=(0, 0.6))
weights = ef.max_sharpe()
print(ef.clean_weights())
τ(사전 불확실성)와 Ω(견해 분산)는 캘리브레이션이 필요하다. 히스토리컬 변동성 기준 또는 Idzorek 방식을 적용할 수 있다. 견해는 절대·상대·집단(Sector)으로 표현할 수 있으며, 견해 불확실성을 과소 추정하지 않는다.
결과를 주문으로 넘기기 전 확인할 항목
공분산이 비양의정이면 수축(Ledoit–Wolf), 정규화(diagonal loading), 팩터 공분산 대체를 검토한다. 가중치가 비현실적인 코너 솔루션으로 쏠릴 때는 L2/L1 정규화와 가중치·섹터 상한, 최소보유·라운딩 제약을 적용한다.
시나리오 커버리지가 부족하면 블록부트스트랩과 스트레스 시나리오를 추가하고, 아웃라이어 클리핑 규칙을 명시한다. 과최적화를 막기 위해 워크포워드 검증, 프릭션을 포함한 백테스트, 파라미터 민감도 분석을 수행한다.
리밸런싱 주기·턴오버 캡·거래단위를 제약에 포함하고, 실패했을 때는 부분 체결 또는 익일 이월 같은 백오프 규칙을 정의한다.
기대할 수 있는 운용 변화
CVaR 기반 전략에서는 MDD 1535% 감소 가능성이 있다. 정규화·제약을 적용하면 연간 턴오버가 1530% 감소할 수 있다.
Black-Litterman 도입 시 샤프비율은 1025%p 개선되고 변동성은 515%p 축소될 가능성이 있다. 리스크 한도·섹터 캡·ESG 제약 안에서 운용의 일관성도 강화된다.
수치는 자산군·기간·프릭션 가정에 따라 상이. 독립 검증 필요.
모델 선택보다 운영 설계가 남긴다
Mean-Variance는 간결하고 표준화된 접근이지만 공분산 수축과 정규화를 함께 적용해야 한다. CVaR는 테일 리스크 관리에 적합하며 시나리오 설계와 α 선택이 결과를 좌우한다. Black-Litterman은 시장균형과 견해를 결합해 기대수익 추정을 안정화하고 코너 솔루션을 줄인다.
프로덕션 파이프라인은 데이터 검증, 추정, 최적화, 사후처리, 주문, 모니터링까지 자동화한다. 워크포워드와 프릭션을 포함한 성능 검증을 거친 뒤 단계적으로 롤아웃한다.