본문 바로가기
Python

Machine Learning을 이용한 간단 주식 예측

by 아짱이아빠 2021. 1. 3. 20:30
반응형

이번에는 비교적 간단한 Machine Learning을 이용하여 주식의 종가를 예측하는 것을 알아보겠다.

 

파이썬 코드는 자주 보는 유튜브 동영상 강의를 참조하였다.

 

예측 알고리즘은 Radial Basis Function(RBF) 커널을 사용한 SVM을 통하여 구현한다.

컴퓨터공학이나, 소프트웨어 전공이 아니라 Machine Learning에 대한 자세한 내용은 모르지만, 간단히 설명하면 다음과 같다.

서포트 백터 머신(SVM)은 딥러닝은 아니지만 이에 못지 않은 성능을 내는 Machine Learning 알고리즘이며 가볍다는 장점이 있어 분류(Classification)나 회귀(Regression)를 위해 많이 사용된다고 한다.

먼저 기본이 되는 선형 SVM이 있으며 이것은 데이터를 선형으로 분리하는 최적의 선형 결정 경계를 찾는 알고리즘이다.

그러나 데이터가 선형적으로 분류 안되는 경우가 있고 이를 위해 나온 기법이 커널 기법이라고 한다.

커널 기법은 2차원에서 선형적으로 분류할 수 없었던 것을 3차원 공간에서 분류할 수 있도록 하는 것이다.

이러한 커널 기법에는 Polynomial 커널, Sigmoid 커널, 가우시안 RBF 커널등 종류가 많으며 그중 가장 성능이 좋다고 알려진 것이 가우시안 RBF 커널이라고 한다.

 

여기서는, 선형 SVM Polynomial 커널, RBF 커널 세가지를 같이 표현하여 데이터 출력 결과를 비교하고 다음날의 주식 종가를 예측해 보겠다.

 

 

[1. 모듈 Import]

 

다음의 모듈들이 필요하므로 Import 한다.

Python에서 제공하는 SVR 모듈을 포함해서 주식 데이터를 읽어오기 위한 “pandas_datareader” Import 한다.

모듈 Import
모듈  Import

위에서 google.colab에서 drive import 하는 것은 주식 예측 외에 Lotto 데이터도 예측을 해볼 것인데 그때에 google drive에 저장된 Lotto 데이터를 읽어오기 위한 것이다.

 

 

[2. 주식 데이터 로드]

 

다음의 코드를 통해 Yahoo Finance에서 코스피 주식 코드 055550에 해당하는 주식 데이터를 읽어온다.

다음의 코드는 전체 데이터 중에서 Machine Learning에 사용될 데이터를 잘라 stock_data_1에 저장한다.

주식 데이터 로드
주식 데이터 로드

여기서는 가장 오래된 데이터에서부터 1150개를 빼게 되므로 가장 최근의 데이터부터 일정량이 남아 사용되게 된다.

결과는 다음과 같으며 69개의 데이터가 남았다.

주식 데이터 로드 결과
주식 데이터 로드 결과

 

[3. 기타 세팅]

 

다음은 주식 데이터 중 가장 최근의 하루치 데이터를 추가로 빼서 예측된 결과와 맞춰보기 위해 가장 최근의 데이터를 빼는 내용이다.

데이터 차 계산

이 결과 Machine Learning에 사용되는 데이터는 68개가 된다.

 

다음은 주식 데이터에서 종가에 해당하는 “Adj Close” 값을 변수에 저장하는 부분이다.

Adj close 저장

모델을 훈련시키기 위해서 앞에서의 68 training용 주식 종가 데이터 외에 이와 개수가 동일한 일련번호가 필요하다.

아래는 이 일련번호를 만드는 코드이며 간단히 앞에서의 68개 주식 데이터 개수를 이용하여 만든다.

일련버호 부여

 

[4. 알고리즘 적용 및 결과]

 

다음은 선형 SVR Polynomial SVR, RBF SVR을 적용하는 부분이며 아래와 같이 Python에서 아주 간단하게 할 수 있다.

Machine Learning 적용과 결과
Machine Learning  적용과 결과

 

C gamma, degree에 해당하는 매개변수들은 여기서 다루지 않겠다.

알고리즘을 최적으로 만들기 위해서 이 매개변수들을 조정해야 하며 이전에 XGBoost 알고리즘을 통한 주식 종가 예측에서도 이와 유사한 매개변수들이 있었다.

그때와 동일하게 grid search라는 경험적 방법에 의해 최적의 매개변수를 빠르게 찾을 수 있는데 여기에 대한 지식은 많지 않아서 다룰 수가 없다.

또한, 여기서 예측하고자 하는 주식 데이터나 로또 데이터는 사실 데이터 경계로 나눌 수 있는 데이터가 아니라서 크게 의미가 없을 것이라 생각된다.

 

각 모델의 출력
각 모델의 출력

위는 각 모델이 출력한 결과와 실제 데이터를 도식화한 것이다.

그림에서 보면 알듯이 RBF 모델이 실제 데이터(검은 점)를 가장 잘 따라가고 있음을 알 수 있다.

 

이제 가장 최근의 날짜를 예측해 보겠다.

아래의 코드에서처럼 하루치를 더 만들어서 각 모델을 통해 예측을 수행하고 그 결과도 표시하였다.

각 모델을 통한 예측 결과
각 모델을 통한 예측 결과

예측하고자 했던 날의 실제 주식 종가는 32050.0이고 가장 가까운 값을 출력한 모델 역시 RBF SVR 모델임을 알 수 있다.

 

 

 

[RBF SVR을 통한 Lotto 당첨번호 합 예측]

 

이 알고리즘을 이용하여 Lotto 1등 당첨번호의 합을 예측해봤다.

이 블로그에 “Machine Learning을 이용한 Lotto 번호 생성 프로그램이란 글이 있는데 여기서 6자리 1등 당첨번호의 합을 예측하고 이 합을 만족하는 조합을 찾는 프로그램에 대한 내용이다.

이 때 예측은 XGBoost 알고리즘을 이용했는데, RBF SVR을 이용한 예측 중 어느 것이 좀 더 정확할지가 궁금해져서 추가로 해 보았다.

 

결과는 다음과 같다.

943회차 로또 1등 번호의 합은 147이었는데 XGBoost 알고리즘은 118을 예측했고, RBF SVR은 다음의 경향과 함께 148.47을 예측하였다.

각 모델을 통한 예측 결과
각 모델의 출력
각 모델을 통한 예측 결과
각 모델을 통한 예측 결과

위의 각 모델별 출력을 보면 선형이나 Polynomial 보다는 RBF 모델이 좋아 보이지만 그렇다고 주식 종가에 대한 결과에 비해 Lotto 데이터는 확실히 경향을 확인할 수 없다.

그러나 예측 결과에 있어서는 거의 유사한 숫자를 예측했는데 운이 좋았다고 볼 수 있다.

반응형

댓글