본문 바로가기
Python

XGBoost를 이용한 주식 예측 - (1)

by 아짱이아빠 2020. 10. 17. 23:13
반응형

평소에 관심만 갖고 있었던 Python을 통해 주식 종가를 예측하는 프로그램을 공부해 보고자 한다.

 

Python을 잘 쓰는 편이 아니고 AI나 Machine Learning을 전공한 것도 아니기 때문에 깊이 있는 내용을 다루지는 못할 것이며 여기저기, 그때그때 자료를 찾아 내가 이해한 수준에서 정리해 보고자 한다.

 

주식 종가 예측을 위해 Python이 지원하는 많은 Machine Learning 중 XGBoost 알고리즘을 이용하고자 한다.

 

먼저 XGBoost에 대해서 간단히 알아보면 다음과 같다.

XGBoost는 여러 개의 Decision Tree를 조합해서 사용하는 Ensemble 알고리즘이며 Ensemble은 여러 개의 모델을 조합해서 그 결과를 뽑아내어 정확도를 높이는 방법이다.

이 Ensemble은 모델들을 조합하는 방식에 따라 몇 가지로 나뉘는데 그중에 하나가 Boosting이 있다.

Boosting은 어떤 한 모델의 결과값 중에서 예측이 잘못된 값들에 대해 가중치를 반영하여 다음 모델에 입력으로 넣는 식이고 각 모델들은 그 성능이 다르므로 각 모델에도 가중치를 반영한다.

이러한 Boosting 기법 중 병렬 학습이 지원되도록 구현한 라이브러리가 XGBoost 이다.

 

이 알고리즘을 주식 종가 예측에 선택한 이유는 성능이 좋고 컴퓨팅 자원 활용이 좋아 근래에 많이 사용되며 최근 Kaggle의 상위 랭커들이 많이 사용한다고 하기 때문이다.

(Kaggle은 예측모델 및 분석 대회 플랫폼으로 기업이나 단체에서 과제가 주어지면 데이터 과학자들이 이를 해결하는 모델을 개발하고 경쟁하는 곳이다.)

 

 

우선은 Python에서 XGBoost의 기본적인 활용을 알아보겠다.

 

밑에서 얘기할 XGBoost의 기본적인 활용을 알아보기 위한 프로그램 구성을 간략히 요약하면 아래와 같이 데이터를 불러오고 훈련과 예측을 위한 데이터로 분리한 후, 모델을 훈련시키고 그 결과로 예측과 평가를 하는 구조이다.

XGBoost 분석 구조

 

 

[1. 모듈 Import]

 

XGBoost 모듈 import

Python은 사용이 편한 이유 중 하나가 위와 같이 필요한 알고리즘 모듈을 불러와서 문법대로 사용만 하면 된다는 것이다.

위는 CSV 파일을 불러와서 읽어내기 위한 모듈과 XGBoost 알고리즘 수행을 위한 모듈, 실제값과 예측값을 평가하기 위한 모듈, 그래프를 그리기 위한 모듈, 그래프 사이즈를 고정시키는 모듈들이다.

또한, “%matplotlib inline”은 Python notebook에서 그래프를 나타내기 위해 꼭 입력해야 한다.

 

 

[2. 데이터 불러오기]

 

XGBoost 모듈 import

위는 CSV형식의 데이터를 불러오는 것이며, ‘ ’ 사이에 데이터 파일이 있는 주소와 파일명을 넣고 읽어드린 데이터는 각 column의 데이터를 쉼표로 구분하고 dataset에 저장한다.

이 예제에서는 당뇨병 관련 증상이 나열되어 있고 5년 이내에 당뇨병이 발병했는지 여부가 0 또는 1로 표현되어 있는 데이터를 사용하였다.

총 8개의 column과 768개의 row로 구성된 데이터 셋이며 1~7번까지의 column은 증상이고 8번째 column이 발병 여부이다.

데이터 구조 분석

다음은 아래의 코드를 통해 X에는 증상 데이터만 저장하고 Y에는 발병 여부의 데이터만 저장하여 데이터를 분리한다.

데이터 분리

 

[3. 데이터 가공하기]

 

X와 Y로 데이터를 분리하였으면 XGBoost 모델을 훈련하기 위한 데이터와 예측을 위한 입력 데이터로 구분해야 한다.

데이터 가공

이 데이터 분리를 위해서 scikit-learn 라이브러리의 train_test_split() 기능을 사용하였다.

앞에서 증상과 발병 여부로 구분한 X와 Y 데이터를 33%의 비율로 모델 훈련을 위한 train 데이터와 훈련된 모델을 통해 예측을 수행하기 위한 입력 데이터인 test 데이터로 구분한다.

Train_test_split() 기능은 다른 몇몇 조건을 세팅할 수 있는데 여기에서는 random_state 만을 정수 7로 설정하였다. 이 설정을 통해 이 구문을 여러 번 수행해도 결과 데이터 내용이 변경되지 않는다.

만약, random_state를 설정하지 않는다면 이 구문은 수행될 때마다 계속 다른 결과 값으로 변경된다.

이 설정은 다른 파라미터를 수정하여 코딩을 최적화시킬 때에 결과에 영향을 줄 수 있는 값을 고정시켜주는 효과가 있다.

 

 

[4. 모델 훈련시키기]

 

앞에서 XGBoost 모델 훈련과 예측을 위한 데이터 가공을 준비하였다.

모델 훈련을 위한 train 데이터 입력을 통해 아래와 같이 모델을 훈련한다.

XGBoost 모델 훈련

훈련된 모델을 print로 출력하면 다음과 같다.

XGBoost 모델 훈련 결과

XGBClassifier() 기능을 정의하는 파라미터들을 볼 수 있는데, 여기에서는 넘어가도록 하겠다.

사실 잘 알지도 못하고 인터넷에 많은 정보가 있으니 각각 검색하면 쉽게 찾아볼 수 있을 것이다.

다만, 이 파라미터들을 최적의 값으로 찾아주는 방법(GridSearchCV)이 있는데 이에 대해서는 추후에 알아보도록 하겠다.

 

 

[5. 예측 수행하기]

 

XGBoost 모델을 훈련하였다면, 이 모델에 앞에서 준비한 test 데이터를 입력하여 예측을 수행한다.

XGBoost 예측 수행

model.predict() 기능을 이용하여 예측값 y_pred를 얻는다.

y_pred 값은 기본적으로 발병을 했느냐 안 했느냐에 대한 예측이므로 데이터는 0 아니면 1 이어야 한다.

두 번째 줄은 혹시 예측 결과값 y_pred가 어떤 확률 값으로 얻어지는 경우에 그 값을 0 아니면 1로 만들어 predictions로 저장한다.

 

 

[6. 모델 평가하기]

 

이제 훈련된 모델을 통해 당뇨병 증상을 넣었을 때 5년 이내에 발병을 하는지(1) 아니면 안 하는지(0)를 예측 값으로 얻었다.

이 결과를 실제 데이터 y_test와 비교하여 모델을 평가한다.

XGBoost 모델 평가

위를 통해 predictions과 y_test를 그림으로 보면 아래와 같다.

XGBoost 예측 결과 도식화

눈에 잘 안 들어온다. 결과가 0 아니면 1에 대한 비교이므로 이보다는 아래처럼 accuracy_score() 기능을 통해 정확성을 확률로 표현하면 쉽게 이해할 수 있다.

XGBoost 예측 결과 확률 변환

그리고 결과는 아래와 같이 77.95%이다.

XGBoost 예측 결과

 

지금까지 주식 종가 예측 프로그램에 적용할 XGBoost의 기본적인 적용 방법을 알아봤다.

다음에는 주식 종가 예측 프로그램으로 넘어갈 텐데 그전에 주식 데이터는 시간 또는 날자에 따른 데이터 셋으로서 여기서 예제로 사용한 데이터와 형식이 다르다.

이러한 데이터를 가지고 예측을 하기 위한 방법에 대해 먼저 알아보고 이를 활용하여 최종적으로 주식 예측 프로그램에 적용해 보려고 한다.

반응형

댓글