본문으로 건너뛰기
ModuQuant
팩터 투자 완전정복 · 고급 기법

팩터 직교화

서로 겹치는 팩터의 중복 효과를 걷어내는 방법

19 / 21편 · 약 5분 소요

팩터 간에는 상관관계가 존재합니다. 예를 들어 가치(저PBR)와 저변동성은 방어주에서 동시에 높은 점수를 받는 경향이 있어, 두 팩터를 단순 합산하면 해당 특성이 이중으로 카운트됩니다. 직교화는 팩터 간 공통 분산을 제거해 순수한 독립 신호만 추출합니다.

F_orthogonal = F_target − proj(F_target → F_control)

가장 많이 쓰이는 방법은 OLS 잔차 직교화입니다. 목표 팩터를 제어 팩터에 회귀한 뒤, 설명되지 않은 잔차를 새로운 순수 팩터로 사용합니다.

python
import pandas as pd
from sklearn.linear_model import LinearRegression

def orthogonalize(
    target: pd.Series,           # 순수하게 추출할 팩터 (예: 모멘텀)
    controls: pd.DataFrame,      # 제거할 영향 팩터들 (예: 시장베타, 섹터)
) -> pd.Series:
    """OLS 잔차 직교화 — controls의 영향을 target에서 제거"""
    X = controls.dropna()
    y = target.reindex(X.index).dropna()
    X = X.reindex(y.index)
    reg = LinearRegression().fit(X, y)
    residual = y - reg.predict(X)      # 잔차 = 순수 팩터 신호
    return pd.Series(residual, index=y.index, name=target.name + '_orth')

# 예시: 모멘텀에서 시장 베타·사이즈 영향 제거
mom_pure = orthogonalize(
    target   = df['momentum'],
    controls = df[['market_beta', 'log_mktcap']],
)

# 예시: 가치에서 섹터 더미 영향 제거 (섹터 중립 가치 팩터)
sector_dummies = pd.get_dummies(df['sector'], drop_first=True)
value_pure = orthogonalize(
    target   = df['value_score'],
    controls = sector_dummies,
)

직교화가 필요한 상황

  • 팩터 간 피어슨 상관계수 |r| > 0.4 이상이면 직교화 검토
  • 멀티팩터 합산 시 특정 섹터·스타일에 편향이 집중될 때
  • 리스크 모델에서 팩터 기여도(attribution)를 정확히 분리해야 할 때

주의 사항

직교화 후 팩터의 분포와 절대 규모가 변합니다. 반드시 재정규화(re-ranking)를 거친 뒤 합산하세요. 또한 직교화 자체도 과적합 원천이 될 수 있으므로 OOS 기간의 IC(Information Coefficient) 변화를 반드시 추적하세요.

이 글은 교육용 정보이며 특정 종목·ETF 의 매수·매도를 권유하지 않습니다. 과거 성과는 미래 수익을 보장하지 않습니다.

팩터 투자 완전정복 전체 목록