본문 바로가기

머신러닝

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

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

 

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

요새 ChatGPT가 코딩계에 큰 파문을 일으키고 있다. 구글 검색도 없어지고 프로그래머들도 일자리가 줄어들거라는 얘기까지 나올 정돈데, 실제로 어느 정도 성능인지 실험해보았다. ChatGPT를 이용

warlockdev.tistory.com

 

근본적인 문제는 가져오는 데이터의 길이가 짧은 것이다. 

 

df = pyupbit.get_ohlcv("KRW-BTC", interval="minute10")

 

 이렇게 가져오는 데이터는 200개 밖에 안되기 때문에, 데이터의 양이 너무 적어서 테스트 데이터의 길이가 200*0.2 = 40. 따라서 60이 안되는 것이다. 제로패딩할 게 아니라 데이터를 더 가져오는게 옳은 방향! 요 부분을 고쳐서 돌려보자. 

 

df = pyupbit.get_ohlcv("KRW-BTC", interval="minute10", count = 3000)

 

    ValueError: Input 0 of layer "sequential_1" is incompatible with the layer: expected shape=(None, 6, 1), found shape=(None, 60, 1)

 

이번엔 shape이 안맞는단다. 야 귀찮아 니가 고쳐와!!

 

 

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Load data
# df = pd.read_csv('upbit_btc_hourly.csv')
# df = df[['close']]
# data = df.values
# train_data = data[:len(data)-24] # use first 24 days for training
# test_data = data[len(data)-24:]  # use last 24 hours for testing

df = pyupbit.get_ohlcv("KRW-BTC", interval="minute10", count = 3000)
df = df[['close']]
data = df.values
train_data = data[:int(0.8*len(data))] # use first 24 days for training
test_data = data[int(0.8*len(data)):]  # use last 24 hours for testing

# Scale data
scaler = MinMaxScaler(feature_range=(0, 1))
train_data_scaled = scaler.fit_transform(train_data)
test_data_scaled = scaler.transform(test_data)

# Split data into features and labels
def create_dataset(data, look_back=6):
    X, Y = [], []
    for i in range(look_back, len(data)):
        X.append(data[i-look_back:i, 0])
        Y.append(data[i, 0])
    return np.array(X), np.array(Y)

train_X, train_Y = create_dataset(train_data_scaled)
test_X, test_Y = create_dataset(test_data_scaled)

# Reshape input data to (batch_size, time_steps, num_features)
train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1))
test_X = np.reshape(test_X, (test_X.shape[0], test_X.shape[1], 1))

# Define LSTM model
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(train_X.shape[1], 1)))
model.add(LSTM(units=50))
model.add(Dense(units=1))

# Compile and fit model
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(train_X, train_Y, epochs=50, batch_size=32)

# Predict on test data
test_predictions = model.predict(test_X)

# Unscale predictions and actual values
test_predictions = scaler.inverse_transform(test_predictions)
test_Y = scaler.inverse_transform([test_Y])

# Calculate mean absolute error
mae = np.mean(np.abs(test_predictions - test_Y))
print('MAE:', mae)

고쳐 왔는데 아직도 input 부분에 문제가 있다. 수동으로 고쳐본 후에 돌려보자.

(위의 코드에 주석처리된 게 ChatGPT가 작성한 코드이다.)

 

 

오오 마침내... 잘 된걸까? 그래프 보고 싶은데?

 딱 보니 shape이 안 맞는 모양이다. test_prediction을 reshape 해주자.

 

test_X, test_Y = create_dataset(test_data_scaled)
test_predictions = model.predict(test_X)
test_predictions.reshape(1,-1) #reshape
test_predictions = scaler.inverse_transform(test_predictions)
test_Y = scaler.inverse_transform([test_Y])[0] 

# Calculate mean absolute error
mae = np.mean(np.abs(test_predictions - test_Y))
print('MAE:', mae)

import matplotlib.pyplot as plt
plt.clf()
plt.figure(figsize=(10,6))
plt.plot(test_predictions, color='blue', label='Actual BTC Price')
plt.plot(test_Y, color='green', label='Predicted BTC Price')
plt.title('BTC Price Prediction')
plt.xlabel('Time')
plt.ylabel('BTC Price')
plt.legend()
plt.show()

 

짜잔! 비트코인 가격을 예측하는 모델 완성!

(물론 이 모델 가지고 투자하면 큰일 납니다...)

 

ChatGPT를 사용해보면서 느낀 점은 크게 두 가지였다.

1. 생각보다 잘한다. 초보자나 새로운 분야를 개발할 때 전반적인 코드의 흐름을 개략적으로 설명해주고, 예시를 만들어줘서 막막한 기분을 덜어준다. 에러도 던져주면 생각보다는 잘 고쳐온다.

2. 생각보다 못한다. 잘한다고 해놓고 무슨 소리냐 할 수 있는데, 보기에는 그럴듯해 보이고 로직은 괜찮아 보이는데 돌려보면 어이없는 에러가 나온다. 이번 글에서는 데이터의 크기나 실제 값들을 전혀 고려하지 않는 것을 볼 수 있는데, 머신러닝은 데이터에 굉장히 의존적이기 때문에 사실은 치명적인 에러이다. 글에는 쓰지 않았지만 물어볼 때마다 답변도 달라지고 나오는 에러들도 다양하다.

 

앞으로 ChatGPT를 사용할거냐? 라고 물어보면 Yes. 쓸만한 도구임에는 틀림없다.

그럼 기존 개발자들은 다 잘리냐? 라고 물어보면 No. 그럴듯해 보이는 코드는 반드시 수정이 필요하다.