팩터 간에는 상관관계가 존재합니다. 예를 들어 가치(저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) 변화를 반드시 추적하세요.