본문 바로가기

주식 데이터 모델링

딥러닝으로 캔들스틱 차트 이용해서 주식 예측 - 예제코드

 지난번 논문을 읽고 그 논문관련 코드를 작성해보았습니다. 이미 코드가 전부 공개되어 있긴 하지만, 공부를 위해서는 역시 내가 원하는 식으로 작성해보는게 도움이 될 것 같아서였습니다. 코드를 간단하게 바꿔보고자 하는 마음도 있었습니다.

 


 코드는 크게 3가지 파트로 구성하였습니다. 

1. 주식 데이터를 캔들스틱 차트로 바꾸기

2. 차트와 라벨을 이용해서 데이터 제너레이터 생성

3. 모델 훈련

 

 

 1. 주식데이터를 캔들스틱 차트로 바꾸기

 

 Colab을 이용했기 때문에 코드 상단에 구글드라이브 폴더를 mount 하는 부분이 있습니다. 이부분은 local에서 진행할떄나 colab에서 진행할때나 어쨌든 주식 데이터가 있는 곳을 지정해주면 됩니다.

 

 이부분의 코드는 DeepCandle 소스코드를 참고했습니다. 기존 소스코드는 주식 데이터들을 전처리 과정을 거쳐서 차트이미지를 라벨에 따라서 저장하여 처리합니다. 저는 코드를 따로 파일을 저장하지 않는 형태로 바꾸었습니다. 차트이미지와 라벨을 list에 저장해서 바로 훈련에 사용했습니다. 

 

 어차피 예제코드에서는 하나의 종목만 이용해서 훈련을 진행하기 때문에 번거로운 과정을 생략했습니다. 사용한 패키지는 mpl_finance 입니다. 이 패키지에서 주식데이터를 캔들스틱 차트로 바꾸는 함수를 사용했습니다.

 

 참고로 논문에서 제일 성능이 좋다고 지정한 sequence length 20, dimension 50(코드에서는 48)을 사용했습니다.

 이런식으로 그림이 생성됩니다.

 

 

 2. 데이터 Generator 생성

 

 훈련할 데이터를 어떤식으로 저장하고 불러오는 등의 처리를 하는 방식은 정말 다양합니다. 본인이 원하는 기능을 구현한 함수나 클래스를 이용할 수도 있고, tensorflow 에서 제공하는 data 관련 api를 활용할 수도 있습니다. 저는 python의 generator 기능을 사용했습니다. Generator를 만들어서, train set이나 test set에서 랜덤하게 batch를 뽑아오도록 만들었습니다.

 

 

 3. 모델 훈련

 

 총 3가지 방식으로 모델링을 진행했습니다. 논문에서 제일 성능이 좋았다고 제시한 CNN 구조, 두번째로는 첫번째 CNN 구조에서 Dropout을 제거하고, 세번째로는 VGG랑 비슷한 형태로 Conv2D와 Pool을 조합한 구조 입니다. 딥러닝 예제 코드를 작성했을 때와는 다르게 훈련 코드를 조금 다른 형태로 작성했습니다.

 

 

4. 결론

 

 모든 모델들이 훈련이 잘 진행되지는 않았습니다. 다음날 종가가 상승이냐 아니냐를 맞추는 binary classification 문제이고, loss는 cross entropy로 하고 훈련을 진행했습니다. 마지막 layer의 활성화 함수를 sigmoid로 지정해주었구요. 일단 train loss가 훈련을 하는동안 떨어지지 않았습니다. 

 

 언더 피팅 문제로 보이기 때문에 모델의 크기를 한번 키워봤지만 여전히 문제는 해결이 안되었습니다. 필요하신 분들은 아래에 코드를 공유해드릴테니, 코드를 수정해서 훨씬 더 많은 종목의 데이터를 넣거나, 모델의 구조, 하이퍼파라메터 등을 수정하셔서 진행하시면 좋을 것 같네요.

 

https://colab.research.google.com/drive/1WXG3cohwO6_0mbmB9CdT37cc1jfE2Zon