텐서플로우를 사용하여 BTCUSDT 시세를 예측하는 프로그램을 작성하기 위해, 먼저 엘리어트 파동 이론을 적용한 시계열 데이터를 준비하고, LSTM(Long Short-Term Memory) 모델을 사용하여 시세를 예측할 수 있습니다. 아래 코드는 이를 수행하는 간단한 예시입니다. 더 나은 예측 결과를 얻기 위해서는 데이터 전처리, 하이퍼파라미터 튜닝, 모델 구조 변경 등의 고려가 필요합니다.
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 데이터 불러오기 및 전처리
def load_data(file_path):
data = pd.read_csv(file_path)
data = data[['timestamp', 'open', 'high', 'low', 'close', 'volume']]
return data
def preprocess_data(data, seq_len):
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
x, y = [], []
for i in range(len(data_scaled) - seq_len):
x.append(data_scaled[i : i + seq_len])
y.append(data_scaled[i + seq_len, 4])
x, y = np.array(x), np.array(y)
return x, y, scaler
# LSTM 모델 구축
def build_model(input_shape):
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=input_shape))
model.add(LSTM(100, activation='relu'))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
return model
# 학습 및 예측
def main():
# 데이터 불러오기
file_path = 'BTCUSDT_data.csv'
data = load_data(file_path)
# 엘리어트 파동 이론을 적용한 시계열 데이터 전처리
seq_len = 60
x_train, y_train, scaler = preprocess_data(data, seq_len)
# 모델 구축 및 학습
model = build_model((seq_len, x_train.shape[2]))
model.fit(x_train, y_train, epochs=100, batch_size=32, verbose=1)
# 1시간 후의 BTCUSDT 시세 예측
last_data = data.iloc[-seq_len:].values
last_data_scaled = scaler.transform(last_data)
last_data_scaled = np.reshape(last_data_scaled, (1, seq_len, last_data_scaled.shape[1]))
prediction = model.predict(last_data_scaled)
prediction = scaler.inverse_transform(np.hstack((last_data[-1, 1:5], prediction, last_data[-1, -1].reshape(1, 1))))
print("1시간 후 예측 BTCUSDT 시세:", prediction[0, 4])
if __name__ == "__main__":
main()
1. 데이터 전처리:
데이터 전처리는 preprocess_data 함수에서 수행됩니다. 원본 데이터를 MinMaxScaler를 사용하여 0과 1 사이의 값으로 스케일링합니다. 이를 통해 모델이 더 쉽게 학습할 수 있습니다. 또한, 시계열 데이터를 고려한 훈련 데이터셋을 만들기 위해 seq_len 길이의 연속된 데이터 포인트를 가져와 X와 Y로 분할합니다. 이렇게 하면 네트워크가 주어진 seq_len 길이의 데이터를 기반으로 다음 시간 단위의 가격을 예측하는 방법을 학습합니다.
전처리를 수정하는 방법 중 하나는 스케일러를 변경하는 것입니다. 예를 들어, MinMaxScaler 대신에 StandardScaler를 사용할 수 있습니다. 또한, seq_len을 변경하여 더 긴 시퀀스를 기반으로 예측을 수행할 수 있습니다.
2. 하이퍼파라미터 튜닝:
프로그램에는 여러 하이퍼파라미터가 포함되어 있습니다. 주요 하이퍼파라미터는 다음과 같습니다.
seq_len: 시계열 데이터의 길이. 이 값을 조정하여 모델이 예측을 수행하는 데 사용하는 과거 데이터 길이를 변경할 수 있습니다.
LSTM 층의 유닛 수 (예: 100): LSTM 층의 복잡성과 표현력을 조절합니다. 이 값을 늘리면 모델의 표현력이 향상되지만, 과적합의 위험이 높아질 수 있습니다.
학습 에포크 수 (예: 100): 모델을 학습하는 반복 횟수입니다. 이 값을 늘리면 모델이 데이터에 더 적응하지만, 과적합의 위험이 높아질 수 있습니다.
배치 크기 (예: 32): 한 번에 처리되는 데이터 샘플 수입니다. 이 값을 조절하여 학습 속도와 정확도의 균형을 조절할 수 있습니다.
3. 모델 구조 변경:
현재 구조는 두 개의 LSTM 층과 하나의 Dense 출력 층으로 구성되어 있습니다. 이 구조를 변경하여 모델의 성능을 향상시킬 수 있습니다. 예를 들어, 다음과 같은 변경을 고려할 수 있습니다.
(1) LSTM 층 추가 또는 제거: 더 깊은 모델이 더 복잡한 패턴을 학습할 수 있지만, 과적합의 위험이 높아질 수 있습니다. 반면에, 층을 줄이면 모델이 덜 복잡해지고, 과적합 위험이 낮아질 수 있지만, 표현력이 제한됩니다.
(2) Dropout 층 추가: 과적합을 줄이기 위해 Dropout 층을 추가할 수 있습니다. 이는 학습 과정에서 일부 뉴런의 연결을 무작위로 끊어 과적합을 방지하는 기법입니다.
(3) 활성화 함수 변경: 현재 모델에서는 LSTM 층에 ReLU 활성화 함수를 사용하고 있습니다. 다른 활성화 함수를 사용하여 모델의 동작을 변경할 수 있습니다. 예를 들어, Tanh 또는 Leaky ReLU와 같은 활성화 함수를 시도할 수 있습니다.
(4) Dense 층 추가: 출력층 이전에 추가적인 Dense 층을 추가하여 모델의 복잡성을 증가시킬 수 있습니다. 이는 모델이 더 복잡한 함수를 학습할 수 있게 하지만, 과적합의 위험이 높아질 수 있습니다.
이러한 변경 사항을 적용하려면 build_model 함수를 수정해야 합니다. 예를 들어, Dropout 층을 추가하려면 다음과 같이 변경할 수 있습니다.
from tensorflow.keras.layers import Dropout
def build_model(input_shape):
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=input_shape))
model.add(Dropout(0.2)) # Dropout 층 추가
model.add(LSTM(100, activation='relu'))
model.add(Dropout(0.2)) # Dropout 층 추가
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
return model