주식이나 코인 매매 프로그램을 너무 쉽게 생각하시면 큰일 납니다. 제 경험이기도 합니다. 일단 머쉰 러닝을 배우신 분들 중에는 주식차트를 시계열 데이터로 착각하시는 분들이 많습니다. 물론 시계열 데이터이기도 합니다. 시계열 데이터의 가장 큰 특징은 무엇일까요? 정답을 아시는 분들도 있겠지만 바로 계절성입니다. 예를 들면 따릉이의 이용률을 데이터로 변환한다면 봄가을에는 많은 사람들이 이용해서 자전거가 부족하지만 여름이나 겨울에 그 수가 확실히 감소합니다. 특히 겨울에는 이용률이 크게 감소하죠. 따릉이 자전거를 자동 배치하는 AI를 개발한다면 크게 어렵지 않게 개발이 가능하겠죠. 그렇다면 시계열 데이터 방식으로 예를 들면 LSTM 방식으로 삼성전자의 주가를 예측해보신 분들은 나름 데이터가 맞는 것 같아서 신기해합니다. 하지만 그것은 예측된 데이터로 보기엔 문제가 있습니다. 인간이 개입하는 어떤 데이터도 시계열 데이터의 특징인 주기성을 보이지는 않습니다. 그저 서로를 속이는 눈속임일 뿐입니다. 아쉽게도 LSTM이나 RNN, GRU 방식 등의 방식으로 주가를 예측하는 것은 애초에 불가능 합니다.https://m.blog.naver.com/dsz08082/222042702104
위 url의 내용을 한번 참고해 보세요. 앞에서도 말씀드렸듯이 주식, 코인을 자동으로 매매하는 프로그램은 정말 쉽지 않습니다. 인터넷에 통장까지 공개하시는 분들이 많은데 이 번의 사태를 견뎠을까요? 주식 또한 마찬가지로 동일본 지진이나 리먼사태 등을 예측할 수는 없었습니다. 그렇다면 강화 학습으로 그런 문제를 극복할 수 있을까요? 사실 저도 자신이 없네요. 그래서 브레이크 장치가 필요합니다. 그래도 주식은 제도권 안에 있기에 법적인 구제 장치가 많지만 코인 시장은 그렇지 않습니다. 혹시나 인터넷이나 유튜브를 떠도는 프로그램들에는 눈도 돌리지 마시기 바랍니다. 제가 쓴 글들 중에도 몇몇 것은 참담한 실패를 맛봤습니다. 가끔 사람은 세상을 너무 만만하게 보거나 짧은 생각으로 글을 쓸 수 있습니다. 지금 우리가 하는 길이 만만하지 않음을 꼭 아셨으면 합니다. 오늘은 CNN과 상태(S)와의 관계에 대하여 생각해보겠습니다. 코인 차트는 시간(t)에 따라 C0
, C1, C2, ... , Ct-1, Ct, ... 이렇게 생성이 될 겁니다. pytorch 의 tensor데이터는 다차원의 행렬로 이루어져 있습니다. PIL이미지를 torch.tensor로 변환하는 함수를 지원합니다. 차트 이미지를 torch.tensor로 변경했다면 C2 - C1을 하면 t1의 상태(S)가 됩니다. 원래는 RGB데이터로 이미지를 저장하고자 했지만 저도 이미지 쪽은 잘 몰라 ARGB방식 즉 4차원 torch.tensor로 저장이 되었습니다. CNN은 합성곱 인공신경망의 약자입니다. 이미지의 특징을 검색하기 위해 bmp방식으로 저장하게 되면 메모리 overflow로 프로그램은 더 이상 진행하지 않고 런타임 에러가 나거나 엄청난 컴퓨터 비용을 지불해야 할 것입니다. 그래서 화면의 일부를 차원곱을 사용하여 이미지를 쭉 따라서 검색하는 방식으로 이미지를 분석합니다. 인터넷에 있는 개와 고양이를 구분하는 예제는 고양이 코 모양과 개의 코 모양이 완전히 다르다는 것을 신경망 학습이 비지도 학습으로 알아내고 클래스(분류 가짓수)를 2라고 한정했기 때문에 고양이의 코 모양을 0으로 했다면 개의 코 모양은 1로 해서 분류를 하고 학습을 반복할수록 지도 학습으로 정확도를 높이게 됩니다. 학습이 끝나면 거의 100%의 정확도로 고양이와 개를 구분합니다. 즉 이미지의 모든 부분을 이용하는 것이 아니라 특징이 다른 부분을 합성곱으로 빨리 탐색하고 분류하는 것이죠. 다시 주식차트로 오면 C2 - C1을 하게 되면 C2와 C1의 동일한 부분은 모두 0이 될 겁니다. 행렬의 차는 같은 위치의 값을 서로 빼는 것이니 당연히 같은 좌표에 있는 이미지 중에 같은 값을 가진 것들은 전부 0으로 바뀔 겁니다. 그럼 C2 - C1을 S1이라고 하면 대분은 0인 이미지가 나오겠죠. 그리고 변화가 생긴 부분만 남게 됩니다. 그래서 우리가 만드는 차트에 라벨링은 의미가 없습니다. 같은 위치에 반복적으로 쓰이는 값은 삭제될 뿐입니다. 그다음 S1을 합성곱으로 검색해서 지나가는 부분은 비지도 학습에 의해 가짓수를 CNN이 결정합니다. 다시 우리가 지정한 output개수 즉 class의 가짓수에 의해서 다시 CNN은 지도 학습을 진행하면서 각각의 클래스에 해당하는 숫자를 지정하게 됩니다. 학습을 진행하면 우리 인간은 눈치 못 챈 어떤 특징으로 인해 차트는 우리가 지정한 가지 수만큼의 output값을 지정하게 됩니다. 우리는 이 값을 행동 0,1,2로 지정합니다. 저희 프로그램은 100% 매수 또는 매도 또는 관망의 3가지 행동 뿐입니다. CNN은 우리의 의도대로 차트를 가지고 우리가 실행해야 하는 행동을 구하게 됩니다.
어렵지 않게 설명하려고 많이 노력했는데 괜찮았는지 모르겠네요. 상태 값과 CNN의 관계를 이해하셨다면 마르코프 실행 프로세스에 해당하는 부분을 설명하겠습니다. 혹시 오류를 발견하셨다면 댓글 부탁드립니다.
'python > 자동매매 프로그램' 카테고리의 다른 글
강화학습을 이용한 비트코인 매매프로그램(6)-Buroto Force학습 (17) | 2022.12.04 |
---|---|
강화학습을 이용한 비트코인 매매프로그램(5)-데이터에 Min/Max 추가하기 (0) | 2022.11.30 |
강화학습을 이용한 비트코인 매매프로그램(3) - 데이터로 차트 그리기 (1) | 2022.11.28 |
강화학습을 이용한 비트코인 매매프로그램(2) - 개발 환경 셋팅 (2) | 2022.11.28 |
강화학습을 이용한 비트코인 매매프로그램(1)-강화 학습으로의 전환 (0) | 2022.11.23 |