4기(20200711)/강화학습

강화학습과 RNN을 이용한 주식 프로그램 개요

KAU-Deeperent 2020. 7. 17. 18:41

-발표자 조민성

 

 

주식예측

 

 

머신러닝을 공부하다보면, 주식가격 예측에 관한 글들을 많이 보게 됩니다. ANN의 꽃이라고도 불리는 RNN 기법은 Linear Regression으로 해결하지 못했던 시퀀스데이터 예측을 가능케 하는데요, 이번 프로젝트에서는 단순 시세 예측이 아닌, 매수/매도 프로그램을 만들어볼 계획입니다.

 

 

NN Architecture

 

 

갑자기 왜 강화학습이 나왔는지 의아해 하실 수도 있을 것 같습니다. 그 이유는, 매수 / 매도때문입니다.

 

주식 시세는 RNN만으로도 해결 가능합니다. 지금도 구글에 검색하면, RNN으로 주식 시세를 예측한 글들이 상당히 많이 보이죠. 하지만, RNN만으로는 매크로를 만들기가 힘듦니다. 왜냐면 RNN은 수치 예측을 할 뿐, 행동을 결정하지 못하기때문입니다. 예를 들어 RNN모델이 어떤 주식의 미래 값을 1,000원이라 예측했다고 하겠습니다. 그렇다면 이 주식을 파는게 옳을까요, 아님 더 사는게 나을까요? 당연히 모릅니다. 매수 / 매도는 내가 주식을 샀던 값과, 예측값의 차이를 고려해서 결정해야하죠. 어쩌면 t시기에 예측한 값보다, t+10시기에는 더 오를지도 모릅니다.

 

이렇듯, RNN만으로는 매수/매도를 결정하기 어렵습니다. 그렇기에 고전적인 방법들에서는 하드코딩(Hard code)를 이용해서 문제를 해결했었습니다. 예를 들면, 내가 매수한 값과 예측값이 100원 이상 차이가 날때 매도를 하는 방식이죠.

이런 부분을 강화학습이 해결 할 수 있습니다.

 

<블랙잭>
<학습된 폴리시와 벨류펑션>

강화학습을 도입하는 이유를 블랙잭에 빗대어 설명하면 다음과 같다. 위 사진은 블랙젝에서 각각 상황에 대해 학습된 행동 정책과 각각 상황의 가치를 나타내는 밸류펑션이다. 기존 지도학습으로 다음 주가를 예측하는 것은 마치 밸류펑션만들 학습하는 것과 같다. 정말 수치예측만 하는 것이다. 다음 주가의 정보만 알려줄 분 판단은 사람이 해야 할 것이다. 그러나 강화학습을 도입하면 우리는 행동을 결정할 수 있다. 다음 주가가 떨어질거라 생각하여, 전량 매도하는 코드를 짯다면 실제로 떨어지지 않을 시 agent는 큰 손해를 볼 것이다. 강화학습을 통해  확률적인 정보를 더하여 최대한 수익이 높을 것이라 예상되는 폴리시를 학습시킬 수 있다.   

 

Network Detail

그럼 좀 디테일한 모델 구성을 해보겠습니다.

 

먼저 RNN의 경우는 LSTM을 쓸 계획입니다. 이 부분을 거의 공식에 가깝죠. 다만 저희 팀의 경우는 컴퓨터가 연산량에 뒤쳐질 수 있어 GRU를 사용하는 것도 고려하는 중입니다.

 

그렇다면 강화학습은 무엇을 쓸까요?

1) 일단 우리의 Action가짓수는 3개입니다. Discrete한 Action이죠.

2) 또한 Model Free이어야 합니다. 주식 시장을 환경이라 본다면, t시간대의 주식값을 state라 볼 수 있겠죠. 문제는 주식시장에서 같은 state가 다시 나타날 가능성은 거의 없습니다. 다시말해 state가 거의 무한대에 가까운 상황입니다.

이런 경우는 Value Network를 구성해서 state를 Approximation하는 방법밖에 없습니다.

 

이 경우들을 고려해보면 우리의 선택은 DQN과 SARSA, 그리고 Expected SARSA 중에서 이루어질 것입니다. DQN은 많은 분들이 아실테지만, SARSA와 Expected SARSA의 경우는 잘 못들어보셨을지도 모릅니다. 강화학습 개념을 공부할 때 워낙 순식간에 지나가서 잊어버리기 쉽거든요.

 

세가지 방식의 차이는 하나입니다. Q의 값을 무엇을 쓸 것이냐? DQN은 maxQ를 사용합니다. SARSA는 Q를 사용하죠. Expected SARSA는 pi(s)*Q, 즉 기대값을 사용합니다. 각각은 장단점이 있습니다.

위 그림은 간략한 길찾기 게임입니다. S는 시작지점, G는 목표, Cliff는 -100의 reward를 주고 다시 S로 돌려보내는 구역입니다. Cliff를 제외한 모든 칸은 한번 이동시 -1의 reward를 줍니다. 여기서 질문을 드리자면, 과연 빨간 색선과 파란색 선 중 무엇이 DQN일까요?

 

DQN은 기본적으로 Optimal Q function을 근사하는 방식입니다. 어떤 policy에 따르던, 가장 높은 Q를 가진 방향으로 학습하죠. 극단적으로 어떤 state에서 왼쪽은 0.9의 확률, 오른쪽은 0.1의 학률을 따른다고 하겠습니다. 이때 왼쪽의 Q값이 -100, 오른쪽은 100이라고 한다면, DQN에서는 해당 state의 Q계산에서 100을 사용하게됩니다. 90%의 확률로 -100을 받더라도 말이죠. 물론 이 예시의 경우는 나중에 수렴을 통해서 어느정도 해결이 됩니다. 하지만 결국 maxQ를 사용한다는 의미는, 다른 경우들은 무시하겠다는 것과 같습니다.

 

다시 그림으로 돌아가면, 이제 어느정도 답변하실 수 있으실 겁니다. 빨간색 선이 DQN입니다. 자칫하면 Cliff구역으로 빠질 수 있음에도, DQN은 무시하는 결과를 보여주죠. 그렇다면 파란색 선은 무엇일까요? 바로 SARSA입니다. 제가 위에서 SARSA는 Q를 사용한다는 것을 언급했습니다. 이 뜻은, 실제 policy와 연관해서 사용한다는 겁니다. 만일 policy의 과정에서 Cliff에 빠지는 경우도 있었다면, 그 역시 연산에 포함한다는 것입니다. Expected SARSA의 경우는 따로 설명하지 않겠지만, pi(s)*Q를 사용한다는 것에서, 어느정도 이해하실 거라 생각합니다.

SARSA pseudocode

 

 

 

DQN pseudocode

 

 

그럼 실제로 주식예측에서 SARSA를 고려 할만한 이유는 무엇일까요? 만약 어떤 주식이 0.9의 확률로 폭락하고, 0.1의 확률로 상승할 것이라 예측했다고 하겠습니다. 그럼 DQN은 당연히 0.1의 확률의 경우로 연산합니다. 우리가 프로그램이 공격적인 주식을 하길 원한다면, 이는 상당히 훌륭한 전략입니다. 하지만 우리는 Agent가 조금 보수적으로 주식을 하기를 원한다면, DQN은 좋은 방안이 아닙니다. 이 경우 SARSA가 더 맞을 수도 있죠. 즉 DQN과 SARSA의 문제는 주식 성향과 관련된 문제라고 할 수 있습니다. 물론 다양한 분야에서 대체적으로 DQN이 훌륭하다는 결과가 많지만, 스터디를 하는 입장에서는 다른 방식도 고려해 볼만한 필요가 있어 보입니다.

 

 

Value Network

마지막 논의사항 하나만 더 얘기하고 글을 마치겠습니다. 과연 우리는 RNN과 강화학습을 어떻게 연결시킬까요? 다양한 방법이 있지만, 저희 팀에서 고려중인 부분은 Value Network에 RNN을 도입하는 방식입니다.

 

Value Network 예상도

RNN에서 시퀀스데이터를 받으면, 해당 아웃풋들을 Fully Connected Layer에 인풋으로 다시 넣는 방식이죠. 문제는 이 RNN을 어떻게 훈련시키느냐 입니다. 크게 두가지 방법이 보입니다.

 

1)하나는 RNN과 FC 모두 강화학습 훈련과정에서 처리하는거죠. 이 방식은 Value Netork에 맞도록 RNN이 잘 훈련될 것으로 보입니다. 그런데 시간이 상당히 오래 걸릴 것 같네요.

2)다음은 RNN은 지도학습으로 주식 가격을 예측하는 모델로 만들고, 이후 해당 가중치들을 전부 옮겨서, 강화학습에 사용하는 것입니다. 이 경우 강화학습은 FC만 훈련하게 될 겁니다. 시간도 덜 걸리고, 편하게 작업할 수는 있지만, 실제 Value Network에서 잘 작동할지는 미지수입니다.

 

다음주 쯤에는 모델을 어느정도 확정하고, Reward function을 구성해야 할 것 같습니다. 또한 훈련에 사용할 데이터들을 모아야 하고, 실제 Online Learning은 모의 투자에서 돌릴 계획이라, 키움 api도 어느정도 공부해야 할 것으로 보입니다.

 

 

'4기(20200711) > 강화학습' 카테고리의 다른 글

DDPG 코드 리딩  (0) 2020.08.07
자율주행 가상환경과 Architecture  (1) 2020.07.31
라즈베리파이를 이용한 Auto Driving  (0) 2020.07.24