티스토리 뷰

투자하고 있는 주식 종목의 미래 가치를 예측하여 자산 관리에 도움이 될 수 있도록 하기 위해 이 프로젝트를 교내 학회에서 진행하였습니다.

 

1. Dataset 설명

2. Data Preprocessing

3. Modeling

4. 확장점

 

1. Dataset 설명

FinaceDataReader은 금융데이터를 크롤링하여 데이터를 로드할 수 있는 파이썬 오픈소스입니다. 

https://github.com/FinanceData/FinanceDataReader 

 

GitHub - FinanceData/FinanceDataReader: Financial data reader

Financial data reader. Contribute to FinanceData/FinanceDataReader development by creating an account on GitHub.

github.com

 

FinanceDataReader을 import 하여 DataReader 메서드를 이용해 데이터를 로드할 수 있습니다. 로드하고 싶은 주식 종목의 코드를 위 Github에서 찾고 원하는 기간을 인자로 줄 수 있습니다. 본 프로젝트에서는 삼성전자, 하이브 엔터테인먼트, 테슬라 종목을 불러와 동일 모델로 학습시킨 후 비교하는 것을 진행하였습니다.

 

2018년부터 삼성전자 데이터 불러오기

 

2. Data Preprocessing

시계열 데이터를 전처리할 때 가장 중요한 것은 데이터의 평균과 분산이 시간의 흐름에 따라 변한다는 것을 상기하는 것입니다. 특히 결측치를 단순하게 데이터의 평균으로 대체한다면 특정 구간에서 시간의 흐름과 상관없는 데이터 분포를 보여줄 수 있습니다. 사용한 FinanceData에서는 결측치는 없지만 다른 데이터에서는 결측치를 직전 관측치나 직후 관측치로 대체하는 것이 중요합니다.

 

데이터를 정규화, Train/Test Data로 분리해 준 다음 Tensorflow Dataset을 활용해 시퀀스 데이터셋을 생성해 주었습니다. 모델을 학습할 시에 전체 Raw Data 자체를 입력으로 주는 것보다 Batch size와 Window Size에 따라 Raw Data를 분할, 슬라이싱 하면서 하나의 데이터셋을 생성해 주는 것입니다. 이렇게 하는 이유는 데이터의 특정 구간에서의 과적합을 방지할 수 있고 일반화된 모델을 생성할 수 있기 때문입니다. 본 프로젝트에서는 'Close(종가)'에 대한 학습과 예측만 진행했기에 해당 칼럼에 대한 데이터에만 시퀀스 데이터셋을 생성했습니다.

 

3. Modeling

Convolution layer을 이용하여 데이터를 1차원 feature map으로 변환시킨 값을 LSTM 계층의 입력값으로 넣어주었습니다. Convolution layer은 filter을 통해 입력 데이터와 filter 간의 합성곱 연산으로 입력 데이터의 feature을 추출하는 역할을 합니다. 합성곱 연산을 통해 특정 구간의 벡터 값이 높다는 것은 데이터의 중요한 feature에 가중치를 더 주어 학습 시에 더 활용한다는 것을 의미합니다. 합성곱 연산에서 가장 중요한 것은 합성곱 연산으로 나온 output의 수를 filter의 채널 수와 맞추는 것이 중요합니다. 이 점은 CNN(Convolution Neural Network)에 대한 포스트에서 자세히 다루겠습니다.

 

Conv1d을 이용하여 1차원 입력 데이터에 대한 합성곱 연산을 수행한 후 LSTM 계층 수행을 진행했습니다. LSTM은 RNN이 가지는 Gradient Descent 문제를 해결할 수 있는 한 층 발전된 모델입니다. 간단히 요약하자면 현재의 Cell State Gate에 현재 상태의 입력값과 과거 상태의 정보를 더해 Output을 정할 수 있는 구조입니다. LSTM의 자세한 구동 원리는 시계열 딥러닝 모델에 대한 포스트에서 자세히 다루겠습니다. 본 프로젝트는 종가에 대한 학습과 예측만 이뤄지기 때문에 Dense층의 units을 1로 설정하였습니다. 

 

4. 확장점

학습에 사용된 데이터의 수가 약 천개로 크게 복잡하지 않았기 때문에 복잡한 모델을 사용하지 않아도 꽤 괜찮은 정확도를 산출할 수 있었습니다. 데이터의 수가 많아진다면 Dropout 층을 추가해 일부 파라미터만 학습시키거나 LSTM 모델에서 한 층 발전된 GRU 모델을 사용하여 모델링하는 방법으로 확장시킬 수 있을 거 같습니다.

 

본 프로젝트에 대한 전체 코드는 https://github.com/hba-sangil/hba-sangil-deep-learning/blob/main/LSTM.ipynb 에서 볼 수 있습니다.

 

 

 

TAG more
글 보관함
최근에 올라온 글