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

섹터 중립화

특정 업종 쏠림 없이 팩터 효과만 남기는 방법

20 / 21편 · 약 5분 소요

팩터 포트폴리오는 특정 섹터에 구조적으로 집중될 수 있습니다. 예를 들어 저PBR 가치 팩터는 금융·조선·철강에 과도하게 쏠리고, 모멘텀 팩터는 IT·바이오에 집중되는 경향이 있습니다. 섹터 중립화는 이 편향을 제거해 팩터 순수 신호만으로 종목을 선별합니다.

중립화 미적용

저PBR 전략 → 금융주 50% 집중 → 금리 상승기에 금융 섹터 동반 하락 → 팩터 리스크가 아닌 섹터 리스크로 손실

섹터 중립화 적용

각 섹터 내에서 독립 랭킹 → 모든 섹터에서 고르게 상위 종목 선택 → 팩터 신호만 순수하게 반영된 포트폴리오

python
import pandas as pd

def sector_neutral_score(
    df: pd.DataFrame,
    score_col: str = 'score',
) -> pd.Series:
    """섹터 내 백분위 랭킹으로 섹터 중립 팩터 스코어 생성"""
    return (
        df.groupby('sector')[score_col]
        .rank(pct=True)      # 섹터 내 상대 순위 (0~1)
    )

df['value_sn']    = sector_neutral_score(df, 'value_score')
df['momentum_sn'] = sector_neutral_score(df, 'mom_score')

df['composite'] = (
    0.40 * df['value_sn'] +
    0.35 * df['momentum_sn'] +
    0.25 * df['quality_score']
)

def apply_sector_cap(
    selected: pd.DataFrame,
    max_sector_weight: float = 0.25,
) -> pd.DataFrame:
    """섹터별 비중 상한 적용"""
    max_count = int(len(selected) * max_sector_weight)
    return (
        selected
        .sort_values('composite', ascending=False)
        .groupby('sector')
        .head(max_count)
    )

KOSPI/KOSDAQ 섹터 분류 기준

한국거래소(KRX)의 GICS(글로벌 산업분류기준) 또는 FnGuide의 섹터 분류를 사용하세요. KOSDAQ 바이오는 헬스케어로 별도 분리해야 모멘텀 팩터의 바이오 과집중을 효과적으로 통제할 수 있습니다.

섹터 중립화 강도 선택

  • 소프트 중립화: 섹터 내 상대 랭킹만 사용, 섹터 간 비중은 자유
  • 하드 중립화: 벤치마크(KOSPI200 등) 섹터 비중에 포트폴리오를 고정
  • 섹터 뷰(view)가 없다면 소프트 중립화로 시작하는 것을 권장

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

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