본문 바로가기
퀀트 분석/퀀트 기초

[Python] 주식 종목 간 상관관계 분석

by 쿼카퀀트 2021. 8. 10.
728x90

가끔 내가 투자한 종목을 보다보면, 내 종목이 다른 종목이랑 주가가 유사하게 움직이는것 같다는 생각이 들 때가 있습니다. 실제로, 반도체가 호황일 때 삼성전자가 오른다면 SK하이닉스도 오르고, 카카오의 실적이 좋으면 카카오의 다른 계열사 주가도 오르기도 합니다.

 

이처럼 주식 시장에선 서로 유사하게 움직이는 종목들이 존재합니다.

 

그렇다면, 어떤 종목들의 주가가 서로 유사하게 움직이거나, 혹은 서로 완전히 정반대로 움직일까요? 이를 확인하는 가장 기본적인 방법을 파이썬으로 구현해 보겠습니다.

 

1. 피어슨 상관관계

이번에 구현해 볼 방법은, 피어슨 상관계수 분석입니다.이 링크에서 피어슨 상관계수가 무엇인지 설명이 되어있지만, 수식을 보기 싫으신 분들을 위해 간단하게 예시로 설명드리도록 하겠습니다.

 

만약 삼성전자의 주가(x)와 SK하이닉스의 주가(y)가 얼마나 비슷하게 움직이는지 알고싶다고 한다면, 피어슨 상관계수는 x, y 두 주가를 바탕으로 -1에서 1 사이의 값을 리턴합니다.만약 상관계수가 0보다 크다면, 두 기업의 주가 사이에 양의 상관관계(삼전이 오르면 하닉도 오른다)가 있다는 뜻입니다. 반대로 상관계수가 0보다 작다면, 두 기업의 주가 사이에 음의 상관관계(삼전이 오르면 하닉은 내린다)가 있다고 해석됩니다.상관계수가 1 또는 -1에 가까울수록 경향성이 커져, 1이라면 삼전이 1% 오를때 하닉도 정확히 1% 오르고, -1이라면 반대로 1% 오를때 1% 내린다는 것을 의미합니다.

 

이를 그래프로 표현하면 아래 그림처럼 됩니다.

피어슨 상관계수에 따른 두 변수 x, y의 관계

 

2. 데이터 준비

이제 상관계수가 뭔지 알았으니, 주가의 피어슨 상관계수를 계산해 여러 기업들의 주가가 얼마나 비슷하게 움직이는지 확인해봅니다.

 

먼저 주가 데이터를 준비해야하니, [Python] Yahoo Finance API로 주가 데이터 받아오기 에서 주가를 받아주세요. 데이터를 받은 후, 아래 표 구조처럼 바꿔주세요.

 

  종목1의 종가 종목2의 종가 종목3의 종가 종목4의 종가
1월 4일 . . . .
1월 3일 . . . .
1월 2일 . . . .
... ... ... ... ...

각 행은 하루를 의미하며, 각 열은 종목을 의미합니다. 주가로는 각 종목의 종가를 사용했습니다.

제대로 변형했다면, 아래 스크린샷같은 생김새가 나와야합니다.

 

참고로, 예시에선 삼전, 하닉 두 개 기업을 예로 들었지만, 위 스크린샷처럼 한번에 여러 기업을 가져와도, 뒤에 알려드릴 코드로 쉽게 상관계수를 구할 수 있습니다.

 

3. 상관계수 계산

여기까지 데이터를 준비하는 과정이 문제없었다면, 이제 드디어 피어슨 상관계수를 계산해봅시다.

 

수식을 안가르쳐줬는데 어떻게 구하냐고요?

상관없습니다. 우리에겐 Pandas가 있거든요.

 

import pandas as pd

data # 본문 2번에서 만든 종목별 종가 데이터
data = pd.DataFrame(data)

corr = data.corr(method = 'pearson')

이렇게만 코드를 입력하면, 피어슨 상관계수 구하기는 끝입니다.

corr를 출력해보면, 아래 표처럼 출력됩니다.

몇개만 해석해볼까요?

 

- 먼저 292340.KS와 292340.KS를 보면, 상관계수가 1입니다. 같은 종목이니, 당연히 똑같이 움질일테니, 상관계수가 1이 됩니다.

 

- 다음으로 285000.KS와 159800.KS를 보면, 상관계수가 0.988647입니다. 거의 똑같이 움직인다는 뜻인데요, 종목의 이름을 살펴보면 285000.KS는 KBSTAR 200IT, 159800.KS는 마이티 코스피100입니다. 코스피 상위 100개 종목과, 코스피 200의 IT 관련주는 사실상 거의 똑같이 움직인다고 봐도 되겠네요.

 

- 252410.KS와 292340.KS를 살펴볼까요? 상관계수가 -0.881123입니다. 하나가 떨어지면 다른 하나는 거의 정확히 반대로 오른다는 뜻인데요, 각 종목의 이름을 살펴보면, 252410.KS는 KBSTAR 200선물인버스, 292340.KS는 마이티 200커버드콜ATM레버리지입니다. 즉, 하나는 코스피200 인버스, 하나는 코스피200 커버드콜입니다.

커버드콜은 코스피200을 보유한 상태에서 높은 프리미엄에 코스피200 콜옵션 매도를 한 상태이니, 인버스와 반대로 움직이게 됩니다.

 

4. 정리

이처럼 파이썬 pandas 패키지를 활용해 피어슨 상관계수를 구할 수 있습니다.

 

상관계수 자체로 엄청난 알고리즘을 만들 순 없겠지만, 본인이 만든 알고리즘이 어떤 성과를 보이는지 평가 지표로서 상관계수는 활용성이 좋습니다.

 

질문은 댓글로 남겨주시면 답변하겠습니다! 감사합니다.

728x90

댓글