본문 바로가기

일반 IT 기술

AI를 활용해서 주가 예측 시스템을 개발해보자 (1)

여러가지 일들로 계속 미뤄왔던 AI 기반 주가 예측 시스템 개발 프로젝트를 시작하기로 하였습니다.

여태 회사일, 연구과제, 기타 등등을 이유로 하고 싶던 것과는 관계 없는 일들을 계속 해왔기 때문에 많은 부분에서 유행에 많이 뒤처져있는 상태라서..

이번 개인 프로젝트는 내가 해 보지 않았던 새로운 것들로 구성을 해 보자.. 라고 생각하고 있습니다.

그래서 이름은 거창하지만 내용은 그다지 실속은 없을 수 있습니다. (ㅠㅠ)

 

 

 

 

시스템의 내용은 이름 그대로 입니다.

AI 모델(여기서는 딥러닝 모델의 점유율이 높겠죠)을 기반으로 주가를 분석하여 예측을 하는 시스템입니다.

데이터의 종류에는 이미지, 텍스트, 시계열 데이터 등 다양한 종류를 사용할 계획입니다.

그 분석 방법에는 통계적인 분석과 딥러닝을 비롯한 AI 기술을 기반으로 한 분석들을 함께 적용할 예정입니다.

데이터를 분석한 후 특정 패턴 등을 찾아 일정 시간 후의 값을 예측해 보는 시스템입니다.

흔히 접할 수 있는.. 흔한 AI 기반 시스템이 되겠네요.

 

개발 환경은 리눅스파이썬을 기반으로 합니다.

원래 제가 주로 사용하던 개발 환경은 자바 환경이었는데.. 실무 개발에서 손을 뗀지 좀 되어서 이번 기회에 파이썬으로 완전히 돌아서려고 합니다.

개발용 운영체계 역시 리눅스로 정착을 할 계획입니다.

 

파이썬을 베이스로 할 계획이니 웹 프레임워크는 장고(Django)를 사용해야하나.. 하고 생각했지만 다른 대안이 있다면 그것도 좋겠다.. 라는 생각입니다.

장고 외에도 플라스크나 피라미드, 토네이도 같은 가볍고 좋은 웹 프레임워크도 있지만...

가볍다는 것은 내가 직접 처리, 구현해야 하는 내용이 좀 더 많을 수 있다는게 문제겠죠.

대신 유연성과 자유도는 훨씬 높겠죠.

여기저기 기웃거리다가 FastAPI 라는 웹 프레임워크를 발견했습니다.

예전에 어딘가의 컨퍼런스에 갔다가 아래 사진과 같은 뱃지를 받았었는데.. 저게 뭔지 아무리 생각해도 기억나지 않더니.. 이제 보니 FastAPI의 로고더군요.

FastAPI의 장점으로는 뭐.. 매우 빠르다, 개발속도 향상, 에러 감소 등등.. 소개를 하고 있던데 실제로 사용해 봐야 알겠죠.

 

다음으로 시스템을 전체적으로 제어하는 서비스 아키텍처는 무엇으로 할까... 를 결정해야 하는데...

일단 이번에 개발할 시스템은 단발성이 아니라 이후에도 계속 업그레이드 해 가면서 활용할 시스템이라서 외부에서도 활용할 수 있는 서비스를 제공하도록 할 계획입니다.

그럼 OpenAPI를 제공할 수 있어야겠죠.

 

수년 전부터 대세가 되고 있는 RESTful API 서비스가 먼저 떠오릅니다.

그런데 예전에 회사에서 RESTful API를 제공하는 클라우드 시스템을 개발할 때 RESTful API가 장점도 많지만 개발뿐만 아니라 관리에서도 손이 많이 가는 구조라고 느꼈습니다.

혼자서 만들고 운영하기는 쉽지 않은 작업량을 가지고 있었죠.

그래서 다른 서비스 아키텍처는 없을까.. 하고 찾아보다가 GraphQL이란 것을 찾았습니다.

GraphQL은 페이스북에서 만든 Query 계열의 언어인데 기존의 SQL과는 많이 다른 형태를 가지며, 웹 클라이언트가 서버에서 데이터를 효율적으로 가져오는 것을 목적으로 만든 언어입니다.

약간 테스트를 해 봤는데.. 역시 쉽지는 않습니다.

기존에 사용했던 방식과 좀 다른데다가... 지원 라이브러리나 참고 자료가 적어서 좀 어렵더군요.

그래도 RESTful API 방식보다 흥미가 생겨서 GraphQL을 선택했습니다.

GraphQL을 지원하는 라이브러리는 Graphene 이라는 것이 있습니다.

다른 것도 있을 것 같은데 잘 보이지 않네요.

 

 

 

 

다음으로 전체적인 데이터를 관리하기 위한 DB가 필요합니다.

대용량의 데이터를 사용하긴 하지만 일반적으로 사용되는 DB와는 달리 하나하나의 데이터가 중요한 것이 아닌 시스템이다보니 많이 사용되는 관계형 DBMS보다는 NoSQL 계열의 DB가 좋겠네요.

NoSQL 계열의 DB는 ACID(Atomicity(원자성), Consistency(일관성), Isolation(독립성), Durability(지속성))를 포기하는 대가로 빠른 속도와 유연성을 확보한 DB이며 분산형 데이터 처리에 적합합니다.

즉 빅데이터와 분석을 위한 프로세스에 잘 맞는 DB이므로 개발하려는 시스템에 잘 맞을 것으로 보입니다.

 

그럼 어떤 NoSQL DB를 선택해야 할까... 고민이 됩니다.

세계적으로 가장 많이 사용되는 NoSQL DB는 MongDB 입니다.

그런데 MongoDB는 상업적으로 사용할 경우 소스 코드 공개 등의 조건이 달린 라이센스를 적용하고 있습니다.

특히 오픈소스 라이센스 중에서는 기업에서 가장 꺼린다는 AGPL과 SSPL 라이센스를 적용하고 있네요.

뭐.. 따로 개발할 시스템을 상업적으로 사용하거나.. 소스 코드 공개가 어렵다거나 한 것은 아니라서 문제는 없지만 세상 일은 알 수 없는거니까.. 좀 걸리는 것은 배제하는게 좋을 것 같아서 다른 것도 살펴보았습니다.

구글 트렌드를 이용해서 NoSQL 중에서 가장 많이 쓰이는 DB 4종(MongoDB, Cassandra, Redis, DynamoDB)을 골라서 비교해 보았습니다.

 

그래프를 보면..

전 세계에서는 MongoDB와 Cassandra가 각축을 벌이고 있고 국내에서는 MongoDB와 Redis가 1, 2위를 다투고 있네요.

MongoDB가 라이센스 문제로 빠진다면 Cassandra와 Redis가 남습니다.

Cassandra는 Apache 라이센스, Redis는 BSD 라이센스를 따르네요.

둘 다 사용에 문제가 없는 라이센스인데 가장 자유로운 라이센스인 MIT라이센스와 Apache 라이센스 중에서 Apache 라이센스를 따르는 Cassandra가 좀 더 끌리네요.

일단 Cassandra DB로 선택하고.. DB는 조금 더 테스트를 해 봐야 겠습니다.

 

그런데 여기서 잠깐..

앞에서 GraphQL이란 것을 사용할 것이라고 말씀드렸는데.. 그럼 DB도 Graph DB를 사용해야 하는 것이 아닌가요? 라고 의문을 가지실 수 있습니다.

일단 GraphQL은 GraphDB와는 그다지 관계가 없습니다.

NoSQL 계열의 DB는 데이터의 유형에 따라 키-값, 와이드컬럼, 도큐먼트, 그래프 DB 등으로 나눌 수 있는데 그래프 DB는 그냥 그래프 이론을 기반으로 하는 DB이고 GraphQL은 서비스 아키텍처 종류이므로 서로 다른 분야입니다.

 

이제 주가 데이터를 분석하고 학습하고, 또 예측하기 위한 핵심 모듈을 개발해야겠죠.

앞에서 말씀드린 것처럼 통계적인 분석, 딥러닝 등을 적용한 모듈을 개발할 것입니다.

그럼 잘 알려진대로 지원 라이브러리로는 텐서플로우를 이용해야겠죠.

그런데 하나의 라이브러리만 적용하는 것보다는 다양한 라이브러리를 선택할 수 있게 했으면 합니다.

그래서 텐서플로우만이 아니라 파이토치, 사이킷런 등의 라이브러리를 각각 지원하도록 할 계획이고...

그러려면 각 프로세스를 독립 모듈화 하는 쪽으로 가야 할 것 같네요.

마이크로 서비스의 개념을 적용하는 것이 좋아보입니다.

 

이제 실제로 사용자와 대면할 사용자 인터페이스를 위한 라이브러리를 선택해야 합니다.

사용자 인터페이스는 웹을 기반으로 생각하고 있습니다.

시중에 나와있는 도서들을 보면 QT를 사용하는 방법, 웹을 사용하는 방법 등 다양하게 있는데..

웹용 인터페이스를 지원하는 다양한 플랫폼이나 라이브러리들이 있지만 그 중에서 리액트를 선택하였습니다.

 

리액트에 대한 좋은 평가들이 많은데 실제로 테스트를 해 보니 생각보다 까다로운 문제들이 있더군요.

특히 컴포넌트의 구성 계층에 따른 속성, 데이터의 전달이 계층 간의 이동 방향에 따라 문제가 되는 경우도 있었습니다.

그리고 전체 시스템을 파이썬을 기반으로 개발하고자 하는 계획과 달리 리액트는 자바스크립트 계열이라 조금 괴리감을 느끼긴 합니다만.. 웹을 기반으로 하려면 어쩔 수 없는 선택이네요.

몇 가지 문제가 있긴 하지만 기대를 받고 있는 라이브러리라서 한 번 사용해 보기로 했습니다.

 

다음 글부터 하나씩 진행을 나가도록 하겠습니다.

 

 

 

 

728x90
반응형