고정 가중치 멀티팩터 전략은 시장 국면(regime)과 무관하게 동일한 팩터 비중을 유지합니다. 동적 가중치는 이를 극복해 시장 상황에 따라 각 팩터의 비중을 실시간으로 조절합니다.
상승장 (Bull Regime)
모멘텀·소형주 팩터의 가중치를 높입니다. 추세 추종이 유효한 구간에서 성장주·모멘텀주가 강세를 보이는 경향이 있습니다.
하락장 (Bear Regime)
저변동성·퀄리티·가치 팩터의 가중치를 높입니다. 방어적 성격의 팩터가 자본 보존에 유리합니다.
대표적인 동적 가중치 결정 방식 세 가지:
| 지표 | 설명 | 공식 |
|---|---|---|
| 시계열 모멘텀 | 각 팩터의 최근 12개월 성과 기반 비중 조절 (성과 추종) | w_f ∝ ret_f(12m) |
| 변동성 역가중 | 팩터별 최근 변동성이 낮을수록 높은 비중 부여 (리스크 패리티) | w_f ∝ 1/σ_f |
| 국면 탐지 모델 | HMM·경기선행지수 기반으로 Bull/Bear 국면을 분류 후 사전 정의 가중치 전환 | Regime → preset w |
python
import numpy as np
import pandas as pd
def dynamic_weights_vol_parity(
factor_returns: pd.DataFrame, # 컬럼: 팩터명, 인덱스: 날짜
lookback: int = 60, # 변동성 추정 윈도우 (영업일)
) -> pd.Series:
"""변동성 역가중 동적 가중치"""
recent = factor_returns.iloc[-lookback:]
vol = recent.std() # 팩터별 표준편차
inv_vol = 1.0 / vol
weights = inv_vol / inv_vol.sum() # 합계 = 1 정규화
return weights
# Universe Optuna 최적화와의 결합
# → 정적 가중치 초기값을 동적 가중치로 대체 후 미세 조정
base_w = dynamic_weights_vol_parity(factor_rets)
trial_w = {f: base_w[f] * trial.suggest_float(f, 0.5, 2.0)
for f in base_w.index}
# 이후 정규화 후 백테스트 평가과적합 위험
동적 가중치는 파라미터가 많아 과적합이 심각한 위험입니다. 반드시 Walk-Forward 검증(훈련 윈도우 슬라이딩)으로 OOS 성능을 확인하고, 단순 정적 가중치 벤치마크와 비교해 실질적 개선을 검증하세요.
Universe 플랫폼 적용 제안
Optimize 탭의 Optuna 탐색 결과를 분기별로 재실행해 가중치를 갱신하는 방식이 가장 현실적인 동적 가중치 구현입니다. 가중치 변화 이력을 DB에 저장하면 국면별 팩터 유효성 분석에도 활용할 수 있습니다.