: 평소에 강화학습을 이용하여, 주식 또는 코인에 대한 자동 매매 프로그램을 개발하고자 했다. 평일에는 본업에 충실.. 해야하기 때문에, 퇴근 후 또는 연휴에 틈틈이 진행해보았다. 먼저, 24시간 대응을 할 수 있는 코인 시장에 대한 매매 프로그램을 개발할 예정이고, 현재 어느 정도 개발을 진행했다.

 

그러나, 개발을 하면서 생각보다 많은 고민 사항들이 있었고, 이를 블로그에 적어가며 기록해보고자 했으며, 이를 토대로 좀 더 Fancy한 매매 프로그램을 개발해보고 싶었다. 지금까지 개발 진행 사항은 다음과 같다.

 

1) 실시간 Chart Data 적재

2) MultiLayer-LSTM 기반 A2C RL Training Model 

 

 

* 실시간 Chart Data 적재

 

먼저, 실시간 Chart Data는 국내에서 가장 유명한 거래소인 Upbit의 API를 이용하여 Data를 적재하고 있다. 종목에 대해서는 우선 가장 거래량이 많은 BTC, ETH, XRP, LINK, EOS, HBAR 종목에 대해서만 Data를 Local DB에 실시간으로 적재하고 있다.

Local DB는 무료로 사용할 수 있는 MySQL을 이용하고 있으며, 각 open, close, high, low, accVolume, accPrice 는 시가, 종가, 최고가, 최저가, 누적 거래량, 누적 거래금액을 의미한다. 여기서 interv는 각 기간에 대한 기준을 의미하며, month, week, day, 240min, 60min, 15min, 5min, 3min, 1min 총 9개의 카테고리가 있다. 코인 같은 경우는 아무래도 24시간 유효한 시장이므로, 분 단위의 Data를 가지고 요리해보고자 했다.

 

특히, 주의할 부분은 Upbit API에서 Data를 호출할 수 있는 Limit Count 때문에, Day 기준의 Data는 1~2년 전의 Data도 가져올 수 있지만, 분 단위 Data는 하루가 지나면 호출할 수 없기 때문에 실시간으로 Data를 가져오는 Batch Job을 만들어 실행 중에 있다.

 

분 단위의 Data를 적재하다보니, DB 용량에 대한 우려를 할 수 있을텐데, 현재 약 한 달 정도 Data를 적재했을 때, 용량은 다음과 같다.

물론, 종목을 늘리면 Dramatic하게 올라가겠지만, 현재 본인 컴퓨터의 리소스를 고려했을 때는 적은 용량이 분명하다. 추후, 기회가 된다면 어떻게 API로 부터 Data를 호출하고, 이를 DB에 적재했는지에 대한 과정을 포스팅할 예정이다.

 

 

* MultiLayer-LSTM 기반 A2C RL Training Model 

 

학습 모델 개발은 기본적으로 "Python"으로 진행했다. 특히, 학습을 위해서 사용한 Deep Learning Library는 torch를 이용했으며, Single GPU를 이용하여 학습시켰다. 최근 강화학습 관련한 방법론 중에서 알파고로 유명했던 Actor-Critic 기반의 RL(Reinforcement Learning)과 비교했을 때, 성능이 더 좋은 방법론들도 많이 나왔지만, Actor-Critic이 구현하기도 쉽고 일반적으로 성능도 기존의 DQN보다 좋았기 때문에 Advantage Actor-Critic(A2C)로 진행해 보았다. 강화학습 기법에 대해서는 어느 정도 개발이 진전되고, 안정화가 되면 다양하게 시도해볼 예정이다.

 

보통 A2C보다 A3C가 성능이 더 좋지만, A3C 같은 경우에는 여러 개의 A2C Model로 학습하고, Global Network를 Update해야하는데, GPU가 1개 밖에 없기 때문에 효율성을 따져서 A2C로 진행했다. 이것도 추후에 GPU가 추가로 더 생기면 진행해볼 예정이다.

 

현재 Agent, Enviornment, Network, Learner 등 모델을 학습하기 위한 코드는 어느 정도 진행되었고, 모델을 학습시키면서 성능을 향상시키기 위한 고찰을 위주로 포스트에 업로드할 예정이다. 

 

강화학습 모델을 만들기 위해서는 Visualization이 무척 중요한데, 주식투자에 대한 Visualization은 DL/RL 주식투자 (김문권 지음) 책에서 보여준 방법이 본인이 생각할 때, 현재로서는 가장 나은 방법인 것 같아 참고를 하여, 적용해보았다.

 

그리고 일반적으로 주식차트를 학습시킬 때, 대체적으로 주가가 상승세를 보이면 어떻게 하든 돈을 잘 버는 모델로 학습이 된다. 그 이유는 어느 시점에 언제 어떻게 사든지, 결국 상승세를 보이기 때문에 해당 모델은 학습이 잘되는 것 처럼 보일 수도 있다. 

 

그러나, 이러한 자동 매매 프로그램 같은 경우에는 하락, 상승을 반복하며 횡보를 하거나 아니면 하락장일 때, 수익을 극대화시키거나, 손실을 최소화시키는 모델을 만드는 것이 더욱 중요하다.  즉, 하락이 예상될 때는 기존에 갖고 있던 주식을 모두 팔거나 매수를 홀딩하게 끔 학습이 되어야하며, 상승이 예상될 때는 매수를 적극적으로 하게 만드는 것이 목표이다.

 

예를 들어, 현재 학습하고 있는 모델의 한 에피소드를 살펴보자. 간단하게 빨간색은 매수, 파란색은 매도, 녹색은 홀드를 했다고 보면 되고, 맨 위의 차트는 실제 주식 차트이며, 두 번째 차트는 Agent가 주식을 보유하는 추이를 보여주며, 위의 경우에는 가격이 최저점 부근부터 점차 매수를 진행한 것으로 보면 된다. 그리고, 마지막 차트는 백만원으로 시작했을 때, 손익에 대한 차트이며, 해당 모델은 10% 수익이 나면 에피소드를 종료하는 것을 Target으로 했기 때문에 10만원을 번 시점 이후에는 끝이 났다. 위의 차트는 15분 봉이기 때문에, 실제 3일 동안 10%의 수익이 발생한 것으로 볼 수 있다. 

그러나, 이러한 모델을 바로 매매 프로그램에 적용하기 어려운 고민점들이 있기 때문에, 이번 기회에 이를 하나씩 파헤쳐보고 개선을 해보자 한다. 

+ Recent posts