티스토리 뷰

본 포스팅이 조금이나마 도움이 되셨다면 공감버튼 클릭 부탁드립니다.

 

System Architecture Design

주식 자동매매 프로그램을 만들기 위해 요구사항 분석단계를 거쳐 지난 시간에는 Use Case Diagram 을 그려보면서 내가 만들고자 하는 프로그램이 어떤 기능을 제공해야 하는지를 대략적으로 알아볼 수 있었습니다. 이번에는 좀더 프로그램을 구체화하기 위한 단계로 System Architecture Design 즉, HW/SW 를 나눠서 각각의 영역에서 시스템을 어떻게 설계해야 하는지, 그리고 각각의 시스템을 구성하는 서브시스템은 어떤것들이 있으며 서로 어떤 관계인지를 명세화 하는 단계입니다.

 

 

 

시스템 구성도

System(SW) Architecture Design

일단 주식매매 프로그램이기 때문에 주식거래를 하기위한 증권사 서버(Kiwoon-Api-Server)가 필요하고 해당 서버에 요청을 하는 부분이 필요합니다. 요청하는 부분이 실제 만들어야 하는 프로그램인데, Django 웹 프레임워크를 사용하여 웹기반의 Application 형태로 구현하기로 결정했습니다.

 

Micro Service Architecture

하나의 단일 서버에 여러가지 기능을 모두 때려박는 형태로 설계하지 않고 여러개의 서비스가 협업하는 형태인 Microservice Architecture 로 설계를 했습니다. 위 그림을 보면 주식매매 및 주식데이터 수집을 위한 트레이딩 서비스, 웹 크롤링을 담당하는 서비스가 존재합니다. 만약 이후에도 새로운 기능이 필요한 경우 기존 서비스에서 지원할수 있는 성격이 아니면 신규 서비스를 등록하는 형태로 구현할 예정입니다. 이런식으로 구성함으로써 전체 시스템을 좀더 견고하게 만들고, 기능(구현)을 각 서비스별로 격리시켜 프로그램 구현 복잡도를 낮추고자 하였습니다. 구현이 분리되고 복잡도가 낮아짐으로써 테스트(단위테스트, Integration테스트)의 구현이 좀더 손쉬워지고, 버전 업데이트시 필요한 기능만 업데이트하여 전체 시스템에 주는 영향도를 최소화하길 기대하고 있습니다. 

 

 

 

PC Application  vs  Web Service

시스템 설계시 PC 기반의 Application(pyQT) 형태로 구현할지, 웹 프레임워크(Django)기반의 Client-Server형태로 구현할지 고민을 많이 했습니다. 최종은 위에서 설명한대로 Django 를 사용하여 웹 서비스 형태로 구현하기로 결정을 하였는데, 왜 이런 결정을 하게 되었는지 간략히 설명합니다.

 

 

구현난이도, 개발속도 보다는 자유도, 확장성, 모바일 친화성

먼저 pyQT를 사용하여 PC App 을 만들었을때의 장점은 주식매매 프로그램의 바이블과 같은 책인 "파이썬으로 배우는 알고리즘 트레이딩"에서 pyQT 기반으로 프로그램을 만들기 때문에 손쉽게 레퍼런스 코드를 구할수 있다는 장점이 있고, pyQT를 사용하면 마우스로 드래그하고 이벤트만 연결하면 UI 를 손쉽게 만들수 있기 때문에 개발속도가 매우 빠를것이라는 기대가 있었습니다.

 

하지만 pyQT는 서비스(서버) 개념이 아니기 때문에 집에 있을때만 사용할 수 있다는 단점이 있습니다. 물론 원격접속 프로그램을 이용하면 밖에서도 제 PC에 접속하여 프로그램을 실행할수 있지만, 원격접속은 반응속도가 느리기도 하고 모바일로 접속하는 경우 키보드/마우스 컨트롤이 어렵기 때문에 사실상 원격으로는 뭔가를 해보기가 쉽지 않습니다. 주식시장이 열리는 9시~3시30분은 항상 회사에 있는데 회사에서 저의 자동매매 프로그램이 제대로 돌고 있는지, 이상은 없는지 체크해보고 문제가 생겨서 원격에서 조정하려면 웹 서비스는 고려사항이 아니라 필수라는 생각이 들었습니다. (아마도 이런 불편함을 느꼈기 때문에 요구사항 분석할때도 '외부에서 프로그램을 일부 조작할수 있어야 한다. (프로그램이 뻗으면 Auto-Restart 또는 매뉴얼 shutdown)' 이런 내용이 포함되지 않았나 싶습니다. 또한 모바일로 접속했을때 모바일에 적합한 페이지 구성을 할수 있기 때문에 이후에 사용성 측면에서도 더 편리할 것으로 생각했습니다.

 

웹 서비스로 구현하게 되면, pyQT대비 구현의 복잡도는 올라가지만, 이 부분은 개발자로써 역량을 향상시키고 싶기도 했고, 제가 극복해야 하는 영역으로 생각했습니다. 또한 pyQT 대비 자유도가 높기때문에 향후에 다양한 요구사항을 만족시키기에도 적합하다고 생각하였고, 다양한 웹 기반 라이브러리를 사용할 수 있다는 점도 매력적으로 다가왔습니다.

 

 

Django 채택

웹 서비스 형태로 구현하기로 마음을 먹고나서 어떤 웹 프레임워크를 사용해야 할지 또 고민이 되었습니다. 제가 아는 유명한 웹 프레임워크는 Node.js(javascript), Django(python), Flask(python), Spring(java) 정도가 있습니다. 일단 주력 개발언어를 python 으로 정했기 때문에 되도록 한가지 프로그래밍 언어로 개발을 하고 싶어서 Django, Flask 2개로 선택지를 좁혔고, 그중에서도 Django 를 선택한 이유는 Admin 페이지를 기본으로 제공해준다는 장점과 MVC 패턴을 사용하여 코드를 구현할수 있다는 점, 그리고 Django에 대해서 잘 몰라서 이번기회에 배워보고 싶어서 선택하게 되었습니다.

 

 

 

Database

제가 만드는 주식매매 프로그램의 핵심기술은 "매매전략의 검증" 이 될것으로 생각합니다. 흔히 말하는 백테스팅, 매매시뮬레이션 이 부분이 기술적으로 완벽하게 구현된다면, 다양한 가설(매매전략)을 세우고 이게 시장에서 통하는 전략인지, 시간 구간별, 요일별, 월별 나타나는 특징은 무엇인지 반복적으로 보이는 패턴이 있는지, 주가의 상승 또는 하락에 유의미한 factor는 무엇인지 등등을 손쉽게 알아낼 수 있다고 생각합니다.

 

일단 데이터 분석을 하려면 데이터를 먼저 수집하고, 다루기 쉬운 형태로 가공하여 저장을 해야 합니다. 주식자동매매를 위한 데이터 관리를 위해 어떤 Database를 사용해야 할지 고민이 되었고, 최종적으로 MongoDB를 사용하기로 했습니다. 왜 MongoDB 를 선택하게 되었는지 그 이유를 간략히 설명합니다.

 

 

다양한 형태의 데이터

일단 수집해야 할 데이터의 종류에 대해서 생각해봤습니다.

  1. 주식 데이터 (시세, 거래원, 거래량, 파생데이터 등등)
  2. 기업, 증권 뉴스 (텍스트 데이터)

증권사 api 서버에서 제공하는 주식데이터는 형태로 고정되어 있지만, 해당 정보를 베이스로 하는 여러가지 파생 데이터는 형태가 무한히 확장될 수 있습니다. 익히 알고 있는 파생데이터도 있지만, 나만의 전략, 가설에 사용되는 개인 파생데이터도 존재하기 때문입니다. 또한 증권시장은 언론에서 만들어내는 뉴스에 매우 민감하게 반응하기 때문에 뉴스를 크롤링하고 머신러닝/딥러닝을 적용하여 단어를 부정/긍정으로 구분하고 이를 매매에 반영하고자 한다면 이러한 비정형데이터를 저장할 수 있어야 합니다. 요즘은 SNS또한 파급력이 높기 때문에 경우에 따라서는 facebook, 인스타그램, 트위터의 텍스트 데이터를 파싱해야 할지도 모르겠습니다. 이러한 비정형 데이터를 저장하기 위해 NoSQL Database를 선택해야 했고, NoSQL DB 에서 가장 인기가 많은 MongoDB 를 선택하게 되었습니다. 인기가 많은 만큼 구글링 했을때 손쉽게 많은 정보를 접할수 있고, Document도 굉장히 잘 되어 있습니다. (영문..ㅠ.ㅠ) 또한 Client Tool 도 여러가지가 존재하고요.

 

아래는 DB엔진 인기도를 보여주는 db-engines.com의 결과입니다. Document Store type DB중에서는 MongoDB가 1위네요.

database 인기도 순위, MongoDB는 NoSQL에서 1위

 

 

 

마무리

자동매매 프로그램의 SW 시스템 아키텍쳐를 설계하고 왜 이렇게 설계하였는지, 어떤 장점이 있고 어떤 제약사항이 있는지 나름대로 고민한 부분들을 쭉 적어봤습니다. 개발경험이 많지 않고 설계는 처음해보는 것이다 보니 서툰부분도 많고 고민의 깊이가 부족한 부분도 많을 수 있습니다. 계속 개발해보면서 경험도 더 쌓고, 책을 보면서 새로운 인사이트도 얻고, 제 블로그를 방문해주시는 분들의 의견도 들어보면서 계속 역량을 쌓아나가야 할것 같습니다.

 

 

 

참고링크

나의 첫 Django 앱 만들기

MongoDB 공식 매뉴얼

인프런 Django 강좌들

javascript로 배우는 NoSQL DB

T아카데미에서 진행하는 MongoDB 유투브 강좌

 

 

본 포스팅이 조금이나마 도움이 되셨다면 공감버튼 클릭 부탁드립니다.
댓글