Advanced Neutralization

강병오·2026년 3월 7일
  • 중립화 방법
    이 페이지는 옵션 IV 차이 알파를 예시로 들면서 중립화(neutralization)를 단순 설정 옵션이 아니라 코드 레벨에서 더 정교하게 구현하는 방법을 설명하는 튜토리얼로, 기본 Settings에서 industry neutralization을 켜는 것은 산업 기준으로만 일괄 중립화하는 전역 옵션인 반면 여기서는 group_neutralize(x, group) 연산자를 사용해 사용자가 직접 정의한 그룹(예: bucket(rank(historical_volatility_120), range="0.1,1,0.1")로 만든 변동성 그룹)에 대해 신호를 그룹 내 표준화함으로써 “고변동성 종목이라 IV 차이가 큰 효과”를 제거하고 순수한 옵션 수요 차이만 남기자는 취지이며, 즉 세팅 중립화는 정적·제한적이고 이 페이지는 커스텀 그룹 기반의 동적 중립화를 코드로 구현하는 방법을 가르치는 것이다. 알파 아이디어의 순수한 초과수익을 측정하는 것이 목표이므로 중립화를 한다고 해서 평균수익률이나 마진이 늘지는 않고 오히려 줄 수 있음. 다만 sharpe가 올라갈 수는 있음!정확히는 “중립화”라는 단일한 메트릭이 있는 게 아니라 어떤 요인에 대해 중립화하느냐에 따라 수학적 형태가 달라지는 일반 개념이고, 시장 중립화는 전체 베타 노출을 0으로 맞추는 것이므로 롱·숏 총액을 맞추거나 베타를 상쇄하는 방식으로 구현되며, 산업 중립화는 산업 더미 요인에 대한 노출을 제거하는 것이므로 산업 평균을 빼거나 그룹 내 표준화하는 형태로 구현되고, 규모·변동성·스타일 팩터 중립화도 각각 해당 요인에 대한 공통 성분을 제거하는 방식으로 달라지기 때문에 “중립화”는 특정 공식이 아니라 특정 요인에 대한 노출을 0으로 만드는 목적 함수라고 이해하는 게 가장 정확하다.

  • group neutralize/ group datafields
    group_neutralize(x, group)에서 첫 번째 인자 x에는 네가 설계한 알파 신호(예: iv_difference)를 넣고, 두 번째 인자 group에는 그 신호에서 제거하고 싶은 공통 요인을 정의하는 그룹 변수(예: industry, sector, 또는 bucket(rank(historical_volatility_120), ...)로 만든 변동성 그룹)를 넣는 것이며, 그러면 해당 그룹 내부에서 평균을 제거(또는 표준화)해 그 그룹 요인에 대한 노출이 사라진 “정제된 알파”가 반환된다.

  • bucket operator
    If there's no suitable existing group for your idea, you can create your own using the bucket operator
    - bucket(X, range="{start},{end},{step}")

  • density operator
    맞다, 기본 제공되는 sector·industry 같은 그룹 데이터필드는 보통 이미 촘촘하게 설계되어 있어 densify가 꼭 필요한 경우는 많지 않지만, 문제는 “데이터 정의상 가능한 그룹 수”와 “그날 실제로 존재하는 그룹 수”가 다를 수 있다는 점이고, 특히 exchange 코드처럼 값 범위가 크거나, relationship·ID 기반 필드, 또는 bucket을 잘못 설정해 수백·수천 개 구간을 만든 경우에는 특정 날짜에 실제로 쓰이는 값이 극히 일부일 수 있어 내부적으로 많은 빈 버킷을 만들게 되며, densify는 이런 상황에서 실제로 존재하는 고유 값들만 연속 인덱스로 재매핑해 계산 효율을 높이는 안전장치라서 항상 필요한 건 아니지만 희소·고차원 그룹을 쓸 때 유용한 최적화 도구라고 이해하면 정확하다.

  • 예시
    historical_volatility 기준으로 종목을 비슷한 성격끼리 묶고, 그 안에서만 IV 차이를 비교하면 “원래 잘 흔들리는 종목 효과”를 제거하고 같은 조건 내에서 콜·풋 쏠림만 남길 수 있다. 즉, IV를 또 다른 변동성으로 덮는 게 아니라, ‘기본 체질 차이’를 빼고 ‘옵션 시장의 추가 베팅’만 보겠다는 구조다.
    맞다, turnover를 줄인다는 건 “신호 값이 자주 크게 바뀌지 않게 해서 포트폴리오 비중 조정이 과도하게 발생하지 않도록 하라”는 의미이고, 1000억을 운용한다고 하면 매일 새로 전량 매수·매도하는 게 아니라 그날 산출된 알파 비중에 맞추기 위해 기존 보유분을 조정(rebalance)하는데, 그룹이 짧은 기간 변동성 기준으로 자주 바뀌면 어떤 종목이 속한 버킷이 매일 달라져 중립화 결과도 흔들리고 목표 비중이 계속 크게 변해 거래량이 급증하게 되므로, 120·180일처럼 긴 기간을 써 그룹을 안정화하면 목표 비중 변화폭이 줄어들고 그에 따라 매매 회전율(turnover)도 낮아진다는 뜻이다.
    iv_difference = implied_volatility_call_10 - implied_volatility_put_10

std_group = bucket(rank(historical_volatility_180), range"0.1,1,0.1");

group_neutralize(iv_difference, std_group)
group_neutralize(signal, group)는 코드 레벨에서 이미 특정 그룹(예: vol bucket, industry 등)에 대해 단면 평균을 0으로 만드는 전처리를 수행하는 것이고, Settings의 Neutralize는 시뮬레이션 엔진이 포트폴리오 구성 단계에서 전체 팩터(예: Market, Sector, Industry 등)에 대해 추가로 노출을 제거하는 리스크 컨트롤 옵션이므로 서로 다른 층위에서 작동한다; 따라서 코드에서 vol bucket 기준으로 group_neutralize를 했더라도 Settings에서 Sector/Industry Neutralize를 켜두면 그 기준으로 한 번 더 중립화가 적용되며, 만약 코드에서 이미 동일한 기준(예: industry)으로 중립화했다면 Settings에서도 같은 기준을 켜는 것은 이중으로 제약을 거는 셈이라 알파 분산이 과도하게 줄 수 있으니 보통은 코드에서 커스텀 그룹 중립화 → Settings에서는 Market 정도만 유지하거나, 반대로 코드에서는 원신호 유지 → Settings에서 표준 팩터 중립화처럼 역할을 분리하는 것이 구조적으로 깔끔하다.

1. 목적 정의: 이 프로세스의 목적은 내가 만든 롱-숏 기반 시그널이 의도한 알파를 반영하는지, 아니면 시장·사이즈·밸류·모멘텀·변동성·섹터 같은 공통 팩터에 무의식적으로 노출되어 불필요한 변동성을 만들어내는지를 점검하는 데 있다. 핵심 질문은 두 가지다. 첫째, 내 포지션 자체가 특정 팩터를 구조적으로 길게 혹은 짧게 들고 있는가? 둘째, 내 포트폴리오 수익률이 실제로 특정 공통 팩터 수익률에 의해 설명되는가? 이 두 질문에 답해야 중립화가 제대로 되었는지 판단할 수 있다. 2. 전체 구조: 검정은 반드시 단면 베타 확인시계열 베타 확인으로 나누어 수행한다. 단면 분석은 특정 날짜에 내가 들고 있는 종목별 포지션이 어떤 팩터 노출값과 연결되는지를 확인하는 과정이고, 시계열 분석은 그렇게 형성된 포트폴리오의 일별 수익률이 공통 팩터 수익률에 의해 얼마나 설명되는지를 보는 과정이다. 전자는 “내가 무엇을 들고 있느냐”를 점검하고, 후자는 “그 결과 어떤 위험을 실제로 감수했느냐”를 점검한다. 3. 입력 데이터 준비: 분석을 위해서는 최소한 네 가지 데이터가 필요하다. 첫째, 날짜별 종목 단위의 원시 시그널 또는 최종 포지션 값. 둘째, 다음 기간 수익률 등으로 계산된 실현 종목 수익률. 셋째, 같은 날짜 기준의 팩터 노출 데이터셋으로, 일반적으로 사이즈, 밸류, 모멘텀, 변동성, 베타, 유동성, 섹터 정보 등이 포함된다. 넷째, 포트폴리오 수익률을 설명하기 위한 공통 팩터 수익률 시계열로, Fama-French 3 Factor, 5 Factor, 그리고 필요시 Momentum factor를 사용한다. 4. 포지션 정규화 단계: 베타 확인 전에 포지션을 비교 가능한 형태로 맞춰야 한다. 보통 각 날짜마다 포지션의 평균을 0에 가깝게 맞추고, 롱과 숏이 균형을 이루도록 스케일링하며, 총 익스포저가 날짜마다 과도하게 달라지지 않도록 정규화한다. 이 단계를 건너뛰면 이후 회귀에서 추정된 계수가 단순한 스케일 차이 때문인지 실제 노출 때문인지 분리하기 어려워진다. 5. 단면 베타 확인: 각 날짜마다 종목별 포지션을 종속변수로 두고, 같은 날짜의 종목별 팩터 노출값들을 설명변수로 두는 단면 회귀를 수행한다. 이 단계의 목적은 “오늘 내가 잡은 포지션이 사실상 소형주 편향인지, 고변동성 편향인지, 특정 섹터 편향인지”를 보는 것이다. 만약 어떤 팩터의 계수가 여러 날짜에 걸쳐 지속적으로 같은 방향으로 나타난다면, 이는 해당 팩터가 포지션 형성 과정에 구조적으로 섞여 있다는 신호다. 특히 절대값이 큰 계수가 반복되고, 그 평균 계수의 t-stat이 유의하다면 우연이라기보다 지속적 노출로 해석할 수 있다. 6. 단면 분석의 해석 원칙: 여기서 중요한 것은 하루치 결과가 아니라 계수의 시계열적 지속성이다. 특정 날짜에만 사이즈 계수가 컸다면 시장 상황의 일시적 영향일 수 있지만, 거의 모든 기간에 걸쳐 양(+)의 사이즈 계수가 반복된다면 네 전략은 의도와 무관하게 소형주 또는 대형주 성향을 안고 있다고 볼 수 있다. 섹터 더미 계수가 자주 튄다면 산업 중립화가 부족한 것이고, 변동성 팩터 계수가 반복되면 고변동성 종목을 매수하거나 저변동성 종목을 매도하는 구조가 숨어 있을 가능성이 높다. 7. 포트폴리오 수익률 생성: 단면 점검이 끝나면 각 날짜의 포지션과 이후 종목 수익률을 결합해 포트폴리오 수익률 시계열을 만든다. 이 수익률은 전략이 실제로 벌어들인 성과를 나타내며, 이후 시계열 베타 분석의 입력값이 된다. 여기서 중요한 것은 포지션 시점과 수익률 시점이 정확히 맞물려야 한다는 점이다. 즉, 당일 시그널로 당일 수익률을 설명하는 식의 미래정보 누출이 없어야 한다. 8. 시계열 베타 확인: 이제 포트폴리오 일별 수익률을 종속변수로 두고, 시장 초과수익률, SMB, HML, RMW, CMA, MOM 같은 공통 팩터 수익률을 설명변수로 하는 시계열 회귀를 수행한다. 이 단계의 목적은 “내 전략이 실제 수익률 기준으로 어느 공통 팩터에 묶여 있는가”를 보는 것이다. 예를 들어 시장 베타가 유의하면 시장 방향성 노출이 남아 있는 것이고, SMB가 유의하면 사이즈 팩터 성향이 실제 수익률 수준에서도 살아 있다는 의미다. 9. 시계열 분석의 해석 원칙: 이 단계에서는 세 가지를 본다. 첫째, 개별 베타의 크기와 부호. 둘째, 각 베타의 통계적 유의성. 셋째, 전체 결정계수 (R^2). 특정 베타가 유의하고 절대값이 크면 그 팩터에 실질적으로 노출된 것이다. (R^2)가 높으면 전략 수익률의 상당 부분이 이미 알려진 공통 팩터 조합으로 설명된다는 뜻이므로, “고유 알파”라고 보기 어렵다. 반대로 (R^2)가 낮고 알파 항이 안정적으로 남는다면 공통 팩터로 설명되지 않는 독립적 신호가 존재할 가능성이 높다. 10. 롤링 베타 점검: 정적인 한 번의 회귀만으로 결론을 내리면 위험하다. 시장 국면에 따라 전략의 팩터 노출은 달라질 수 있으므로, 일정 구간의 롤링 윈도우를 사용해 베타를 반복 추정하는 절차가 필요하다. 이를 통해 평소에는 중립적이지만 특정 위기 구간에서만 시장 베타가 급격히 커지는지, 혹은 최근 들어 모멘텀 노출이 강화되었는지 같은 구조 변화를 확인할 수 있다. 실무적으로는 전체 평균 베타보다 구간별 불안정성이 더 중요할 때도 많다. 11. 중립화 필요 여부의 판단 기준: 특정 팩터에 대한 단면 노출이 지속적이고, 시계열 수익률 회귀에서도 같은 팩터 베타가 유의하다면 해당 팩터는 제거 대상 후보가 된다. 반면 단면에서는 노출이 있어 보여도 실제 시계열 수익률 설명력이 약하다면 즉시 제거하기보다 관찰 대상으로 남겨둘 수 있다. 즉, 제거 우선순위는 보통 단면 노출의 지속성시계열 수익률 설명력이 동시에 강한 팩터부터 정한다. 12. 중립화 방식: 제거 방식은 기본적으로 잔차화(residualization)다. 즉, 원시 시그널을 원하지 않는 팩터들에 회귀한 뒤, 그 회귀에서 남는 잔차만을 새로운 시그널로 사용한다. 섹터 노출 문제라면 섹터 더미를 포함하거나 섹터 내 순위화 방식으로 해결할 수 있고, 사이즈나 변동성처럼 연속형 스타일 팩터는 해당 팩터에 대한 단면 회귀 잔차를 사용하는 방식이 일반적이다. 이 과정의 목적은 단순히 상관계수를 줄이는 것이 아니라, 원하지 않는 공통 위험을 제거한 뒤에도 신호가 살아남는지 검증하는 데 있다. 13. 중립화 후 재검정: 중립화가 끝나면 같은 절차를 다시 반복해야 한다. 즉, 중립화된 시그널에 대해 다시 단면 베타 확인을 수행하고, 새 포트폴리오 수익률을 만든 뒤 시계열 베타를 재확인한다. 여기서 기대하는 결과는 특정 팩터 베타의 감소, (R^2)의 하락 또는 안정화, 그리고 변동성 축소다. 다만 Sharpe가 반드시 개선된다고 단정할 수는 없으므로, 성과 저하 없이 불필요한 노출만 줄었는지를 함께 봐야 한다. 14. 최종 보고서 구성: 문서화할 때는 보통 네 부분으로 정리하면 된다. 첫째, 사용한 팩터 라이브러리와 데이터 정의. 둘째, 단면 회귀 결과와 평균 계수·t-stat 요약. 셋째, 포트폴리오 수익률 기준 시계열 베타 및 (R^2) 요약. 넷째, 중립화 전후의 Sharpe, 변동성, 최대낙폭, turnover 비교. 이렇게 정리하면 “내 전략이 어떤 팩터에 노출되어 있었고, 그 노출이 실제 변동성의 원인이었으며, 중립화 이후 얼마나 개선되었는가”가 하나의 일관된 프레임워크로 설명된다. 15. 한 줄 결론: 베타 확인 프로세스의 본질은 단순히 회귀 한 번 돌리는 것이 아니라, 포지션 수준의 노출 확인 → 포트폴리오 수익률 수준의 위험 확인 → 잔차화 기반 중립화 → 중립화 후 재검정의 순환 구조를 만드는 데 있다.

profile
Computer Science @Kyung Hee University | Quantitative Finance | Leveraging fundamental, technical, and machine learning approaches to solve financial problems

0개의 댓글