tech

인공지능을 이용해서 가상화폐 가격을 예측해보자(Adaboost, Ensemble, LSTM)

downfa11 2024. 11. 17. 15:49

코인 수익률이 -73%까지 내려가면서 바닥 아래에는 지하가 있음을 깨닫게 해줬다...

 

인공지능을 이용한 가상화폐 종가 예측 프로젝트

딥러닝을 이용해 특정 암호화폐의 종가를 예측해서 평가한 후 매도/매수를 판단하고 자동으로 매매하여 결과를 도출하도록 하고자 계획했다.

 

그리고 코인같은 일련의 데이터들을 처리하기 위해서는 RNN 보다 주로 시계열 데이터를 처리하는 LSTM 모델 이 더욱 의미있는 결과를 낸다는 연구를 보고, 아예 LSTM 모델 3개를 결합하여 하나의 모델(Deep 3-LSTM Ensemble Model)로 개발하기로 결정했다.

 

앙상블 학습을 통해서 기존의 단일 모델의 낮은 정확도과적합(OverFitting)의 한계점을 보완하여 더욱 정확한 예측이 가능한 모델을 구축할 수 있다.

 

Adaboost는 이전의 모델이 잘못 분류한 샘플의 오차에 대한 가중치를 높여서 다음 모델을 훈련시키는 부스팅(Boosting) 기법에 속하며 정확도를 크게 높여주기 때문에 별 의심없이 받아들임

 

암, 정확도가 중요하지

 

아무튼 LSTM를 이용해서 딥러닝 모델을 만들고, 앙상블(ensemble)하는 과정은 KerasRegressor로 분류기를 만들어서 Adaboost로 앙상블 결합하기로 결정했다. 데이터 전처리만 귀찮을 뿐이지 참고한 논문의 방식과 큰 틀에서의 차이는 없었다.

 

1. 가상화폐 이더리움(ETH)의 종가 조회

mydf = pyupbit.get_ohlcv("KRW-ETH",interval='minute1',count=1000).reset_index()
mydf.tail()

 

업비트에서 제공하는 API를 통해서 이더리움의 종가를 조회하는 get_ohlcv()를 가져왔다.

 

2. 전처리(Data Preprocessing)
대표적인 시계열 데이터인 종가 데이터를 전처리하기 위한 함수 preprocess

def preprocess(series, window_size):
  series = series.rolling(window_size, min_periods=0).mean()

  array = np.array(series)
  scaler = MinMaxScaler()

  training_data = scaler.fit_transform(array.reshape(-1,1))

  return training_data, scaler
  • MinMaxScaler()를 통해 데이터를 정규화

 

모델을 학습시키기 위한 데이터셋을 생성하는 함수 make_dataset

-   `def make_dataset(training_data, t, test_size=0.2): X_train = [] y_train = [] for i in range(t, len(training_data)): X_train.append(training_data[i-t:i]) y_train.append(training_data[i]) X = np.array(X_train) y = np.array(y_train) return train_test_split(X, y, test_size=test_size, shuffle=False)`

training\_data, scaler = preprocess(mydf\['open'\], window\_size=10)  
X\_train,X\_test,y\_train,y\_test = make\_dataset(training\_data, t = 168) # 168



3. 모델 학습시키기(Model Training)

def model\_build():  
model = Sequential()  
model.add(InputLayer(input\_shape=(X\_train.shape\[1\],1)))  
model.add(LSTM(units=128))  
model.add(Dropout(0.5))  
model.add(Dense(units=1))  
model.compile(loss='mean\_squared\_error', optimizer='adam')  
return model

hist = KerasRegressor(build\_fn=model\_build, epochs=20, batch\_size=30)  
fmodel = AdaBoostRegressor(hist, n\_estimators=3, random\_state=42)

fmodel.fit(X\_train,y\_train)


LSTM 모델을 생성하고 AdaBoost 회귀 모델을 통해 앙상블 학습한다.


4. 데이터 예측(Data Prediction)

preds = fmodel.predict(X_test)
preds = scaler.inverse_transform(preds.reshape(-1,1)).flatten()
label = scaler.inverse_transform(y_test.reshape(-1,1)).flatten()

for i in range(len(X_test)):
print("실제값 : {:.1f}, 예측값 : {:.1f}".format(label[i],preds[i]))
print("오차값 : {:.1f}".format(abs(label[i]-preds[i])))
print("")


학습한 결과를 토대로 예측한 값과 실제 값의 차이를 분석하기 위해 간단하게 출력했다.

근데 뭔가 많이 잘못되고 있는거 같다.