블랙-리터만 자산배분 전략

블랙-리터만 모델이란

블랙-리터만(Black-Litterman) 모델은 1990년 골드만삭스의 피셔 블랙과 로버트 리터만이 개발한 자산배분 프레임워크입니다. 마코위츠의 평균-분산 최적화가 가진 두 가지 치명적 문제를 해결하기 위해 탄생했습니다.

  • 입력 민감도 — 기대수익률을 조금만 바꿔도 최적 포트폴리오가 극단적으로 변합니다.
  • 집중 투자 — 소수 자산에 비현실적으로 높은 비중을 배분하는 경향이 있습니다.

블랙-리터만은 시장 균형 수익률을 출발점으로 삼고, 여기에 투자자의 주관적 전망(View)을 베이지안 방식으로 결합합니다. 그 결과 안정적이고 직관적인 자산배분이 가능해집니다.

모델의 핵심 구조

블랙-리터만 모델은 세 단계로 구성됩니다.

1단계 — 시장 균형 수익률(Implied Equilibrium Returns)

시장 시가총액 비중이 곧 “최적 포트폴리오”라고 가정하고, 역최적화(reverse optimization)로 균형 기대수익률을 역산합니다.

Π = δ · Σ · w_mkt
  • Π: 균형 기대수익률 벡터
  • δ: 리스크 회피 계수 (보통 시장 샤프비율 기반)
  • Σ: 자산 수익률 공분산 행렬
  • w_mkt: 시장 시가총액 비중

2단계 — 투자자 전망(Views) 설정

투자자의 주관적 전망을 행렬로 표현합니다.

  • P: 전망 행렬 (어떤 자산에 대한 전망인지)
  • Q: 전망 수익률 (얼마나 오를/내릴 것인지)
  • Ω: 전망 불확실성 (전망에 대한 확신도)

3단계 — 베이지안 결합

μ_BL = [(τΣ)⁻¹ + PᵀΩ⁻¹P]⁻¹ · [(τΣ)⁻¹Π + PᵀΩ⁻¹Q]

여기서 τ(tau)는 균형 수익률의 불확실성 스케일링 파라미터로, 보통 0.025~0.05 범위입니다.

파이썬 구현 — 전체 파이프라인

import numpy as np
import pandas as pd

class BlackLitterman:
    """블랙-리터만 자산배분 모델"""
    
    def __init__(self, cov_matrix, market_weights, 
                 risk_aversion=2.5, tau=0.05):
        self.Sigma = cov_matrix
        self.w_mkt = market_weights
        self.delta = risk_aversion
        self.tau = tau
        self.n_assets = len(market_weights)
        
        # 1단계: 균형 수익률 역산
        self.Pi = self.delta * self.Sigma @ self.w_mkt
    
    def set_views(self, P, Q, confidences):
        """
        투자자 전망 설정
        
        P: (K x N) 전망 행렬
        Q: (K,) 전망 수익률
        confidences: (K,) 각 전망의 확신도 (0~1)
        """
        self.P = np.array(P)
        self.Q = np.array(Q)
        
        # Omega: 전망 불확실성 (Idzorek 방법)
        # 확신도가 높을수록 Omega가 작아짐
        tau_sigma = self.tau * self.Sigma
        self.Omega = np.diag([
            (1 - c) / c * self.P[i] @ tau_sigma @ self.P[i].T
            for i, c in enumerate(confidences)
        ])
    
    def posterior_returns(self):
        """베이지안 결합으로 사후 기대수익률 계산"""
        tau_sigma = self.tau * self.Sigma
        tau_sigma_inv = np.linalg.inv(tau_sigma)
        omega_inv = np.linalg.inv(self.Omega)
        
        # 사후 정밀도 행렬
        M = tau_sigma_inv + self.P.T @ omega_inv @ self.P
        M_inv = np.linalg.inv(M)
        
        # 사후 기대수익률
        mu_bl = M_inv @ (
            tau_sigma_inv @ self.Pi + 
            self.P.T @ omega_inv @ self.Q
        )
        
        # 사후 공분산
        sigma_bl = self.Sigma + M_inv
        
        return mu_bl, sigma_bl
    
    def optimal_weights(self):
        """최적 포트폴리오 비중 계산"""
        mu_bl, sigma_bl = self.posterior_returns()
        
        # 역최적화: w* = (δΣ_BL)⁻¹ · μ_BL
        w_star = np.linalg.inv(
            self.delta * sigma_bl
        ) @ mu_bl
        
        # 비중 정규화 (합 = 1)
        w_star = w_star / w_star.sum()
        
        return w_star, mu_bl

실전 예시 — 암호화폐 포트폴리오

BTC, ETH, SOL, AVAX 4개 자산으로 블랙-리터만 자산배분을 수행하는 예시입니다.

# 자산 데이터 준비
assets = ["BTC", "ETH", "SOL", "AVAX"]

# 일일 수익률에서 연간 공분산 계산
returns = pd.read_csv("crypto_returns.csv", index_col=0)
cov_annual = returns[assets].cov() * 365

# 시가총액 비중 (예시)
market_caps = np.array([1.2e12, 3.5e11, 8e10, 1.5e10])
w_mkt = market_caps / market_caps.sum()
# [0.728, 0.212, 0.049, 0.009]

# 블랙-리터만 모델 초기화
bl = BlackLitterman(
    cov_matrix=cov_annual.values,
    market_weights=w_mkt,
    risk_aversion=2.5,
    tau=0.05
)

# 투자자 전망 설정
# 전망 1: ETH가 연 15% 수익률 (절대 전망)
# 전망 2: SOL이 BTC보다 연 10% 더 오름 (상대 전망)
P = np.array([
    [0, 1, 0, 0],       # ETH 절대 전망
    [-1, 0, 1, 0],      # SOL - BTC 상대 전망
])
Q = np.array([0.15, 0.10])
confidences = np.array([0.6, 0.4])  # ETH 전망 60% 확신

bl.set_views(P, Q, confidences)

# 최적 비중 계산
weights, expected_returns = bl.optimal_weights()

print("=== 블랙-리터만 최적 자산배분 ===")
for asset, w_m, w_bl, er in zip(
    assets, w_mkt, weights, expected_returns
):
    print(f"{asset}: 시장 {w_m:.1%} → BL {w_bl:.1%} "
          f"(기대수익 {er:.1%})")

# 출력 예시:
# BTC: 시장 72.8% → BL 58.2% (기대수익 12.3%)
# ETH: 시장 21.2% → BL 28.5% (기대수익 16.1%)
# SOL: 시장 4.9% → BL 10.8% (기대수익 22.7%)
# AVAX: 시장 0.9% → BL 2.5% (기대수익 18.4%)

ETH에 대한 긍정적 전망과 SOL의 상대적 강세 전망이 반영되어 BTC에서 ETH·SOL로 비중이 이동한 것을 확인할 수 있습니다. 동시에 마코위츠처럼 극단적 집중이 발생하지 않습니다.

전망 확신도(Confidence)의 영향

블랙-리터만의 가장 강력한 특징은 확신도에 따라 전망 반영 강도가 달라진다는 점입니다.

  • 확신도 100% → 전망이 그대로 반영됩니다. 사실상 마코위츠와 동일해집니다.
  • 확신도 50% → 시장 균형과 전망의 중간 정도로 수렴합니다.
  • 확신도 0% → 전망이 완전히 무시됩니다. 시장 균형 비중이 유지됩니다.

이 메커니즘 덕분에 “확신이 낮은 전망도 부담 없이 입력”할 수 있습니다. 기존 평균-분산 최적화에서는 불가능했던 정성적 판단의 정량적 통합이 가능해지는 것입니다.

리밸런싱 자동화와 결합

블랙-리터만을 주기적 리밸런싱과 결합하면 완전 자동화된 자산배분 시스템을 구축할 수 있습니다.

def bl_rebalance_signal(current_weights, bl_weights, 
                        threshold=0.03):
    """
    블랙-리터만 목표 비중과 현재 비중 차이가
    임계값을 초과하면 리밸런싱 신호 발생
    """
    diff = np.abs(current_weights - bl_weights)
    needs_rebalance = np.any(diff > threshold)
    
    if needs_rebalance:
        trades = bl_weights - current_weights
        return {
            "rebalance": True,
            "trades": trades,
            "max_drift": diff.max()
        }
    return {"rebalance": False}

def rolling_bl_allocation(returns_df, market_caps_df,
                          views_fn, lookback=180,
                          rebalance_freq="monthly"):
    """
    롤링 블랙-리터만 자산배분
    매월 공분산과 전망을 갱신하여 목표 비중 재계산
    """
    allocations = []
    dates = returns_df.resample("M").last().index
    
    for date in dates:
        window = returns_df.loc[:date].tail(lookback)
        cov = window.cov() * 365
        w_mkt = market_caps_df.loc[date].values
        w_mkt = w_mkt / w_mkt.sum()
        
        bl = BlackLitterman(cov.values, w_mkt)
        P, Q, conf = views_fn(date, window)
        
        if len(Q) > 0:
            bl.set_views(P, Q, conf)
        
        weights, _ = bl.optimal_weights()
        allocations.append(weights)
    
    return pd.DataFrame(
        allocations, index=dates,
        columns=returns_df.columns
    )

마코위츠 vs 블랙-리터만 비교

  • 출발점 — 마코위츠는 투자자가 모든 자산의 기대수익률을 직접 입력해야 합니다. 블랙-리터만은 시장 균형에서 시작하므로 “전망이 없으면 시장을 따른다”는 합리적 디폴트가 있습니다.
  • 안정성 — 마코위츠는 입력값 변화에 극도로 민감하지만, 블랙-리터만은 시장 균형이 앵커 역할을 해 안정적입니다.
  • 실용성 — “ETH가 15% 오를 것 같다(확신 60%)”처럼 자연스러운 언어로 전망을 입력할 수 있어 실무 활용도가 높습니다.
  • 확장성VaR 제약이나 섹터 제한 등 추가 제약 조건을 결합하기에도 블랙-리터만이 유리합니다.

실전 적용 시 주의사항

  • 시가총액 데이터 — 암호화폐는 시가총액 데이터가 비교적 투명하지만, 유통량 vs 총 공급량 차이에 주의하세요. 유통 시가총액을 사용하는 것이 정확합니다.
  • 공분산 추정 — 암호화폐는 상관관계가 시장 상황에 따라 급변합니다. 지수 가중 공분산이나 GARCH 기반 동적 공분산을 사용하면 더 정확합니다.
  • τ(tau) 설정 — 학계에서도 의견이 분분합니다. 0.025~0.05가 일반적이며, 1/T(관측치 수의 역수)를 사용하기도 합니다.
  • 전망 수 제한 — 전망이 너무 많으면 모델이 불안정해집니다. 확신이 높은 2~4개 전망에 집중하세요.
  • 공매도 제약 — 기본 모델은 공매도를 허용합니다. 실전에서는 비중 하한을 0으로 제약하는 경우가 많습니다.

마무리 — 전망과 시장의 균형

블랙-리터만 모델은 “시장은 보통 옳지만, 때로는 내 판단이 맞을 수 있다”는 균형 잡힌 철학을 수학적으로 구현한 것입니다. 전망이 없으면 시장을 따르고, 전망이 있으면 확신도에 비례해 반영합니다. 이 우아한 프레임워크 덕분에 퀀트 투자자는 정성적 통찰과 정량적 최적화를 자연스럽게 결합할 수 있습니다.

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux