C && C++

correlation 구하기 예제(대한항공, 델타항공 주가 비교)

힘법사 2020. 11. 13. 16:02
728x90

0. 서론

 

 일주일 만에 게시물이네요 블로그를 돌봐야 하는데 바빠서 잘 못 돌보고 있는 것 같습니다.

최근에 항공 테마주로 대한항공, 델타항공이 주식시장에서 아주 뜨겁습니다. 저 같은 경우에는 델타항공이 폭락하는 걸 보고 대한항공 폭락을 예견해 대한항공을 고점에서 익절 칠 수 있었습니다. 오늘 풀어볼 문제입니다. 최근 한 달 동안 델타항공의 종가가 다음날 Kospi 시장의 델타항공 주가에 영향을 주는가? 이것을 풀어보겠습니다. 물론 주식시장이 매우 변동성이 높은 장이다 보니, 이런 코드를 짜서 풀어놔도 시간이 지나면 맞지 않게 될 확률이 높습니다. 그러니 정기적으로 시스템이 잘 동작하는지 확인해야겠지요?

그림. 대한항공 종가(좌) 델타항공 종가(우)

일단 지난 30일간의 KAL, DLA의 주가입니다. 뭔가 벌써 비슷해 보입니다. 이 둘의 서로 유사성을 correlation을 계산해서 알 수 있습니다.

 

1. correlation

 기본적으로 correlation은 -1~1 사이의 값을 가지게 됩니다. 1이면 둘이 아예 같다는 의미, 0이면 둘이 아예 상관없다는 뜻, -1이면 둘은 완전히 반대로 움직인다는 의미가 되겠습니다. 이게 간단한 설명입니다. 지금부터 수학으로 들어가는데 수학을 안 봐도 되시는 분은 바로 2로 가셔도 됩니다.

 먼저 correlation을 구하기 위해서는 두 변수 사이의 covariance를 알아야 합니다. covariance는 공분산으로, COV(X, Y)=E[(X-E [X])•(Y-E [Y])]  식으로 계산이 이루어집니다. ( E = 기댓값(평균)), 이렇게 구해진 COV에 변수 X, Y의 표준편차를 각각 나눠주면 바로 Correlation이 계산됩니다. 

 

정리 : correaltion(x, y) = covariance(x, y) / [(x의 표준편차) * ( y의 표준편차)]

 

2. 코드 구현

eigen library를 사용합니다. eigen library가 설치 안되신분은 아래 게시물을 보면 5분이면 설치 가능합니다. ^^

himbopsa.tistory.com/8

 

Eigen library 설치하기(C++)

1. Eigen library 다운하기 i) 다음 사이트에 접속합니다. eigen.tuxfamily.org/index.php?title=Main_Page Eigen Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, a..

himbopsa.tistory.com

이제 본격적으로 코드를 구현합니다. 그 전, 코드에서 사용할 데이터를 먼저 다음과 같이 정리했습니다. 

그림,  DAL, cAL excel_sheet(좌) DAL_CAL textfile(우)

 먼저 excel로 정리한 다음 오른쪽 과 같이 c++에서 읽어 들일 수 있도록 txt 파일로 바꿔줬습니다. 

아래는 이로부터 correaltion을 계산하는 C++ 코드입니다. 주석마다 끊어서 기능을 설명했으니 이해가 쉬우실 겁니다.

#include <iostream>
#include <fstream>
#include <eigen/Dense>
#include <cmath>
using namespace Eigen;
using namespace std;
const int P = 2;  // 특성수, 델타, 항항
const int N = 30; // 30일간의 데이터
				 
int main()
{ //data laoding
	VectorXf all_data[N];
	ofstream xcout("DAL_CAL_CO.txt");
	ifstream in("DAL_CAL.txt");

	for (int i = 0; i < N; i++) {
		all_data[i].resize(P);
		for (int j = 0; j < P; j++) in >> all_data[i](j);
	}
	// 공분산 계산
	MatrixXf covariance;
	VectorXf mean;
	mean.resize(P);
	covariance.resize(P, P);
	for (int n = 0; n < N; n++) mean += all_data[n];
	mean /= (float)N;
	for (int j = 0; j < P; j++) {
		for (int k = 0; k < P; k++) {
			covariance(j, k) = 0.0;
			for (int n = 0; n < N; n++) {
				covariance(j, k) += (all_data[n](j) - mean[j]) * (all_data[n](k) - mean[k]);
			}
			covariance(j, k) /= N - 1;
		}
	}
	//correlation  계산
	VectorXf correlation(1);
	correlation(0) = covariance(0, 1) / sqrt(covariance(0, 0) * covariance(1, 1));
	cout << "\ncorrelation\n" << correlation;
	in.close();


	return 0;
}

코드 잘 따라오셨나요? 자 이제 실행해봅시다.

그림.결과

0.797 매우 높은 상관관계가 있습니다!! 전날 델타 항공 주식을 보고 다음날 대응을 할 수 있겠군요?

그럼 그 반대로 대한항공 종가는 델타항공에 얼마나 영향을 줄까요?

그림. 결과

 이 결과를 보니 두 주가는 확실히 어느 정도 서로 영향을 주며 묶여있는 것 같습니다. 하지만 그 모양새는 델타항공이 리드하는 포지션이네요.

 

3. 결론 :

그림. 대한항공 델타항공 주가의 상호 영향 설명 그림

 결론은 대한항공도 델타항공은 서로 미래 주가에 유의미한 영향을 서로 주고받는 것입니다.

 하지만, correlatio을 비교해 봤을 때 델타항공이 lead 하고 대한항공이 follow 하는 경향이 강하다는 것을 알 수 있습니다.

다음은 더 유익한 주제로 돌아오겠습니다! 감사합니다.

728x90