본문 바로가기
  • 데이터야 놀자
데이터 분석 환경

LSTM 활용한 주식가격 예측 모델 만들기 첫걸음.

by 데이터랑 2023. 11. 14.
728x90

 

 

개인적으로 데이터 분석에 대한 지식이 필요해서 자기 학습을 진행하고 있는데 흥미롭기도 하지만 데이터 유형이나 분석하고자 하는 것이  무엇(?)이냐에 따라서 그에 맞는 분석방법을 찾는 것이 숙제인 것 같다.

 

공개된 자료를 찾아 공부하다보니,

커다란 퍼즐판을 맞추기 위해 어디에 맞춰 놓아야 하는 조각들 인지도 모르면서, 조각을 찾는 느낌이 들기도 한다.

 

결국,  LSTM모델까지 오긴 했는데 최적의 모델을 찾아내기 위해 해야 하는 세밀한 작업도 만만치 않은 것 같다. 

 

일단, 지금까지 학습한 것들을 간략하게 정리해 보고 LSTM, GRU, CNN 모델을 만들어 봐야겠다.

 

 

시계열데이터 분석을 위한 여러 가지 방법과 모델들..

 

시계열 데이터 분석 방법 분류

 

1. 통계기반 분석방법

지수평활법 (Exponential Smoothing) 최근 데이터에 높은 가중치를 부여하고 이전 데이터에 지수적으로 감소하는 가중치를 적용하여 시계열 데이터를 예측하는 방법
ARIMA - AutoRegressive Integrated Moving Average 자기회귀누적이동평균 모델 ARIMA는 자기회귀 모형과 이동평균 모형을 결합한 시계열 분석 방법으로, 데이터의 정상성을 확보하기 위해 차분(Differencing)을 사용하는 방법
SARIMA ARIMA 모델에 계절성 요소를 추가한 모델로, 계절적인 패턴이 있는 데이터에 더 적합

 

2. 머신러닝기반 분석방법

선형회귀 (Linear Regression) 주어진 독립 변수들과 종속 변수 사이의 관계를 가장 잘 설명하는 회귀 계수를 찾기위해 최소제곱법(Least Squares Method) 등을 사용하여 모델링하는 방법
로지스틱 회귀분석 이항 변수((둘 중 하나의 값만을 가질 수 있는 변수)의 확률을 예측하는 데 사용되며, 주로 분류 문제에서 활용되며 예측값을 시그모이드 함수를 사용하여 [0, 1] 사이의 확률로 변환 함
랜덤포레스트 (Random Forest) 전체 Feature 중 랜덤으로 일부 Feature만 선택해 하나의 결정 트리를 만들고, 또 전체 Feature 중 랜덤으로 일부 Feature를 선택해 또 다른 결정 트리를 만들며, 여러 개의 의사 결정 트리를 만드는 방식으로 의사 결정 트리마다 하나의 예측 값을 구한것을 합쳐서(앙상블) 가장 많이 나온 값을 최종 예측값으로 결정

 

 

3. 인공지능기반 분석방법

RNN(Recurrent Neural Network 순환신경망) 이전 단계의 출력이 현재 단계의 입력으로 사용되는 반복 구조를 갖는 순환 신경망을 나타내는 모델로, 시계열 데이터와 같이 시간적 또는 순서적인 의존 관계를 갖는 데이터를 처리하기 위해 고안된 모델
LSTM (Long Short-Term Memory) 딥러닝의 일종인 순환 신경망(RNN) 기반의 모델로, 시계열 데이터의 장기 의존성을 학습하여 예측에 활용하는 모델
GRU(Gated Recurrent Unit) 순환 신경망(RNN)의 변형 중 하나로, 장기 의존성 문제를 해결하기 위해 고안된 모델로 LSTM(Long Short-Term Memory)과 유사한 아이디어를 기반으로 함. 하지만, 더 간단한 구조로 LSTM보다 적은 파라미터를 가지고 있어 계산상의 부담이 적어, 학습 속도가 빠르다는 평가를 받고 있음

 

 

일단, LSTM으로 시계열 데이터 분석 시작해 보련다.

 

1.  분석도구는 케라스 Keras로 하고

  • 케라스 :  TensorFlow를 기반으로 하는 고수준 API로 다양한 신경망 모델을 쉽게 구현할 수 있는 기능 제공
  • PyTorch :  다양한 신경망 모델을 쉽게 구현할 수 있도록 도와주는 기능을 제공
  • 사이킷런 : LSTM 모델을 포함한 다양한 신경망 모델을 제공하나 기능이 제한

2. 분석모델 수립 절차

  • 데이터셋 만들기
  • 데이터 정규화
  • 데이터셋을 학습데이터와 테스트데이터로 분할하기
  • LSTM 모델 구성하기   ===>  many to one, many to many 등에 따라 구성방법이 달라질 수 있음
  • 모델 훈련하기
  • 모델 평가하기  ===> 로스율 확인해서  epoch 값에 반영
  • 예측데이터 확인하기
  • 그래프로 확인해 보기

3.  Lesson Learned

 

  • Many to Many 방식으로 로 테스트 했는데 오류율이  0.04 ~ 0.06 
  • 그런데 그래프로 보니  예측값이 이평선처럼 나옴 => 정규화방법을 다시 고민해볼 필요가 있을것 같음
  • Many to One 방식으로 다시 테스트해볼 필요가 있을 것 같음
  • ===> LSTM 모델수립 시 배치사이즈, epoch , unit, Dense 값등 최적화 작업이 필요 
  • 체크포인트 콜백으로 최저 로스수행포인트를 구해 모델을 저장하고 재사용 가능하도록 보완필요

 

 

4. 코딩  (LSTM 테스트를 위해 작성한 첫 번째 코딩)

다음은  이번 테스트를 위하여 작성해 본 LSTM 테스트 모듈이다

def LSTM_Test(data_set, window_size, train_ratio):           
    # 데이터 정규화 방법 1
    scaler = MinMaxScaler(feature_range=(0, 1))           ## 정규화 방법 정의
    scaled_data = scaler.fit_transform(data_set)
 
    # 데이터셋 분할 학숩데이터, 테스트데이터로
    train_size = int(len(data_set) * train_ratio)
    train, test = scaled_data[0:train_size], scaled_data[train_size : ]
    print("train_size ===> ", train_size, "test _size ===> ", len(test) )
    
    # 시간 단계 설정
    time_steps =  window_size  ## 호출시 설정 값

    # 훈련 데이터셋 생성
    X_train, y_train = create_dataset(train, time_steps, 5)		## 5일치를 y값으로

    #평가 데이터셋 생성
    X_test, y_test = create_dataset(test, time_steps, 5)

    # LSTM 모델 구성 절차 ===> 앞으로 최적화 작업이 필요함
    model = Sequential()
    model.add(LSTM(units=50, return_sequences=True, input_shape=(10, 6)))  ## LSTM은 3D 텐서를 input으로 넣어줘야하
    ###  batch_input_shape=(batch_size, timesteps, features) 로 지정/, input_shape=(timesteps,features) 하고 따로 batch_size인자를 이용 지정해도 무방
    ###  이 때 명심할 점은 배치사이즈는 반드시 데이터 셋으로 나누어떨어지는 숫자여야하기때문에 train, valid, test 다 만족하려면 1로 (디폴트)
    model.add(LSTM(units=50))
    model.add(Dense(units=6))
    model.compile(optimizer='adam', loss='mean_squared_error')

  
    # 모델 훈련
    model.fit(X_train, y_train, epochs=5, batch_size=1, shuffle=False )  ###  배치사이즈를 명시해야하며 쓰지않으면 에러
    print("훈련은 종료 이후 예측 시작")

    # 모델 평가 : 값이 작을수록 정확도 높음
    loss = model.evaluate(X_test, y_test, batch_size=1)
    print (" # 모델 평가  loss =>", loss)

    # 예측
    test_predict = model.predict(X_test, verbose=2)
  
    # 모델 구조를 출력합니다
    model.summary()
    return test_predict, test

 

 

 

분석에 적합한 알고리즘 찾아내는 것이 숙제로 남은듯..

 

 

 

728x90
728x90

댓글