BIBOT
BIBOT
BIBOT
전체 방문자
오늘
어제
  • 분류 전체보기 (79)
    • 경제뉴스 일기 (11)
    • 바이낸스 (17)
    • 코딩 (15)
    • 기술적 트레이딩 (27)
    • 기타 (1)
    • 경제상식 (6)
    • 일상 (1)

블로그 메뉴

  • 홈
  • 선물거래 계산기
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 우분투
  • 파이썬
  • 파이썬 바이낸스
  • 서버

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
BIBOT

BIBOT

엘리어트 파동이론과 텐서플로우를 결합하여 바이낸스 BTCUSDT의 1시간 뒤 시세 예측하기
코딩

엘리어트 파동이론과 텐서플로우를 결합하여 바이낸스 BTCUSDT의 1시간 뒤 시세 예측하기

2023. 3. 17. 03:03

 

텐서플로우를 사용하여 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

 

반응형
저작자표시 비영리 변경금지 (새창열림)
    '코딩' 카테고리의 다른 글
    • Binance 거래소에서 전날 대비 거래량이 가장 많이 늘어난 코인 순으로 출력하는 파이썬 코드
    • 바이낸스 펀딩피 전략 기본적인 파이썬 코드
    • 텐서플로우로 1시간 뒤의 바이낸스 BTCUSDT 시가를 예측하는 프로그램 샘플 만들기
    • 파이썬으로 바이낸스 선물거래소에 있는 심볼 중 거래량과 가격 변동이 비슷한 심볼 5개를 찾는 방법
    BIBOT
    BIBOT

    티스토리툴바