퀀트 상관관계 분석 활용법

상관관계가 퀀트 투자에서 중요한 이유

퀀트 투자에서 상관관계(Correlation)는 자산 간 가격 움직임의 유사도를 측정하는 핵심 도구입니다. 상관관계를 무시하고 전략을 설계하면, 분산 투자를 했다고 생각했지만 실제로는 같은 방향으로 움직이는 자산에 집중 투자한 결과를 낳습니다. 이 글에서는 상관관계의 측정 방법부터 자동매매 전략과 포트폴리오 구성에 실전 활용하는 기법까지 체계적으로 정리합니다.

상관관계 측정 방법

자산 수익률 간의 관계를 측정하는 대표적인 방법 세 가지를 비교합니다.

방법 특징 적합 상황
피어슨 상관계수 선형 관계 측정, -1~+1 정규분포에 가까운 수익률
스피어만 순위상관 비선형 단조 관계 포착 이상값이 많은 데이터
롤링 상관계수 시간에 따른 변화 추적 동적 포트폴리오 관리
import pandas as pd
import numpy as np

def rolling_correlation(returns_a, returns_b, window=60):
    """60일 롤링 상관계수 계산"""
    return returns_a.rolling(window).corr(returns_b)

def correlation_matrix(returns_df):
    """전체 자산 상관관계 매트릭스"""
    return returns_df.corr(method='pearson')

상관관계의 함정: 비정상성

상관관계의 가장 큰 함정은 시간에 따라 변한다는 것입니다. 평소에 상관관계가 낮던 자산들이 시장 위기 때 동시에 하락하는 현상은 매우 흔합니다.

  • 위기 시 상관관계 급등 — 2008년 금융위기, 2020년 코로나 폭락 때 거의 모든 자산이 동반 하락
  • 레짐 변화 — 금리 인상기와 인하기에서 주식-채권 상관관계가 뒤바뀜
  • 구조적 변화 — 암호화폐와 기술주의 상관관계가 2020년 이후 크게 높아짐

따라서 고정된 상관관계 값이 아닌 롤링 윈도우로 상관관계의 변화를 지속 추적해야 합니다. 퀀트 팩터 로테이션 전략에서 다룬 레짐 감지와 결합하면 더 정확한 분석이 가능합니다.

전략 활용 1: 분산 포트폴리오 구성

상관관계의 가장 기본적인 활용은 진정한 분산 투자를 달성하는 것입니다.

  • 상관관계 임계값 설정 — 포트폴리오 내 모든 자산 쌍의 상관계수가 0.7 이하가 되도록 제한
  • 클러스터링 — 상관관계 매트릭스를 기반으로 자산을 그룹으로 묶고, 각 그룹에서 대표 자산 선택
  • 동적 비중 조절 — 상관관계가 높아지면 해당 자산 비중을 줄여 집중 리스크 방지
from scipy.cluster.hierarchy import linkage, fcluster

def cluster_assets(corr_matrix, max_corr=0.7):
    """상관관계 기반 자산 클러스터링"""
    distance = 1 - corr_matrix.abs()
    Z = linkage(distance.values[np.triu_indices(len(distance), k=1)],
                method='ward')
    clusters = fcluster(Z, t=1 - max_corr, criterion='distance')
    return pd.Series(clusters, index=corr_matrix.columns)

전략 활용 2: 페어 트레이딩 후보 선정

높은 상관관계를 가진 자산 쌍은 페어 트레이딩의 후보가 됩니다. 두 자산의 가격 비율이 역사적 평균에서 벗어났을 때 평균회귀를 기대하고 진입하는 전략입니다.

  • 상관계수 0.8 이상 — 페어 후보의 최소 기준
  • 공적분 검정 — 단순 상관관계보다 공적분(cointegration)이 더 신뢰도 높은 선별 기준
  • 스프레드 안정성 — 두 자산의 가격 차이가 평균으로 회귀하는 패턴이 일관적인지 확인

상관관계만으로 페어를 선정하면 위험합니다. 반드시 공적분 검정을 추가로 수행하세요. 자세한 페어 트레이딩 전략은 페어 트레이딩 자동매매 전략에서 확인할 수 있습니다.

전략 활용 3: 리스크 관리

상관관계는 포트폴리오 전체의 리스크를 정량화하는 데 핵심 역할을 합니다.

def portfolio_volatility(weights, cov_matrix):
    """포트폴리오 변동성 계산 (상관관계 반영)"""
    w = np.array(weights)
    return np.sqrt(w @ cov_matrix.values @ w)

def marginal_risk_contribution(weights, cov_matrix):
    """각 자산의 한계 리스크 기여도"""
    w = np.array(weights)
    port_vol = portfolio_volatility(weights, cov_matrix)
    mrc = (cov_matrix.values @ w) / port_vol
    return pd.Series(mrc, index=cov_matrix.columns)
  • 포트폴리오 변동성 — 개별 자산 변동성 + 상관관계가 결합되어 결정
  • 리스크 기여도 — 각 자산이 전체 리스크에 얼마나 기여하는지 분해
  • 리스크 패리티 — 모든 자산의 리스크 기여도가 동일하도록 비중 조절

전략 활용 4: 상관관계 브레이크 감지

평소 유지되던 상관관계가 갑자기 깨지는 순간은 강력한 매매 신호가 될 수 있습니다.

  • 디커플링 감지 — 30일 롤링 상관관계가 90일 평균 대비 2표준편차 이상 하락하면 알림
  • 섹터 로테이션 신호 — 동일 섹터 내 자산 간 상관관계 하락은 섹터 내 분화의 신호
  • 매크로 전환 신호 — 주식-채권 상관관계 전환은 금리 레짐 변화의 조기 지표
def detect_correlation_break(returns_a, returns_b, 
                              short_window=30, long_window=90, threshold=2.0):
    """상관관계 이탈 감지"""
    short_corr = rolling_correlation(returns_a, returns_b, short_window)
    long_corr = rolling_correlation(returns_a, returns_b, long_window)
    long_std = long_corr.rolling(long_window).std()
    z_score = (short_corr - long_corr) / long_std
    return z_score.abs() > threshold

실전 구현 시 주의사항

  • 데이터 기간 — 최소 1년 이상의 데이터로 계산. 짧은 기간은 노이즈가 심함
  • 수익률 주기 — 일간·주간·월간 수익률에 따라 상관관계 값이 달라짐
  • 비동기 거래 — 시간대가 다른 시장의 자산은 래그(lag) 보정이 필요
  • 생존 편향 — 상장폐지된 자산이 빠진 데이터로는 상관관계가 왜곡됨
  • 연산 비용 — 자산 수가 N개이면 상관 쌍은 N(N-1)/2개. 대규모 유니버스에서는 샘플링 필요

마무리

상관관계 분석은 퀀트 투자의 기초이자 핵심입니다. 분산 포트폴리오 구성, 페어 트레이딩 후보 선정, 리스크 정량화, 상관관계 브레이크 감지까지 활용 범위가 넓습니다. 핵심은 상관관계가 고정값이 아니라 끊임없이 변하는 동적 지표라는 점을 인식하고, 롤링 윈도우와 레짐 감지를 결합해 실시간으로 모니터링하는 것입니다. 상관관계를 제대로 관리하면 수익은 물론 리스크 관리 수준도 한 단계 높아집니다.

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux