깃허브: https://github.com/ijun17/surge-coin-predictor

서론

2009년 비트코인이 출시되고 2023년 현재에 이르기까지 비트코인은 엄청난 가격의 상승을 이루었다. 이후 많은 사람들이 암호화폐에 대해 많은 관심을 갖고 거대한 자본이 투입되었다. 하지만 이에 따라 비트코인과 같은 메이저 코인들은 어느 정도의 가격의 하한선과 상한선이 생긴 듯 보인다. 다시 말해 이제는 비트코인으로 짧은 시간안에 10배 100배의 수익을 기대하기 어렵다는 것이다. 반면에 소위 잡코인이라 불리는 암호화폐들은 사정이 다르다. 크게는 10배 이상 가격이 상승했다가 하락하며 종류도 많다. 잡코인들은 세력들이 가격을 좌지우지하기 때문에 수익을 얻기 힘들다는 의견이 많지만, 비트코인도 과거에는 잡코인이었다. 언제 사라질지 몰랐으며, 많은 사람들이 이것이 사기라고 생각했다. 물론 과거와 지금은 양상이 많이 다르다. 현재는 비트코인이라는 성공한 암호화폐가 존재하며, 그외 다수의 코인은 스캠 코인으로 취급된다. 하지만 10배 또는 그 이상의 가격 상승이 이루어진다면 이는 시도해볼만한 가치가 있다고 생각한다.

이 시스템은 하루 또는 일정 시간 단위로 가격의 상승을 예측하는 시스템이다. 자동매매 시스템이 아니다. 일정 시간 간격의 데이터를 수집해서 피쳐 엔지니어링을 하고, 시계열 데이터로 전처리를 하여 랜덤 포레스트로 학습을 하였다. 왜 랜덤 포레스트를 선택했냐면 익숙하기도 하고, 다른 할 일들이 많아 시간을 투자하기 어려웠기 때문이다. 만약 시간이 된다면 ARIMA나 LSTM을 공부해 사용하려 한다.

데이터 수집

데이터는 업비트 거래소 api를 이용해 수집을 하였다. 먼저 어떤 코인이 잡코인인지 선정을 해야 한다. 모든 암호화폐의 데이터를 받아와 낮은 가격과 거래량을 조건으로 61개의 코인을 선정하였다.(2023년 10월 기준) 그리고 선정된 코인들을 4시간/하루/일주일/한달 단위로 데이터를 수집했다. 하루 단위의 데이터가 약 12MB정도 되었고 수집하는데 30분 정도 걸렸던 것으로 기억한다.

데이터 전처리

먼저 수집한 데이터에서 결측치가 있는지 확인했다. 2017년 10월, 12월 쯤에 몇몇 코인에서 결측이 된 것을 확인했고, 결측된 시간에서 이전 데이터를 모두 삭제하였다. 결측된 시간부터 그 이전 데이터를 모조리 삭제한 이유는 2017년 이전 데이터가 별로 없기도하고 학습의 정확도를 높이기 위해서이다. 그리고 피쳐 엔지니어링을 하여 아래에 몇가지 피쳐를 만들었다. 이때 각 코인들의 가격, 거래량이 모두 다르기 때문에 비율로 스케일링을 하였다.

이제 각 피쳐가 정확도와 정밀도 그리고 TF+FP에 주는 영향을 평가하여 최적의 피쳐 조합을 찾을 것이다. 여기서 재현율을 사용하지 않고 TF+FP을 사용한 이유는 재현율이 조금 낮게 나타나 비교하기 불편하기 때문이다. 결과적으로 price_diff와 low_change_rate, change_rate를 사용한 것이 가장 높은 성능을 보였다.

a b c d e f g
o o o o 0.92 0.85 54
o   o o 0.92 0.88 51
    o   0.92 0.82 51
o     o 0.92 0.84 44
    o o 0.92 0.79 59
o o     0.92 0.75 24

이제 시계열 데이터로 전처리해야한다. 데이터를 현재부터 N일 전까지의 데이터로 병렬화하고, M일 이후안에 가격이 R배만큼 증가하면 1로 아니면 0으로 라벨링한다. 여기서 라벨링된 비율 중 상승이 비교적 낮게 나왔다. 오버 샘플링이나 언더 샘플링을 사용해보았지만 성능이 매우 낮게 나왔다. 따라서 데이터 비율을 그대로 학습을 할것이다.(아래 N,M,R에 따른 성능 비교표에서 가장 좋다고 평가한 시도에서 상승 비율이 약 10%로 나왔다.)

학습

학습은 이상치에 강한것으로 알려진 랜덤 포레스트로 진행하였다. 학습 데이터와 테스트 데이터를 나눌 때 랜덤으로 나누게 되면 데이터가 섞여 제대로된 검증을 할 수 없기 때문에 인덱스 순서대로 8:2로 분리를 하였다.

이제 N,M,R 값을 바꿔가며 성능을 정확도, 정밀도, TP+FP를 측정할 것이다. 아래 표와 같이 N=15, M=40, R=1.8일때 가장 높은 성능을 보였다.(성능이 너무 낮게 나온 시도는 표에 적지 않았다) 물론 더 최적의 N,M,R 값이 있을 수 있겠지만 시간이 부족하여 이정도까지 진행을 하였다.

N M R e f g
4 2 11 0.92 0.88 51
7 2 1.1 0.92 0.88 62
10 2 1.1 0.92 0.91 67
11 2 1.1 0.92 0.92 71
12 2 1.1 0.92 0.90 71
15 2 1.1 0.92 0.90 65
11 10 1.3 0.92 0.93 58
11 20 1.5 0.92 0.94 59
13 20 1.5 0.92 0.96 65
15 20 1.5 0.92 0.98 65
15 30 1.7 0.93 0.94 74
15 40 1.7 0.90 0.90 132
15 40 1.8 0.91 0.94 106

결론

결과적으로 높은 정확도와 정밀도를 보였다. 재현율을 기대보다 낮았지만 평균적으로 2~3일에 한번 꼴로 상승한다고 예측을 한다. 그러나 이것은 평균일 뿐 실제로는 상승 예측이 특정 기간에 집중되어 있었다. 왜 이런 결과가 나왔을까? 가장 먼저 생각난 것은 라벨링의 문제이다. 지금은 40일 안에 1.8배가 오르면 1로 라벨링을 했다. 하지만 만약 41일 이후에 1.8배가 올랐다면 또는 40일 안에 1.7배가 올랐다면, 이처럼 사소한 차이로 1로 라벨링 되지 않았을 때가 문제로 보인다. 따라서 이진분류가 아닌 기대치에 얼마나 근접한지에 대한 수치로 라벨링하는게 더 나아보인다. 또 다른 문제로 지금은 예측에 15일을 사용하고 있는데 이것 때문에 과적합이 발생하지 않았나 생각한다. 이동 평균 등을 사용해서 보완해야할 것 같다. 그리고 피쳐 엔지니어링을 더 해야할 것도 같다. 그리고 지금까지 급상승을 예측했는데 이러한 급상승들은 세력들이 일으키는 이상치일 것이다. 보통 이러한 이상치는 예측하는 것은 옳바르지 않다고 알고있다. 이후에는 관점을 바꾸어 급상승 예측이 아닌, 현재 암호화폐가 세력들이 자본을 투입할만한 상태인지 판별하는 방식으로 진행을 해야될 것 같다. 벌써부터 랜덤 포레스트가 암호화페 예측에 부적절하다고 판단하는 것은 시기상조인것 같고 위와 같은 문제를 해결해야 할 것으로 생각한다.