4장 배경 이론: 강화학습을 이용한 주식투자란?

원본: https://blog.quantylab.com/stock_rl_differ.html

강화학습은 주로 게임용 인공지능에 적용되어 왔으나, 강화학습이 적용될 수 있는 분야는 무궁무진하다. 이번 장에서는 주식투자에 강화학습을 적용하는 방법에 대해서 알아보자.

직관적으로 강화학습 전략 알아보기

강화학습으로 무작정 주식투자를 해보고 경험을 쌓아 잘한 경우에 긍정적으로 보상하고 잘못한 경우엔 부정적으로 보상함으로써, 일일이 학습 데이터를 만드는 수고를 없애면서도 효과적으로 주식투자 머신러닝을 수행할 수 있는 전략을 알아보자. 

강화학습을 이용한 주식투자 구조

주식투자도 어떠한 환경에서 매수(buy), 매도(sell), 관망(hold) 등을 판단하는 문제로서 강화학습을 적용할 수 있다. 주식투자에 강화학습을 적용했을 때 구성 요소는 다음과 같다.

주식투자 강화학습에서 에이전트는 행동을 수행하는 주체인 투자자 역할을 한다. 행동은 매수, 매도, 관망 등이 있을 수 있다. 행동은 신경망으로 결정하고 신경망은 투자를 진행하면서 발생하는 보상과 학습 데이터로 학습한다.

주식투자 강화학습에서의 환경은 다양하게 정할 수 있지만, 여기서는 한 종목의 차트 데이터를 환경으로 고려합니다. 에이전트가 수행하는 행동의 결과로 발생하는 수익 또는 손실을 보상으로 하여 신경망을 학습합니다.

차트 데이터 이해하기

차트 데이터는 어떠한 종목의 시가, 고가, 저가, 종가, 거래량 등 있는 그대로의 데이터이며 차트 데이터로 투자 손익을 계산한다. 학습 데이터는 인공 신경망을 학습할 목적으로 가공한 데이터이다. 

다음은 일봉 차트의 예시이다. 번호를 매긴 화살표가 가리키는 지점의 종가에서 어떤 투자 행동을 해야 할까?

직관적으로 1번에서는 매수, 2번에서는 매도, 3번에서 매수, 4번부터 9번까지는 매도 및 관망, 10번에서는 매수를 하면 괜찮은 수익을 낼 수 있다.

차트 데이터를 바탕으로 강화학습을 하는 방식

이 차트에서 강화학습으로 무작정 투자 행동을 결정하고 어떤 식으로 학습할 수 있을지 살펴보겠다. 이 예제에서는 초기 자본으로 1,000만 원이 있고 거래에 대한 수수료와 세금은 고려하지 않고 1주씩만 매수하거나 매도한다고 제한한다. 그리고 2%의 손익이 발생했을 때 보상을 줍니다. 다음 표는 매수만 해보는 경우의 결과를 보여준다.

강화학습 주식투자 예 - 매수만 하는 경우

지점 종가 행동 보유 주식수 누적 손익률 보상 결정 누적 보상
1 791,000 매수 1 0% - 매수[+1], 매도[0]
2 866,000 매수 2 0.75% - 매수[+1], 매도[0]
3 824,000 매수 3 -0.09% - 매수[+1], 매도[0]
4 960,000 매수 4 3.99% 보상 +1 매수[-1], 매도[0]
5 880,000 매수 5 0.79% 보상 -1 매수[-1], 매도[0]
6 813,000 매수 6 -2.56% 보상 -1 매수[-1], 매도[0]
7 810,000 매수 7 -2.74% - 매수[-1], 매도[0]
8 767,000 매수 8 -5.75% 보상 -1 매수[-1], 매도[0]
9 783,000 매수 9 -4.47% - 매수[0], 매도[0]
10 765,000 매수 10 -6.09% - 매수[0], 매도[0]

이렇게 매수만 해 보니 4번 시점에서 2%가 넘는 3.99%의 수익이 발생하여 1~3번에서 했던 행동들을 +1로 보상하고, 5번 시점에서 -3.2% 손실이 발생하여 직전인 4번 행동을 -1로 보상한다. 이런 식으로 10번까지 매수를 하면서 수익률 변동에 따라 보상을 주고 나면 각 괄호에 표시한 대로 누적 보상이 생긴다.(-1 보상은 2% 이상 손실이 발생하는 순간 받음)

(누적 보상은 즉시 받는게 아니라 보상 결정이 발생하는 순간 trajectory를 따라서 뒤로 가면서 결정된다. 근데 과거 어디까지 리워드를 주는지도 안적혀있다.)

다음 표에서는 이전에 받은 보상을 기반으로 매수와 매도를 결정한다. 매수와 매도의 누적 보상이 같을 경우에 매수를 선택했다.

지점 종가 행동 보유 주식 수 누적 손익률 보상 결정 누적 보상
1 791,000 매수 1 0% - 매수[+2], 매도[0]
2 866,000 매수 2 0.75% - 매수[+2], 매도[0]
3 824,000 매수 3 -0.09% - 매수[+2], 매도[0]
4 960,000 매도 2 3.99% 보상 +1 매수[-1], 매도[-1]
5 880,000 매도 1 2.39% - 매수[-1], 매도[-1]
6 813,000 매도 0 1.72% 보상 -1 매수[-1], 매도[0]
7 810,000 매도 0 1.72% - 매수[-1], 매도[0]
8 767,000 매도 0 1.72% - 매수[-1], 매도[0]
9 783,000 매수 1 1.72% - 매수[0], 매도[0]
10 765,000 매수 2 1.54% - 매수[0], 매도[0]

처음 매수만 결정했을 때보다는 투자를 잘하는 것 같다. 여기서도 보상을 해보자. 4번 지점에서 3.99% 수익이 생겨서 직전 행동까지 +1을 보상한다. 6번 지점에서는 4번 지점 대비 -2.2%의 손실이 생겨서 직전 행동까지 -1을 보상한다.

(책 설명이 진짜 거지꺵깽이 같다. 누적 보상은 이전 에피소드 점수에 더해지는거다)

그런데 잘 보면 4번 지점과 5번 지점에서는 행동 결정을 잘했는데도 -1로 보상을 받는다. 이러한 문제는 학습을 반복적으로 진행하다 보면 대부분 해결된다. 이 상태에서 다시 누적 보상을 보고 투자를 진행해보자.

지점 종가 행동 보유 주식 수 누적 손실률 보상 결정 누적 보상
1 791,000 매수 1 0% - 매수[+3], 매도[0]
2 866,000 매수 2 0.75%   매수[+3], 매도[0]
3 824,000 매수 3 -0.09%   매수[+3], 매도[0]
4 960,000 매수 4 3.99% 보상 +1 매수[-2], 매도[-1]
5 880,000 매수 5 0.79% 보상 -1 매수[-2], 매도[-1]
6 813,000 매도 4 -2.56% 보상 -1 매수[-1], 매도[0]
7 810,000 매도 3 -2.68% - 매수[-1], 매도[0]
8 767,000 매도 2 -3.97% - 매수[-1], 매도[0]
9 783,000 매수 3 -3.65% - 매수[0], 매도[0]
10 765,000 매수 4 -4.19% - 매수[0], 매도[0]

4번 지점과 5번 지점에서 누적 보상이 매수는 -2, 매도는 -1로 다시 매도의 보상이 더 높아 졌다. 최종적으로 2번째 학습 과정에서의 행동 결정을 하게 학습됐다. 이제는 더 학습해도 똑같은 결과만 얻게 될 것이다.

거래 수수료와 거래세

실제 투자에서는 거래 수수료와 거래세를 비용으로 고려해야 한다. 적용하는 수수료와 세금은 다음과 같다. 세금은 코스닥 기준

  • 매수 수수료: 0.015%
    • 매수 시 발생하는 비용으로 증권사가 취하는 거래 수수료
    • 매수 거래 금액이 100만원이면 수수료는 150원
  • 매도 수수료: 0.015%
    • 매도 시 발생하는 비용으로 증권사가 취하는 거래 수수료
    • 매도 거래 금액이 100만원 일 경우 수수료는 150원
  • 거래세: 0.25%
    • 매도 시 발생하는 비용으로 국가가 취하는 거래 수수료 
    • 매도 거래 금액이 100만원일 경우 거래세는 2500원

현재 주가가 10만 원인 주식을 10주 사서 100만 원어치 매수하고 그대로 100만 원에 판다고 가정해 보자. 수수료와 거래세를 적용하지 않을 경우 포트폴리오 가치(portfolio value, PV) 값은 변하지 않을 것이다.

  • 매수 전 PV=주식 잔고 0×현재 주가 100,000원+현금 잔고 1,000,000원=1,000,000원
  • 매수 후 PV=주식 잔고 10×현재 주가 100,000원+현금 잔고 0원=1,000,000원
  • 매도 후 PV=주식 잔고 0×현재 주가 100,000원+현금 잔고 1,000,000원=1,000,000원

하지만 현실에서는 매수와 매도에서 비용이 발생하므로 위 경우에 수수료와 세금을 적용하면 다음과 같다.

  • 매수 전 PV=주식 잔고 0×현재 주가 100,000원+현금 잔고 1,000,000원=1,000,000원
  • 매수 후 PV=주식 잔고 10×현재 주가 100,000원+현금 잔고 0원–매수 수수료 150원=999,850원
  • 매도 후 PV=주식 잔고 0×현재 주가 100,000원+현금 잔고 999,850원–매도 수수료 150원–거래세 2,500원=997,200원

즉, 거래를 적게 하는 것이 비용을 줄이는 길이다. 투자에서 매수와 매도를 신중하게 결정해야 하는 이유이기도 하다.

강화학습 효과를 차별화하는 요인들

주식투자 강화학습에서는 강화학습 모델을 다양하게 구성할 수 있다. 강화학습 모델에서 고려할 학습 데이터, 보상 규칙, 행동의 종류, 신경망 종류, 강화학습 기법 등을 달리할 수 있으며, 이에 따라 강화학습의 효과가 달라질 수 있다. 이렇게 다양한 차별화 요인이 존재하기 때문에 어떠한 강화학습 모델이 효과적으로 주식투자를 학습할 수 있을지는 다양한 실험과 비교 분석을 해야 알 수 있다.

차별화 요인 1: 학습 데이터 구성

이 책에서 강화학습 신경망을 학습할 때 사용하는 데이터는 기본적 분석 지표와 기술적 분석 지표를 종합적으로 사용한다. 여기서 제시하는 데이터 구성 외에도 수많은 방식으로 학습 데이터를 구성할 수 있다.

기본적 분석 지표 자질로 PER, PBR, ROE를 사용한다.

  • 주가수익비율(Price Earning Ratio, PER) = 주가/주당순이익
    • PER은 주가와 회사의 순이익의 비율이다. PER이 낮을수록 회사의 순이익에 비해 주가가 저평가돼 있다고 볼 수 있다. 그러나 업종마다 평균 PER의 차이가 크기 때문에 PER이 높다, 낮다라고 절대적으로 판단할 기준은 없다.
  • 주가순자산비율(Price Book-value Ratio, PBR) = 주가/주당순자산
    • PBR은 자산 대비 주가의 비율이다. PBR이 낮을수록 회사의 가치 대비 주가가 낮다는 것이므로 해당 종목이 저평가돼 있을 가능성이 있다.
  • 자기자본이익률(Return On Equity, ROE) = PBR/PER
    • ROE가 높을수록 자산 대비 이익이 크다는 의미이다. 그러므로 ROE가 높은 종목은 회사의 성장 가능성이 높다고 볼 수 있다.

다음은 학습 데이터에 포함된 주가 및 거래량과 관련된 특징들이다.

  • 전일 종가 대비 당일 시가 비율 (open/last close): 당일 시가를 전일 종가로 나눈 값. 주로 전일 종가에 비해 당일 시가가 상당히 높으면 '갭상승'이라 하고, 반대로 전일 종가보다 당일 시가가 많이 떨어져 있으면 '갭하락'이라 부른다.
  • 당일 종가 대비 당일 고가 비율 (high/close): 당일 고가를 당일 종가로 나눈 값. 이 값만으로는 추세를 예측할 수는 없지만, 학습 데이터의 특징으로 가치가 있다. 당일 고가가 종가에 비해 상당히 높다면 많은 경우에 저항선을 뚫지 못해서 추가적인 상승이 어렵다고 여기기도 한다. 이를 '일봉의 위꼬리가 길다'라고도 표현한다.
  • 당일 종가 대비 당일 저가 비율 (low/close): 당일 저가를 당일 종가로 나눈 값. 당일 저가보다 당일 종가가 더 낮으면 지지선이 하향돌파될 우려가 있으므로 강화학습 학습 데이터에도 특징으로 추가했다.(저가는 당일에 가장 낮은 가격인데 어떻게 종가가 더 낮을 수가 있지..?)
  • 당일 종가 대비 전일 종가 비율 (close/last close): 당일 종가를 전일 종가로 나눈 값. 일반적으로 주가가 올랐다, 떨어졌다를 얘기할 때 당일 종가에서 전일 종가를 뺀 다음에 다시 전일 종가로 나누는데, 수식으로는 (close–last close/last close)가 된다. 같은 의미지만, 학습 데이터에는 비율 값으로 사용했다.
  • 전일 거래량 대비 당일 거래량 비율 (volume/last volume): 당일 거래량를 전일 거래량으로 나눈 값. 주가가 상승하면서 거래량이 늘면 주가 상승에 긍정적인 신호로 여기는데, 이를 포착하고자 이 값을 학습 데이터의 특징으로 추가했다.
  • 5일 평균 종가 대비 당일 종가 비율 (close/MA5 close): 당일 종가를 5일 동안의 평균 종가로 나눈 값. 단기 주가 추세를 학습 데이터 특징으로 고려하기 위해 사용한다.
  • 10일 평균 종가 대비 당일 종가 비율 (close/MA10 close): 당일 종가를 10일 동안의 평균 종가로 나눈 값. 마찬가지로 단기 주가 추세를 고려하기 위함이다.
  • 20일 평균 종가 대비 당일 종가 비율 (close/MA20 close): 당일 종가를 20일 동안의 평균 종가로 나눈 값. 20일선은 주가 추세를 잘 보여주는 이동평균선이다. 이 값 역시 학습 데이터에서 매우 가치 있을 것이다.
  • 60일 평균 종가 대비 당일 종가 비율 (close/MA60 close): 당일 종가를 60일 동안의 평균 종가로 나눈 값. 60일선 역시 대표적인 이동평균선이다. 20일선이 60일선을 상향 돌파하면 골든 크로스(golden cross)라고 부를 정도로 매우 의미 있는 이동평균선이다.
  • 120일 평균 종가 대비 당일 종가 비율 (close/MA20 close): 당일 종가를 120일 동안의 평균 종가로 나눈 값. 120일은 주식 거래일 기준 약 6개월에 해당하는 기간이다. 이 값은 중·장기간의 평균값 대비 당일 종가의 위치를 의미한다.
  • 5일 평균 거래량 대비 당일 거래량 비율 (volume/MA5 volume): 당일 거래량을 5일 동안의 평균 거래량으로 나눈 값이다. 이 값은 단기적인 거래량 추세를 수치화한 것이다. 거래량이 증가하고 있다면 주가의 추세를 유지할 가능성이 높다고 기대할 수 있다. 주가가 상승하고 있는데 거래량도 늘고 있다면 주가가 더 상승할 가능성이 높다는 것이다. 반대로 주가가 하락하고 있는데 거래량이 늘고 있으면 주가가 더 떨어질 가능성이 높다는 것이다.
  • 10일 평균 거래량 대비 당일 거래량 비율 (volume/MA10 volume): 당일 거래량을 10일 동안의 평균 거래량으로 나눈 값. 이 값도 단기적인 거래량 추세를 내포한다. 20일 평균 거래량 대비 당일 거래량 비율 (volume/MA20 volume) 당일 거래량을 20일 동안의 평균 거래량으로 나눈 값이다. 주가에서 20일 이동평균선을 중요하게 봤듯이 거래량 역시 20일 이동평균선은 중요하다.
  • 60일 평균 거래량 대비 당일 거래량 비율 (volume/MA60 volume): 당일 거래량을 60일 동안의 평균 거래량으로 나눈 값이다. 주가와 더불어 거래량의 추세를 보는 것은 매우 중요하다. 60일 이동평균선은 중기적인 추세를 볼 수 있는 좋은 지표이다.
  • 120일 평균 거래량 대비 당일 거래량 비율 (volume/MA120 volume): 당일 거래량을 120일 동안의 평균 거래량으로 나눈 값이다. 이 지표로 장기적인 관점에서 당일 거래량의 정도를 판단할 수 있다.

주식 시장 관련 자질도 사용할 수 있다. 여기서는 코스피(KOSPI) 지수를 사용한다.

  • 코스피 지수의 5일 평균 종가 대비 당일 종가 비율 (close/MA5 close): 5일 평균 종가로 당일 종가를 나눈 값. 시장의 단기 방향성을 판단할 수 있다. 이 값이 1보다 클 경우 5일선을 상회함을, 1보다 작으면 5일선을 하회함을 의미한다.
  • 코스피 지수의 20일 평균 종가 대비 당일 종가 비율 (close/MA20 close): 당일 코스피 종가를 20일 평균 종가로 나눈 값이다. 이 값으로 20일선을 상회하는지 하회하는지 판단할 수 있다.
  • 코스피 지수의 60일 평균 종가 대비 당일 종가 비율 (close/MA60 close): 당일 코스피 종가를 60일 평균 종가로 나눈 값으로 한 분기의 평균 종가를 상회하는지 하회하는지 알 수 있다.
  • 코스피 지수의 120일 평균 종가 대비 당일 종가 비율 (close/MA120 close): 120일은 평균 종가로 당일 종가를 나눈 값으로 반기 동안의 평균 종가를 상회하는지 하회하는지 알 수 있다.

이론적으로 국채는 주가의 방향성과 반대로 움직이는 경향이 있다. 국채는 금리가 떨어지면 비싸지는데, 금리가 떨어진다는 것은 불경기라는 신호로 작용할 수 있고 주식 시장도 불황이 될 개연성이 있다. 국채 시계열을 주식투자에 참고할 수 있으므로 학습 데이터로도 사용할 수 있다.

  • 3년 국채의 5일 평균 종가 대비 당일 종가 비율 (close/MA5 close): 5일 평균 국채 종가를 당일 종가에 나눈 값으로, 채권의 단기 방향성을 의미한다.
  • 3년 국채의 20일 평균 종가 대비 당일 종가 비율 (close/MA5 close): 20일 평균 국채 종가를 당일 종가에 나눈 값으로, 채권의 중단기 방향성을 의미한다.
  • 3년 국채의 60일 평균 종가 대비 당일 종가 비율 (close/MA5 close): 60일 평균 국채 종가를 당일 종가에 나눈 값으로, 채권의 중장기 방향성을 의미합니다.
  • 3년 국채의 120일 평균 종가 대비 당일 종가 비율 (close/MA5 close): 120일 평균 국채 종가를 당일 종가에 나눈 값으로, 채권의 장기 방향성을 의미한다.

차별화 요인 2: 에이전트 상태 종류

여기에 추가로 에이전트의 상태를 학습 데이터로 고려한다. 투자를 수행하는 주체인 에이전트의 상태에 따라 같은 환경에서도 다른 투자 결정을 하는 것이 더 올바를 것이다. 예를 들어 환경이 매수하기에 좋은 상황이라 하더라도 이미 너무 많은 주식을 보유하고 있다면 리스크 관리 차원에서 매수를 보류(즉, 관망)할 수 있다.

학습 데이터로 고려하는 에이전트의 상태는 다음과 같다.

  • 주식 보유 비율 (현재 보유 주식 수/최대 보유 가능 주식 수): 현재 보유 중인 주식 수를 보유한 자산으로 최대로 보유할 수 있는 주식 수로 나눈 값. 이 값은 자산 대비 주식을 얼마나 보유하고 있는지를 의미합니다. 주식 보유 비율이 높을 때는 매도 관점에서 주식 시장을 바라보고 주식 보유 비율이 낮으면 공격적인 매수를 하는 등의 전략을 학습할 수 있게 이 값을 학습 데이터에 특징으로 추가했다.
  • 포트폴리오 가치 비율 (현재 포트폴리오 가치/기준 포트폴리오 가치): 현재 포트폴리오 가치를 기준 포트폴리오 가치로 나눈 값. 기준 포트폴리오 가치는 현재의 포트폴리오 가치를 비교할 만한 이전의 포트폴리오 가치로, 정하기 나름입니다. 현재의 수익률 또는 손익률을 학습에서 고려하기 위해 이 값을 특징으로 추가한다.

에이전트의 상태 역시 앞서 소개한 두 가지 외에도 다양하게 구성할 수 있. 예를 들어, 에이전트가 연속으로 매수한 횟수, 연속으로 매도한 횟수, 20 거래일 동안의 매수 비율, 20 거래일 동안의 매도 비율 등을 특징으로 삼을 수도 있다.

차별화 요인 3: 행동 종류

에이전트는 행동을 수행함으로써 투자를 진행한다. 행동에는 크게 매수, 매도, 관망이 있다. 매수는 주식을 사들이는 행동, 매도는 주식을 파는 행동, 관망은 매수도 매도도 하지 않고 관망하는 행동이다. 이를 공격적 매수, 방어적 매수, 공격적 매도, 방어적 매도, 관망으로 더 세분화할 수 있다.

공격적 매수에서는 한 번에 많은 양의 주식을 사들이고, 방어적 매수에서는 주식을 조금만 사들이고, 공격적 매도에서는 한 번에 많은 주식을 팔고, 방어적 매도에서는 주식을 조금 파는 것이다.

매매할 최대 및 최소 투자 단위를 결정해 놓고 확률에 따라 최소에서 최대 사이의 단위로 투자를 진행할 수도 있다.

차별화 요인 4: 신경망

가치 신경망과 정책 신경망은 강화학습에서 에이전트가 행동을 결정하기 위한 두뇌 역할을 하는 인공 신경망이다. 신경망의 종류는 심층 신경망(deep neural network), 순환 신경망(recurrent neural network), 합성곱 신경망(convolutional neural network)과 이것들을 혼용하는 앙상블 신경망이 있다.

심층 신경망(deep neural network)

학습 데이터는 여러 특징을 가지는데, 이들의 값이 달라짐에 따라 수많은 조합을 이룬다. 하나의 특징은 연속 값을 가지기 때문에 이들의 조합은 무한하다. 심층 신경망은 이렇게 무한한 특징 조합을 효과적으로 학습하기 위해 여러 계층과 많은 수의 퍼셉트론을 가진다.

순환 신경망(recurrent neural network)

순환 신경망은 현재의 상태와 이전에 결정한 행동을 함께 고려할 수 있다. 이 경우 매수, 매도, 매수, 매도, 매수와 같은 정신없는 투자를 피하고 어느 정도의 투자 일관성을 가질 수 있다다.

합성곱 신경망(convolutional neural network)

합성곱 신경망으로 5일, 10일 등 특정 기간의 일련의 상태를 한꺼번에 고려할 수 있다. 이전 상태들의 흐름을 포괄적으로 고려해 높은 학습 품질을 기대할 수 있다.

여러 신경망의 앙상블(ensemble)

여러 신경망을 사용해 결과를 다수결로 결정하는 방법을 사용할 수 있다. 이 경우 투자 결정에 대해 신뢰성을 높일 수 있다. 이러한 방법을 앙상블(ensemble)이라 하고 비슷한 방법으로 배깅(bagging), 부스팅(boosting) 등의 방법이 있다.

차별화 요인 5: 강화학습 기법

강화학습 기법으로는 Q-러닝, 정책 경사, 액터-크리틱, A2C, A3C 등을 사용할 수 있다. 여기서는 가치 신경망을 학습하는 Q-러닝과 정책 신경망을 학습하는 정책 경사의 특징을 살펴보다. 두 기법 모두 주식투자 강화학습에서 적절한 방법이지만 다음과 같은 차이가 있다.

Q-러닝

Q-러닝은 특정 행동을 취했을 때 예측되는 포트폴리오 가치를 회귀(regression)하고자 사용한다. 주식투자에서 손실을 보고자 투자하는 사람을 없을 것이기 때문에 예측한 값이 높은 쪽으로 행동을 취하면 된다. 즉, Q-러닝을 사용할 경우 행동마다 기대 손익을 수치적으로 예측한다.

정책 경사(policy gradient)

정책 경사는 어떤 행동이 현재 상태에서 가장 좋을지를 확률적으로 판단한다. Q-러닝과는 다르게 기대 손익을 예측하는 것이 아니라 단순히 현 상황에서 어떤 행동이 더 좋은지를 판단하는 것이다.

그 외에 액터-크리틱, A2C, A3C는 Q-러닝과 정책 경사를 함께 적용한 하이브리드 기법으로 볼 수 있다.

뒤에서 소개할 강화학습 주식투자 시스템인 RLTrader에서는 Q-러닝, 정책 경사, 액터-크리틱, A2C, A3C 각각을 주식투자에 적용할 수 있고 사용자가 쉽게 커스터마이즈할 수 있게 구현돼 있다.

차트 데이터와 학습 데이터 살펴보기

강화학습에 사용할 데이터로 차트 데이터와 학습 데이터가 있다. 차트 데이터는 전처리를 하지 않은 '있는 그대로'의 데이터이다. 데이터 과학에서는 보통 원시 데이터(original data) 또는 기초 데이터(raw data)라고 부른다. 학습 데이터는 차트 데이터를 전처리(pre-processing)한 데이터로서, 학습에 바로 사용할 수 있게 만든 데이터이다.

차트 데이터

차트 데이터는 2차원 데이터로 체결일, 시가, 고가, 저가 ,종가, 거래량이 연속되어 구성된 데이터이다.

여기서 하나의 행(row)은 일 단위 데이터이다. 여기서의 OHLC(open. high, low, close) 데이터는 일봉의 시가, 고가, 저가, 종가를 의미하고 volume은 하루 동안의 거래량이다. 물론 차트 데이터를 60분봉, 20분봉, 5분봉, 1분봉 등으로 구성할 수도 있다. 

학습데이터

신경망이 학습하기 좋게 차트 데이터를 전처리해 학습 데이터를 만들어야 한다. 먼저 5일, 10일, 60일, 120일 평균 종가와 평균 거래량을 구한다. 5일 평균 데이터는 인덱스 4부터, 10일은 9부터 시작한다. 

이 데이터는 아직 학습하기에 효율적인 형태는 아니다. 그 이유는 주가와 거래량의 단위가 각기 '원(돈)'과 '주(수량)' 으로 서로 다르기 때문이다. 따라서 효율적인 학습을 위해 다음 그림과 같이 학습 데이터를 비율 값으로 구성한다.

전처리 작업은 학습 데이터의 값을 비슷하게 만들기 때문에 학습했을 때 종목에 크게 의존하지 않게 하는 장점 또한 있다. 

주식투자 강화학습 절차

강화학습은 환경, 에이전트, 신경망이 서로 상호작용하면서 학습을 수행하므로 그 과정이 일반적인 머신러닝보다 복잡하다. 여기서는 주식투자를 위한 강화학습 절차를 순서도와 함께 살펴보자.

주식투자 강화학습 순서도

강화학습으로 주식투자를 하는 방법은 다른 여느 강화학습 문제와 다르지 않다. 강화학습 프로세스는 다음과 같다.

강화학습은 경험을 학습하는 것이다. 경험을 충분히 쌓기 위해서 많이 반복한다. 학습 대상 데이터 전부를 대상으로 한 차례 반복하는 과정을 에폭이라고 하며 100번째 반복이라면 100에폭이라고 부르면 된다.

행동 결정

한 에포크에서 경험을 얻기 위해 무작위로 탐험을 해봐야 하는데, 이를 탐험(expolration)이라고 한다. 일반적으로 강화학습 초반에는 탐험을 많이 하고 후반으로 갈수록 탐험을 적게 한다. 

탐험 비율을 엡실론(epsilon)이라고 한다. 100번 반복한다고 했을 때 1에포크에서는 엡실론을 50%로 정하고, 점점 엡실론을 주령서 100번째 에포크에서는 0%가 되게 하면 에포크가 커질수록 무작위로 하는 행동이 줄어든다. 경험이 쌓일수록 무작위로 하는 행동을 줄이는 것이다.

무작위로 행동을 하지 않을 때는 신경망으로 행동을 결정한다. 신경망의 출력값이 높은 행동을 선택한다. 

결정된 행동 수행

무작위로 결정한 행동이든 신겸앙으로 결정한 행동이든 에이전트는 결정된 행동을 수행한다.

매수의 경우, 에이전트는 주식을 사들일 현금이 있는지 확인하고, 매수가 가능할 경우 매수를 수행하고 그렇지 않으면 관망한다. 매수했을 경우 매수금만큼 현금을 줄이고 매수한 주식수만큼 보유 주식 수를 늘린다.

매도의 경우, 에이전트는 보유한 주식이 있는지 확인하고 보유한 주식이 있을 경우 매도를 수행하고 그렇지 않으면 관망한다. 매도했을 경우 매도한 주식 수만큼 보유 주식 수에서 빼주고 매도금만큼 현금 보유액에 더해준다.

배치 학습 데이터 생성 및 신경망 업데이트

한 에포크가 종료되면 이때 쌓은 경험들로 배치 학습 데이터를 생성한다(TD가 아니네?) 이 학습 데이터를 한꺼번에 적용해 신경망을 업데이트한다. 이런 학습 방법을 배치(batch) 학습이라고 부른다(미니배치 학습도 아니고..) 학습을 진행하고 나면 신경망의 가중치들이 업데이트되어 이후에 진행되는 투자부터 바로 업데잍된 신경망의 결과가 반영된다.

배치 학습 데이터에서 목표값은 강화학습 방법에 따라 달라진다. 그리고 가치 신경망을 위한 학습 데이터인지 정책 신경망을 위한 것인지에 따라서도 달라진다. 

주식투자 강화학습 과정 및 결과 확인 방법

주식투자 강화학습을 진행하면 정해진 환경에서 매 순간 무작위로 행동을 결정하거나 신경망으로 행동을 결정한 다음, 에이전트가 결정된 행동을 수행하고 그 결과로 에이전트의 상태가 변경된다. 이번 절에서는 강화학습 과정을 확인하는 방법을 다룬다.

강화학습 과정 확인의 필요성

강화학습이 잘 진행되고 있는지를 판단하려면 신경망이 어떤 출력값을 변환하는지, 에이전트의 상태는 어떻게 변해가는지를 관찰해야 한다.

강화학습으로 수백, 수천 에포크를 거치며 주식투자를 (제대로)학습하다 보면 처음에는 투자 손실을 보다가 에포크를 거쳐 가면서 점점 수익을 내게 된다. 학습 시간은 인공 신경망의 복잡도, 학습 데이터의 크기, 에포크 수에 따라 수십 분에서 며칠까지도 걸릴 수 있다. 그렇기 때문에 제대로 된 학습을 진행하고 있는지 아닌지를 학습 과정이 진행되는 동안 모니터링 해야한다. 

학습이 진행되어 가는데, 신경망의 학습이 제대로 되지 않아서 매수만 한다거나 매도만 하는 등의 이상 상황이 발생하면 중도에 학습을 멈추고 문제 파악 및 해결을 하고 다시 학습을 수행하는 것이 시간을 절약하는 길이다.

강화학습 과정을 로그로 남기기

강화학습 과정에서 로그로 남기는 값들은 다음과 같다.

  • 파라미터(parameter): 학습 속도(learning rate), 할인 요인(discount factor), 최소/최대 투자 단위(trading unit), 지연 보상 임계치(delayed reward threshold) 등의 파라미터를 기록해둬야 파라미터에 따라 결과가 어떻게 달라지는지를 확인할 수 있다.
  • 에포크(epoch) 결과: 전체 에포크 중에서 몇 번째 에포크인지 먼저 기록하고 탐험률, 탐험 횟수, 매수 횟수, 매도 횟수, 관망 횟수, 보유 주식 수, 포트폴리오 가치, 긍정적 학습 횟수, 부정적 학습 횟수, 학습 과정에서 발생한 손실 등을 기록해 에포크가 진행되면서 이 값들이 어떻게 변해가는지 확인한다.
  • 최종 학습 결과: 학습 과정 중에서 달성한 최대 포트폴리오 가치, 수익 발생 횟수 등 전체 학습이 완료되고 나서야 알 수 있는 통계치 등을 확인한다.

강화학습 과정을 이미지로 가시화하기

각 에포크마다 보유 주식 수, 행동, 인공 신경망의 출력값, 탐험, 수익과 손실을 관찰하기 위해 다음 그림과 같은 가시화 방법을 사용한다.

가장 상위의 차트는 주식 종목의 일봉 차트를 보여준다. 즉, 강화학습의 환경(environment)이라고 할 수 있다.

두 번째 차트는 에이전트가 수행한 행동을 배경색으로 보여주고 보유 주식 수를 실선으로 보여준다. 매수했으면 보유 주식 수가 증가할 것이고 매도했으면 보유 주식 수는 줄어들 것이다.

세 번째 차트는 가치 신경망의 출력값을 보여준다. 빨간 실선은 매수 행동에 대한 가치 신경망의 예측 가치를 보여주고 파란 실선은 매도 행동에 대한 예측 가치를 보여준다. 배경에는 매수 예측 가치가 높으면 빨간색, 매도 예측 가치가 높으면 파란색으로 표시해 준다.

네 번째 차트는 정책 신경망의 출력값을 보여준다. 빨간 실선으로 매수 행동에 대한 예측 확률을 보여주고 파란 실선으로 매도 행동에 대한 예측 확률을 보여준다.

정책 신경망이 있는 경우 정책 신경망의 예측 확률이 높은 행동을 택하게 된다. 수행한 행동에 대해 배경색으로 매수는 빨간색, 매도는 파란색으로 보여준다. 정책 신경망이 없는 경우 가치 신경망의 예측 가치가 높은 행동을 선택하고 수행한 행동을 이 차트의 배경으로 그려준다. 여기서 무작위 투자, 즉 탐험을 했으면 배경을 노란색으로 표시한다.

마지막 차트는 포트폴리오 가치를 보여준다. 즉, 투자 결과인 손익을 보는 것. 이 화면에서는 PV가 초기 자본금인 10,000,000원을 넘어서 수익이 발생한 것을 볼 수 있다. 여기서 빨간 수직선은 긍정 보상(positive reward)을 가지고 학습한 지점을, 파란 수직선은 부정 보상(negative reward)으로 학습한 지점을 표시한 것이다.

이 화면을 에포크마다 한 번씩 생성해서 각 에포크에서 에이전트가 수행한 행동들, 인공 신경망의 출력, 투자 결과인 수익을 한눈에 볼 수 있다. 그림 파일을 에포크마다 생성하기에 부담이 있는 경우 10번의 에포크마다 한 번씩만 생성하는 등 일부 에포크에서만 생성할 수도 있다.