본문 바로가기

기록지/FLOWBIT

[FLOWBIT] 비트코인 자동거래 시스템에서 예측 가격 제공 서비스로 전환! ✨

반응형

1. 개요

 비트코인 자동거래 시스템을 만들기 위해 AI 모델을 학습시켰다. 이렇게 모델을 학습 시키고 나니 해당 정보를 사용자들에게 제공하는 것이 어떨까? 라는 생각이 들었다. 해당 모델의 값을 매일 업데이트하여 USER에게 제공해주는 서버를 개발하다면 스스로도 공부가 될 것 같았다. 그래서 팀을 모아 내 인생 첫 사이드 프로젝트인 FLOWBIT를 개발하기 시작하였다!

 

2. 본문

- 웹 서버 구현

 

 비트코인 가격 예측 모델을 학습한 후 이를 배포할 서버가 필요했다. 그리고 Python 기반의 서버 프레임워크를 원했다. 마침 4학년 1학기 때 배운 Flask를 활용해보고 싶기도 하고 예측 가격만을 도츨하는 가벼운 기능이었기에 Flask를 최종적으로 선택하였다.

 

 USER 서버 같은 경우 Spring boot로 구현을 시작했기 때문에 자연스럽게 MSA 구조로 관심이 갔다. 다행이도 Flask를 Spring eureka 서버에 등록하는 모듈이 있었기에 구조를 잡았다. 다음은 우리 서비스의 구조이다.



 RabbitMQ는 config service와 연결해 작동하는 서비스들을 중단하지 않고 업데이트 해주는 기능을 구현하기 위해 사용하였다. 여기서 내가 집중한 부분은 바로 chart service와 discovery service이다.

 

- FLOWBIT Machine 개발

 

 다차원 학습을 진행한 후 학습된 모델을 .h5 확장자 모델로 저장하였다. 이를 불러오고 전처리를 진행하는 모듈을 개발하고 싶었다. 다음은 내가 개발한 Python 모듈이다.

 

from tensorflow.keras.models import load_model
from sklearn.preprocessing import MinMaxScaler
import sys
import os
import numpy as np

class FlowbitMachine:
    def __init__(self):
        """
        모델 및 스케일러 정의
        """
        self.scalerOne = MinMaxScaler(feature_range=(0, 1))
        self.scalerMul = MinMaxScaler(feature_range=(0, 1))

        real_path = os.path.abspath(__file__)[0:-18]+"BITCOIN_MODEL_VER2.h5"
        if os.path.isfile(real_path):
            self.model = load_model(real_path, compile=False)
        else:
            print("File does not exist:", real_path)

    def get_predict_value(self, current_data):
        """
        모델을 불러와서 학습을 진행하고 결과값을 return
        """
        predicted_value = self.model.predict(current_data)
        predicted_value = self.scalerOne.inverse_transform(predicted_value)

        return predicted_value[0][0]

    def data_processing(self, raw_data):
        """
        학습을 위한 전처리 진행
        """

        final_data = [raw_data]
        final_close_data =  [entry[1] for entry in raw_data]

        final_data = self.scalerMul.fit_transform(
            raw_data
        )
        final_close_data = self.scalerOne.fit_transform(
            np.array(final_close_data).reshape(-1, 1)
        )
        final_data = [final_data.tolist()]

        return final_data

 

 위의 모듈은 객체 생성 시 모델 파일을 로드하고, 데이터 전처리를 진행해 학습을 진행한다.

 

2. 결어

 12월 1차 릴리즈가 끝나고 개발 대회에서 해당 서비스로 수상하였지만, 후기 작성이 너무 늦은 감이 있다. 기억이 조금이라도 더 생생할 때 1차 릴리즈의 과정을 적고싶다.

반응형

'기록지 > FLOWBIT' 카테고리의 다른 글

[FLOWBIT] BITCOIN SERVICE의 DDD 구조 작성 📚  (0) 2024.03.31