본문 바로가기

머신러닝

ChatGPT를 이용해 비트코인 가격을 예측해보자 (3)

2023.02.19 - [머신러닝] - ChatGPT를 이용해 비트코인 가격을 예측해보자 (2)

 

ChatGPT를 이용해 비트코인 가격을 예측해보자 (2)

2023.02.19 - [머신러닝] - ChatGPT를 이용해 비트코인 가격을 예측해보자 (1) ChatGPT를 이용해 비트코인 가격을 예측해보자 (1) 요새 ChatGPT가 코딩계에 큰 파문을 일으키고 있다. 구글 검색도 없어지고

warlockdev.tistory.com

 지난 글에서 LSTM을 이용해 비트코인 가격을 예측하는 모델을 만들어봤습니다. 예측은 잘 하는 거 같은데 왜 투자에 사용하면 안될까? 하는 생각이 드실 것 같아 준비해봤습니다. 두괄식으로 말씀드리면

 

가격만 가지고 예측 모델을 만들어 투자에 사용할 순 없다! 

 

저번 시간에 만든 모델이 훈련 데이터가지고 예측하는 모습을 한번 봅시다.

 

 

얼핏 보기엔 완벽해 보이죠? 약간 자세히 뜯어봅시다. 

 

 

 약간 틀리기는 하는데 이 정도면 좋지 않나 싶습니다. 그럼 이 모델 가지고 실제로 투자를 한다고 가정을 해보겠습니다.

 투자 에이전트도 여러 모델이 있지만 간단히 

1) 다음 timestep에 1% 이상 오를 거라 생각하면 long

2) 다음 timestep에 1% 이상 내릴 거라 생각하면 short

3) 둘다 아니면 아무것도 안함.

 이렇게 설정하겠습니다.

test_Y = test_Y[6:] #look_back 값만큼 잘라줌
test_len = min(len(test_Y), len(test_predictions))
my_money = 100
coin_money = 0
my_pos = 0
temp_value = test_Y[0]
result_predict = []
for i in range(1, test_len):
    prev_value = temp_value
    temp_value = test_Y[i]    
    if my_pos != 0:
        my_money = my_money + coin_money*(1 + my_pos*((temp_value - prev_value)/prev_value))
        if (1 + my_pos*(temp_value - prev_value)/prev_value) > 1:
            result_predict.append(1)
        else:
            result_predict.append(0)
    if test_predictions[i+1] > temp_value*1.01:
        my_money = my_money*0.5
        coin_money = my_money
        my_pos = 1
    elif test_predictions[i+1] < temp_value*0.99:
        my_money = my_money*0.5
        coin_money = my_money
        my_pos = -1
    else:
        my_pos = 0

my_money = my_money + coin_money
print('simulation result', my_money)

수수료나 레버리지 이런건 무시하고 투자해본 결과...

 

시작 금액 100$
종료시 금액 98.22$
구매 횟수 122
예측 성공 횟수 66 (54.1%)
예측 실패 횟수 56 (45.9%)

 

 손해를 보긴 했지만 뭐 사람이 했어도 손해는 볼 수 있습니다. 그보다 중요한건 예측의 정확도인데... 어째 동전 던지기랑 확률이 비슷해 보이지 않으시나요?  이런 모델이 성능이 뛰어나다고 주장하면 안되겠죠. 그럼 왜 이런 이유가 나왔느냐? 모델이 이상한가 데이터가 이상한가? 아니면 하이퍼 파라미터 튜닝이 잘못됐나?

 

저희가 원하는건 예측을 하는건데 모델은 이전 timestep의 값을 출력하도록 학습됐기 때문입니다.

 

LSTM RNN의 학습 목표가 뭐였죠?

model.compile(optimizer='adam', loss='mean_squared_error')

예측값과 실제값의 차이, mse를 최소화하도록 했군요? 모델 입장에서 어떻게 하는게 mse를 최소화할 수 있을까요?

이전 timestep의 값을 출력하면 됩니다. 모델 학습에도 문제가 없고 데이터에도 문제가 없습니다.

이 문제는 모델의 학습 목표와 실제 사용자가 원하는 모델의 목표가 다르기 때문에 벌어진 일입니다.

 

그렇다면 loss를 mse 말고 에이전트의 투자 성공률을 올려주도록 학습을 시켜보는건 어떨까? 하는 생각에 실험해봤는데 위의 결과와 흡사했습니다. 주가나 암호화폐 가격은 random walk라 가격 정보만 가지고 가격 예측을 하는건 불가능하다는 얘기를 실감했습니다.

 

 ChatGPT가 등장하면서 사람이 원래 하던 일은 줄었습니다. 데이터 셋을 준비해주는 작업 말고는 대부분의 코딩을 ChatGPT가 해 주었고, 결과값을 출력해주는 코드도 작성해주니 편해졌죠. 서울대에서도 컴공 과목에서 ChatGPT를 활용한다고 하니 시대의 흐름을 거스를 순 없을 것 같습니다. 그럼 사람의 영역은 어디일까요? 사고(思考)와 검증은 여전히 사람의 영역인 것 같습니다.  어떤 데이터를 어떤 모델에 적용해 어떤 결과를 도출해낼 것인지는 여전히 사람이 생각해 내야할 과정이고, 도출해낸 결과가 내가 원하는 결과인지 아닌지 확인하는 것도 여전히 사람이 해야할 과정입니다.  물론 이런 과정들도 AI가 도와주는 시대가 올지도 모르겠습니다.  발전하는 기술 속에서 인간의 영역을 찾아내고 능력을 키워나가는 건 엔지니어들의 숙명인가봅니다 ^^.