종가 예측 기능의 목표는 특정 종목의 과거 시계열 데이터를 기반으로 다음 종가를 예측하는 것입니다. 기술 스펙은 다음과 같습니다.
- 언 어 : Python
- 프레임워크 : Flask
- 라이브러리 : Keras (Dense, LSTM), Numpy, FinanceDataReader
Flask, Python 선택 이유
저는 원래 Spring을 다루는데 익숙하여 본 기능도 Spring으로 개발하여 API를 배포할 예정이었습니다. 그러나 사전 조사하는 과정에서 시계열 라이브러리의 다수가 Python 기반이었고, 리소스의 양도 Java(Spring)보다 Python 더 많았습니다. 과감하게 익숙한 스프링을 포기하고 Python기반 Flask 서버를 채택하기로 결정하였습니다.
LSTM
LSTM(Long Short-Term Memory)은 순환신경망(RNN)의 한 종류로, 시계열 데이터의 장기 의존성을 처리하는 데 특화된 신경망 구조입니다. LSTM은 셀 상태(cell state)와 게이트(gate) 구조를 활용하여 정보의 흐름을 효과적으로 관리합니다.
LSTM은 주식 시장의 가격 변화와 같은 복잡한 시계열 데이터를 다루는 데 유용하며, 주식 종목의 종가 예측, 자연어 처리, 음성 인식 등 다양한 분야에서 활용됩니다. 이 프로젝트에서는 LSTM을 활용하여 주식 종목의 종가를 예측하고, 이를 통해 투자 의사결정에 도움을 주고자 했습니다.
FinanceDataReader
FinanceDataReader는 주식 종목의 시계열 데이터를 불러오는 라이브러리입니다. 처음에는 Yfinance를 사용하였으나 코스닥 데이터를 불러올 때, 불안정한 경우가 존재하여 해당 문제가 없는 FinanceDataReader 라이브러리를 사용하였습니다.
API 흐름
종가 예측 API의 흐름은 다음과 같습니다.
- 학습된 모델이 없을 경우
- 종목 코드 입력 → -1 반환 후 모델 학습(1분 소요) → API 호출 → 예측 값을 유지, 하향, 상향 (0, 1, 2)로 반환
- 학습 모델이 존재할 경우
- 종목 코드 입력 → 예측 값을 유지, 하향, 상향 (0, 1, 2)로 반환
모델 생성, 학습, 예측
- 모델 생성
model = Sequential()
model.add(LSTM(windown_size, return_sequences=True, input_shape=(windown_size, 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='rmsprop')
model.summary()
- 모델 학습
- Input data : 10년치 종가 데이터를 30일 단위로 나누어 입력
- Output data : 30일 단위의 다음 종가
- 모델을 통한 종가 예측
- 당일 기준 지난 30일 종가 데이터를 학습된 모델의 입력값으로 넣어 예측 종가 반환
- 반환된 예측 종가를 이전 종가와 비교하여 유지, 하향, 상향 판단
아쉬운 점
주식 종목의 종가 예측 기능을 개발하며 아쉬었던 점은 개발 기간이 2개월 밖에 주어지지 않았다는 점입니다. 만약 개발 기간이 더 주어졌더라면 종가를 예측할 때, 과거 시계열 데이터뿐 아니라 경제 동향, 시장 흐름, 기업의 상황 등의 정보를 수치화하여 다양한 측면에서 세분화된 데이터를 적용해 예측에 대해서 신뢰성을 높일 수 있었다고 생각합니다.
'개발 > SmileStock 😃📈' 카테고리의 다른 글
[개발 이슈] 성능은 유지하며 모델 학습 시간은 단축하다 (0) | 2024.05.01 |
---|---|
[개발 이슈] 도커 이미지로 빌드하며 마주한 이슈들 (0) | 2024.05.01 |
[개발 이슈] API 응답 소요시간 1분 (0) | 2024.05.01 |
[프로젝트 회고] 소통에 나이 차이는 중요하지 않다 (0) | 2024.05.01 |
[SmileStock] 서비스 흐름 영상 (0) | 2024.04.24 |