코인 수익률이 -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("")
학습한 결과를 토대로 예측한 값과 실제 값의 차이를 분석하기 위해 간단하게 출력했다.
근데 뭔가 많이 잘못되고 있는거 같다.
'tech' 카테고리의 다른 글
데이터베이스 인덱스는 왜 B-tree를 사용하는가? (0) | 2025.03.12 |
---|---|
웹소켓(WebSocket)과 Websocket-sharp.dll 오류 (0) | 2024.11.17 |
ARIMA를 이용한 향후 5일간 비트코인(BTC) 종가 예측 프로젝트 (0) | 2024.11.17 |
Pandas를 통해 포항시 인구수 분표를 시각화해보자 (1) | 2024.11.17 |