티스토리 뷰

출처 : BST261AG, Ver.0.9

 

# 주가 추정 고도화를 위한 상관계수 맵(Correlation Map) 구축 보고서

본 보고서는 주가 예측의 정확도를 높이기 위해 개별 종목과 거시경제 지표 간의 연관성을 분석하고, 이를 체계적인 데이터베이스(Map)로 구축하는 방안에 대해 기술합니다.

---

## 1. 상관계수(Correlation Coefficient)의 개요

### 1-1. 개념 및 원리
상관계수는 두 변수 간의 선형적 관계의 강도와 방향을 나타내는 통계적 지표입니다. 
가장 널리 사용되는 **피어슨 상관계수(Pearson Correlation Coefficient, $r$)**는 -1에서 +1 사이의 값을 가집니다.
*   **+1**: 완벽한 양의 상관관계 (하나가 오르면 다른 하나도 똑같은 비율로 오름)
*   **-1**: 완벽한 음의 상관관계 (하나가 오르면 다른 하나는 반대로 내림)
*   **0**: 상관관계 없음 (서로 무관하게 움직임)

수식적으로는 두 변수의 공분산을 각 변수의 표준편차의 곱으로 나눈 값으로 정의됩니다.
$$ r = \frac{\sum((x - \bar{x})(y - \bar{y}))}{\sqrt{\sum(x - \bar{x})^2}\sqrt{\sum(y - \bar{y})^2}} $$

### 1-2. 산출 방법
현대 데이터 분석에서는 시계열 데이터(날짜별 주가 흐름) 두 개를 준비한 후, 일별 등락률(Return)로 변환하여 계산합니다. 단순 가격(Price)으로 계산하면 장기 우상향하는 추세(Trend) 때문에 가짜 상관관계(Spurious Correlation)가 발생할 수 있어, 반드시 **로그 수익률** 또는 **변화율(Change %)**을 사용해야 신뢰성이 보장됩니다.

---

## 2. 상관계수 맵(Correlation Map)의 이해

### 2-1. 개념 및 원리
상관계수 맵이란 수천 개의 개별 종목(Target)과 수십~수백 개의 거시지표(Factor) 간의 **1:N 상관계수를 모두 계산하여 저장해 둔 거대한 매핑 테이블**입니다.
단순히 "주식이 오를까?"를 묻는 것이 아니라, **"이 종목은 지난 3년간 유가와 0.8의 관계였고, 금리와는 -0.6의 관계였다"**는 고유의 성격(DNA)을 규명하는 지도입니다.

### 2-2. 발전 역사 (History)
*   **통계적 기원**: 19세기 프랜시스 골턴과 칼 피어슨에 의해 개념이 정립되었습니다.
*   **금융 적용 (포트폴리오 이론)**: 1950년대 해리 마코위츠가 '모던 포트폴리오 이론(MPT)'을 발표하며, 자산 간의 상관계수가 분산 투자와 리스크 관리에 핵심임을 증명했습니다.
*   **다요인 모델 (Multi-Factor Model)**: 이후 유진 파마와 프렌치 등이 주식 수익률이 단순히 시장 수익률(베타) 뿐만 아니라, 특정 요인(소형주, 가치주 등)과 높은 상관성을 가짐을 밝혀내며 퀀트(Quant) 투자의 핵심 도구로 자리 잡았습니다.

### 2-3. 구축 방법
1.  **유니버스 구성**: 분석 대상 종목 전체 (예: KOSPI/KOSDAQ 2500개).
2.  **팩터 풀(Factor Pool)**: 비교 대상이 될 지표 수집 (S&P500, 나스닥, 필라델피아반도체, WTI유가, 달러인덱스, 국채금리 등).
3.  **기간 설정**: 최근 6개월(단기 민감도)부터 3년(장기 성향)까지 기간별로 롤링(Rolling) 계산.
4.  **매핑 저장**: 종목코드 | 지표명 | 기간 | 상관계수 | 유의성(p-value) 형태로 DB화.

---

## 3. 주가 추정을 위한 활용 방안

### 3-1. 활용 이유 (Why)
*   **노이즈 제거 (Feature Selection)**: 
    *   삼성전자를 예측할 때 '옥수수 선물 가격'은 노이즈일 가능성이 높습니다. 반면 '필라델피아 반도체 지수'는 강력한 신호입니다.
    *   상관계수 맵이 있으면, AI 모델에게 **"삼성전자는 반도체 지수만 보고 학습해"**라고 알려줄 수 있어 학습 효율과 정확도가 비약적으로 상승합니다.
*   **동적 가중치 조정**: 
    *   과거엔 유가에 민감하던 항공주가 최근엔 환율에 더 민감해졌다면, 맵 갱신을 통해 이를 감지하고 예측 모델의 가중치를 바꿀 수 있습니다.

### 3-2. 활용 방법 (How)
1.  **입력 단계**: AI가 특정 종목을 분석하기 전, Correlation Map을 조회합니다.
2.  **Top-K 선정**: 해당 종목과 상관계수 절대값이 가장 큰 상위 3~5개 지표(Key Drivers)만 선별합니다.
3.  **모델 주입**: 선별된 지표의 어제/오늘 데이터를 예측 모델의 보조 변수(Feature)로 투입합니다.

---

## 4. 데이터 구조 및 형식

### 4-1. 입력 데이터 (Input)
*   **종목 데이터**: 일별 등락률 (예: 삼성전자 -1.2%, SK하이닉스 +0.5% ...)
*   **거시 지표**: 일별 변화율 (예: S&P500 +0.8%, WTI유가 -0.3% ...)

### 4-2. 결과 데이터 형식 (Output Example)

| 종목코드 | 종목명 | 연동지표(Factor) | 상관계수(r) | 비고 |
|:---:|:---:|:---|:---:|:---|
| 005930 | 삼성전자 | US_Semi_Index (필라델피아반도체) | 0.85 | 매우 높음 |
| 005930 | 삼성전자 | KRW_USD (환율) | -0.62 | 역의 상관 |
| 005380 | 현대차 | US_Auto_ETF (미국 자동차) | 0.72 | 높음 |
| 005380 | 현대차 | Interest_Rate (미국채 10년) | -0.45 | 중간 |

---

## 5. 파이썬 코드 구현 사례

다음은 `pandas`를 활용하여 특정 종목들과 글로벌 지수 간의 상관계수를 계산하고, 가장 연관성 높은 지표를 추출하는 예시입니다.

```python
import pandas as pd
import numpy as np

def build_correlation_map(stock_returns, macro_returns):
    """
    stock_returns: DataFrame (Index=Date, Columns=Tickers, Value=Daily Change %)
    macro_returns: DataFrame (Index=Date, Columns=Indices, Value=Daily Change %)
    """
    
    # 1. 상관계수 행렬 계산
    # 각 주식(Column)과 각 지수(Column) 간의 모든 조합 계산
    # 결과: (종목 수) x (지수 수) 크기의 행렬
    
    correlation_matrix = pd.DataFrame(index=stock_returns.columns, columns=macro_returns.columns)
    
    print("Computing correlations...")
    for ticker in stock_returns.columns:
        # 해당 종목의 수익률 시리즈
        stock_series = stock_returns[ticker]
        
        # 모든 매크로 지표와의 상관계수를 한 번에 계산 (corrwith 활용 가능하지만 여기선 명시적 반복)
        corrs = macro_returns.corrwith(stock_series) # Series vs DataFrame Correlation
        correlation_matrix.loc[ticker] = corrs
        
    return correlation_matrix

def get_top_factors(correlation_matrix, top_n=3):
    """
    상관관계가 높은 상위 N개 팩터를 추출하여 맵(Dictionary) 형태로 반환
    """
    correlation_map = {}
    
    for ticker, row in correlation_matrix.iterrows():
        # 절대값 기준으로 정렬 (강한 음의 상관관계도 중요하므로)
        sorted_factors = row.abs().sort_values(ascending=False)
        
        # 상위 N개 팩터 이름과 실제 계수값 저장
        top_factors = []
        for factor_name in sorted_factors.head(top_n).index:
            r_value = row[factor_name]
            top_factors.append((factor_name, r_value))
            
        correlation_map[ticker] = top_factors
        
    return correlation_map

# --- 사용 예시 ---
if __name__ == "__main__":
    # 1. 가짜 데이터 생성
    dates = pd.date_range('2023-01-01', periods=100)
    
    # 주식 등락률 (랜덤)
    df_stocks = pd.DataFrame(np.random.randn(100, 3), index=dates, columns=['Samsung', 'Hyundai', 'Naver'])
    
    # 지수 등락률 (랜덤)
    df_macro = pd.DataFrame(np.random.randn(100, 4), index=dates, columns=['S&P500', 'Nasdaq', 'Oil', 'BondYield'])
    
    # 2. 맵 구축
    corr_matrix = build_correlation_map(df_stocks, df_macro)
    final_map = get_top_factors(corr_matrix, top_n=2)
    
    # 3. 결과 출력
    for stock, factors in final_map.items():
        print(f"[{stock}] Key Drivers:")
        for name, r in factors:
            print(f"  - {name}: {r:.4f}")
```

### 5-1. 코드 설명
1.  **`stock_returns` & `macro_returns`**: 반드시 전일 대비 변화율(Change Pct) 데이터여야 합니다.
2.  **`corrwith` 메서드**: 특정 종목 하나와 전체 지수 그룹 간의 상관계수를 고속으로 계산합니다.
3.  **`abs().sort_values`**: +0.1(약한 양의 상관)보다 -0.8(강한 음의 상관)이 훨씬 중요한 정보이므로, 절대값 기준으로 정렬하여 가장 강력한 영향요인을 찾아냅니다.

 

 

 

 

반응형
반응형
250x250
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함