ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [6강] 데이터 상관관계 분석
    기초지식/Quantopian(강의노트) 2025. 2. 1. 10:47
    반응형

    상관계수(Correlation coefficient)

    공분산의 의미

    상관계수는 두 변수의 관계가 얼마나 선형적인지를 측정한다. 상관계수를 구하기 위해서는 먼저 공분산을 알아야 한다. 공분산(Cov(X, Y))은 두 변수 X와 Y가 어떻게 함께 변동하는지 측정하는 지표로 아래 식으로 측정한다.

    식1: 공분산의 계산식

    상관계수의 의미

    공분산을 활용하여 아래와 같이 상관계수를 구할 수 있다. 

    식2: 공분산을 활용한 상관계수 계산식

    상관계수는 결국 공분산을 각각의 표준편차로 정규화 한 값이다. 정규화가 되지 않은 공분산의 크기만으로는 다른 데이터와의 비교가 불가능하기 때문에 표준편차로 정규화한 상관계수를 데이터 분석에 주로 사용한다. 정규화 과정을 거쳐서 구한 상관계수는 항상 -1에서 1 사이의 값을 가지고, 1에 가까울수록 완전히 우상향 선형 관계를, -1에 가까울수록 완전히 우하향 선형 관계를 나타낸다.

    공분산과 상관계수 구하기

    공분산과 상관계수가 행렬(matrix)로 표현되는 이유

    집단의 개수가 하나일 때 공분산행렬은 1 x 1행렬로 표현된다. 같은 집단끼리의 공분산은 그 집단의 분산과 같기 때문이다. 

    그림1: 집단의 개수가 하나일 때 공분산의 의미

    집단의 개수가 두 개 이상일 경우를 생각해보자. 두 개의 집단인 집단 X와 집단 Y로 만들 수 있는 조합은 (X, X), (X, Y), (Y, X), (Y, Y) 4 가지이다. 따라서 공분산 행렬은 아래 그림 2와 같이 만들 수 있다. 

    그림2: 집단의 개수가 두 개일때 공분산행렬

    공분산과 상관계수 값 python으로 구하기

    python numpy 의 cov 함수를 통해서 공분산을, corrcoef 함수를 통해서 상관계수를 구할 수 있다. 아래는 간단한 구현 예시이다.

    # numpy 라이브러리 사용
    import numpy as np
    
    # X, Y, Z 집단 정의
    X = [1,2,3,4,5,6,7,8,9,10]
    Y = [2,2,2,2,2,8,8,8,8,8]
    Z = [1,1,1,2,2,2,3,3,3,10]
    
    # X, Y의 분산, 상관계수 계산
    print(np.cov([X, Y]))
    print(np.corrcoef([X, Y]))
    
    # X, Y의 분산, 상관계수 계산
    print(np.cov([X, Y, Z]))
    print(np.corrcoef([X, Y, Z]))

    위 코드를 실행하면, 집단 X, Y만 넣었을 때는 2 x 2 행렬로 결과가 나오고, 집단 X, Y, Z를 모두 넣었을 때는 3 x 3 행렬로 결과가 나오는 것을 확인할 수 있다. 

    그림3: 파이썬 공분산, 상관계수 계산 예시

    금융데이터 상관계수 분석: S&P500 지수, 애플, JPMORGAN 주식 상관관계 비교

    python의 yahoo finance 라이브러리를 이용하면 손쉽게 S&P500 지수, 애플, JPMORGAN 주식의 기간별 종가를 받을 수 있다.(미국 ETF 대표 종목 뽑아내기: python yahoo finance 활용) 아래와 같이 yfinance의 download 함수를 사용하여 2024년 1년 동안의 수정 종가를 다운받아서 spdr, apple, jpmorgan이라는 변수에 저장한 뒤에 numpy corrcoef 함수를 통해서 상관계수를 구할 수 있다. 

    # 라이브러리 참조
    import numpy as np
    import yfinance as yf
    
    # 데이터 시작일과 종료일 설정
    start = "2024-01-01"
    end = "2024-12-31"
    # S&P500지수(Ticker="SPY"), 애플주식(Ticker="APPL"), JPMORGAN주식(Ticker="JPM")
    # 종가를 yfinance 라이브러리 download 함수를 이용해서 가져오기
    prices = yf.download(["SPY", "AAPL", "JPM"], start=start, end=end)
    # 각각의 수정 종가 데이터를 변수에 저장
    spdr = prices["Adj Close"]["SPY"]
    apple = prices["Adj Close"]["AAPL"]
    jpmorgan = prices["Adj Close"]["JPM"]
    # 상관계수 분석
    np.corrcoef([spdr, apple, jpmorgan])

    실제 상관계수를 값을 구해보면 아래 그림 4의 왼쪽과 같은 결과를 얻을 수 있다. 결과를 보면, S&P500 지수와 애플주가의 상관계수보다(0.8829) S&P500 지수와 JPMORGAN 주가의 상관계수(0.9586)가 더 높은 것을 확인할 수 있다. 실제로 각각의 산포도 그래프를 그려보면 그림 4의 오른쪽 처럼 S&P500 지수와 JPMORGAN 주가의 산포도 그래프가 더 우상향하는 직선에 가까운 것을 확인할 수 있다. 

    그림4: S&P500 지수와 애플주가, S&P500 지수와 JPMORGAN주가의 상관계수

    상관계수는 두 변수의 관계가 얼마나 선형적인지를 측정하는 지표로 비선형 관계를 포착하지 못하는 한계가 있다. 또한 분석 대상 기간의 상관관계가 미래에도 지속될 것을 보장하지 못하며, 극단적인 몇 개의 값에 왜곡된다는 문제점도 발생할 수 있다. 하지만 간단하게 데이터 간의 관계를 확인할 수 있다는 점에서 여전히 유용한 분석 수단이다.

    반응형
Designed by Tistory.