Tech Blog

[프로젝트] stockait: 파이썬 라이브러리 개발 회고 본문

프로젝트/팀 프로젝트

[프로젝트] stockait: 파이썬 라이브러리 개발 회고

agsu 2023. 3. 23. 23:31

0. 프로젝트 개요 

▪️  수행 기간: 2022.09.01 ~ 2023.04.08

▪️  프로젝트 목적: 유의미한 연구 과정 함수화, 주가 빅데이터 연구에 편의성 제공   

▪️  프로젝트 내용: 주가 빅데이터에 최적화된 머신러닝 통합 라이브러리 "stockait" 개발  

▪️  사용 언어 및 개발 환경: Python, Jupyter Lab, Linux server 

 


1. stockait 소개

stockait: python machine learning framework for stock prediction

◾Github: https://github.com/stockAI-py/stockAI

◾pypi: https://pypi.org/project/stockait/

◾JOSS paper: (예정) 

 

stockait ? 

▪️  stockait 는 Stock AI Trader라는 뜻의 약자로, 트레이더 단위로 모델 학습, 주식 거래를 통한 주가 빅데이터 학습, 연구용 라이브러리이다.  주가 빅데이터 연구를 하는 과정에서 유의미한 결과가 도출되었던 데이터 필터링, 전처리 등의 방법들을 함수화하여, 주가 빅데이터에 대한 연구를 보다 체계적이고, 편리하게 진행할 수 있도록 한다. 일반적인 머신러닝 프로젝트의 흐름을 생각해보면, [데이터 수집  - 데이터 전처리 - 모델학습 - 모델 평가 ] 로 이루어져 있는데, 대부분 각각 다른 라이브러리를 사용하여 진행하게된다. stockait는 주가 데이터에 한해서 위의 4가지 과정을 모두 하나의 패키지에서 수행할 수 있도록 한다.

 

 

stockait의 필요성 

▪️  학습/연구용 주가 빅데이터 수집
주가 빅데이터를 크롤링하여 수집하거나, 크롤링 기반의 주가 데이터 수집 라이브러리를 사용하면 리퀘스트 오류나, 불러올 때마다 값이 달라지는 등의 불안정성이 동반된다. stockait는 학습/연구용 패키지이므로,  데이터 수집의 안정성과 품질에 초점을 맞추었다.  stockait빅데이터를 클라우드 저장소에 적재해놓고, 사용자에게 제공한다. 따라서 제공되는 데이터는 불안정한 크롤링 방식으로 실시간으로 수집하는 것이 아니라, 데이터를 수집해 적재해 놓고 제공하는 방식을 사용한다. 

▪️  머신러닝의 전체 프로세스를 담은 통합 패키지
 보편적으로 머신러닝 연구를 위해 각 기능 별로 분산되어있는 라이브러리를 사용한다. stockAI는 주가 빅데이터에 대하여 데이터 수집, 데이터 전처리, 인공지능 모델 학습, 모델 평가, 백테스팅(수익률 계산) 의 과정을 하나의 패키지로 수행하는것을 가능하게 한다. 

 

 

제공 데이터셋 

▪️ 데이터 범위

2001년 부터의 국내 및 해외 일 단위 주가 데이터

 

▪️ 데이터 업로드 방식 

- 저장소: AWS DynamoDB, MySQL (oracle cloud server) 

- 업로드 주기: 6개월 (매년 1월 1일, 7월 1일)

 

▪️ 데이터 출처

- 국내: KRX 정보데이터 시스템  (2001~)  

- 해외: yahoo finance  (2001~)

 

 

 

설치 및 임포트 

pip install stockait
import stockait as sai

밑에 3. 사용예시에서 자세한 사용법을 확인 할 수 있다.

 

 

 

 


2. 프로젝트 과정 

2.1 데이터 수집 

 주가 데이터 수집 패키지는 이미 개발되어 유명한 라이브러리들(yfinance, pykrx, fdrDataReader)이 있다. 하지만 할 수 있는 한 직접 크롤링하여 데이터를 적재하는 방향을 선택하였다. 그 이유는 안정성 문제를 해결하기 위함이었다. 하나의 예로, yfinance는 데이터를 불러올 때마다 데이터의 개수가 달라진다. stockait는 실시간 주가 데이터 수집의 목적 보다는, 연구 목적이 크기 때문에, 학습에 사용할 오류없는 주가 데이터를 안정성있게 불러오고자하였다.  따라서 주가 데이터를 제공하는 사이트(krx, yfinance, investing.com 등) 에서 크롤링을 시도했다.

 

KRX에서 종목별 주가 데이터 크롤링하기

 

KRX에서 종목별 주가 데이터 크롤링하기

Chapter 5 금융 데이터 수집하기 (기본) 이 블로그의 방법을 참고하여 진행하였습니다. 1. KRX 데이터 크롤링 1.1 필요 데이터셋 주가 빅데이터 관련 라이브러리 개발을 진행하면서 종목 별 주가 데이

agsu.tistory.com

 국내 주가데이터는 위의 게시글과 같이, KRX에서 크롤링하여 수집했다. 개발자 도구의[F12] 네트워크 탭에서 csv 파일을 다운로드 받는 과정을 코드로 수행하는 방법이다. 해외 주가데이터는 yahoo finance와 investing.com 에서 크롤링을 시도하려 했지만, 방대한 양의 데이터다보니 IP차단, request 라이브러리 사용 시 403 Error 등 여러 오류를 마주했다. 오랜 크롤링 시도와 팀원들과의 협의 끝에 한국데이터는 KRX 주가 데이터 크롤링, 해외 데이터는 yfinance 패키지를 사용하여 수집하고, 적재하기로 결정하였다. 

 

 

 

2.2 데이터 적재 

 데이터 적재는 라이브러리 개발 과정 중 가장 시행착오가 많았던 부분이다. 데이터 적재 시도는 다음과 같이 진행되었다. 

 

첫번째, 깃허브에 csv 파일로 올려서 제공하자. 

 깃허브는 기본적으로 100 MB 까지 파일을 올릴 수 있지만, 수집한 주가 데이터의 csv 파일은 국내 KOSPI, KOSDAQ, KONEX 시장만 해도 400MB 가 넘었다. 

 

두번째, 깃허브 lfs 와 parquet 파일을 사용하자. 

git lfs 사용하여 대용량 데이터 업로드하기

 

git lfs 사용하여 대용량 데이터 업로드하기

프로젝트를 수행하면서 github에 100MB의 용량이 넘어가는 csv 파일을 올려야 하는 일이 있었는데, 파일이 커서 업로드할 때 거부당했습니다. 그래서 찾아보니 50MB부터 경고, 100MB부터는 오류가 발생

agsu.tistory.com

 그래서 찾은 해결법은 git lfs 였다. 대용량 파일로, 최대 1GB 까지 올릴 수 있다. 거기에 DataFrame을 용량을 축소한 파일인 parquet 으로 저장하는 방법을 발견하여 csv 파일의 용량을 최대한 줄였다. 그래도 1GB로는 국내, 해외 주가 데이터셋을 모두 올리기에는 역부족이었다. 게다가 다운로드 받는 만큼 과금이 책정된다고 하니, 사용할 수 없었다. 

 

 

세번째, github 말고 다른 무료 데이터베이스 클라우드 서비스를 찾아보자.

팀원들과 함께 찾아본 후보들은 다음과 같았다.  

▪️ 구글드라이브 (개인 계정 엑세스 문제)

▪️ mongodb atlas (500메가까지만 무료)

▪️ planetscale (학교 공용 서버에서 사용하기에 한계 - .env, ssh key 발급 등)

▪️ aws RDS (MySQL 가능하지만 프리티어 12개월)

▪️ aws dynamodb (25GB 무료, 용량이 크면 메모리가 터지는 문제 발생, 종목코드 적재 확정!)

▪️ oracle cloud 서버 (주가데이터 적재 확정!)

 

stockait에서 데이터를 불러오는 함수에는 get_tickers(시장 별 종목코드 불러오기), load_data(종목코드 별 주가데이터 불러오기)가 있었다. 그래서 데이터 적재를 할 때도, 시장 별로 종목코드 저장, 종목코드 별로 주가 데이터 저장 을 진행해야 했다.

 

▪️  aws dynamodb 선정 이유

 시장 별 종목코드 저장은 시장 별로 종목코드의 개수가 모두 다르고, 값이 배열 형태로 들어가기 때문에 데이터의 구조가 필요하기 보다는,  {"시장": [종목코드1, 종목코드2, ...]} 와 같이 json 형태가 적합할 것이라고 생각했다. 따라서 RDBMS 보다는 NoSQL 을 사용하기로 하였고, aws dynamodb가 프리티어로 25GB를 제공해주어, 선택하게되었다. 

 위에 보이는 것과 같이, key에 시장명을 넣어주었고, value에 종목코드를 배열로 저장하였다. 저장 방법은 아래의 글에 정리되어있다. 

AWS dynamoDB

 

Python에서 AWS dynamoDB 사용하기

AWS dynamoDB Amazon DynamoDB는 Amazon Web Services (AWS)의 완전 관리형 NoSQL 데이터베이스 서비스로, DynamoDB는 키-값 쌍의 데이터 모델을 사용하여 데이터를 저장하며, 스키마가 없는 데이터베이스입니다. Dyn

agsu.tistory.com

 

 

▪️ oracle cloud 서버 선정 이유 

 주가 데이터를 크롤링하면 위와 같은 형태의 DataFrame으로 저장되므로, MySQL에 DataFrame 자체를 저장하고, SQL 쿼리문을 통해 효율적으로 불러오기 위해 RDBMS를 사용하는 것이 적합하다고 판단하였다. 또한, Oracle cloud에서 무료 인스턴스 2개를 제공해주는 것을 사용하여, 인스턴스 서버를 생성하고, Docker로 SQL을 설치한 후에 적재하는 방법으로 진행하였다. 저장 방법은 아래의 글에 정리되어있다. 

Oracle Cloud 인스턴스에서 Docker MySQL 사용 (tistory.com)

 

Oracle Cloud 인스턴스에서 Docker MySQL 사용

주가 빅데이터 머신러닝 예측 파이썬 라이브러리를 개발하는 프로젝트에서 주가 빅데이터를 클라우드 데이터베이스에 적재하고, 사용자에게 제공하는 방법을 선택했습니다. 여러 시행착오 끝

agsu.tistory.com

 

 

2.3 라이브러리 개발 

https://github.com/stockAI-py/stockait/tree/main/stockait

 

GitHub - stockAI-py/stockait

Contribute to stockAI-py/stockait development by creating an account on GitHub.

github.com

라이브러리는 크게 

▪️ 데이터 수집

▪️ 데이터 전처리

▪️ 트레이더 객체 정의

▪️ 트레이더 사용(데이터 저장, 모델학습, 평가)

▪️ 수익률 시뮬레이션 (백테스팅) 

와 같이 나뉘어져 있다.

 

특히 트레이더 객체 정의, 트레이더 사용, 수익률 시뮬레이션 부분을 집중적으로 작성하였는데, 고려해야 할 점이 많았고, 아직까지 고민인 부분도 있다. 

 

▪️ 스케일링 문제 

   데이터의 조건 (거래대금 ~ 이상, 종가 변화율 ~이상, CCI ~이상 등의 조건) 을 통해 매수를 결정하는 conditional_buyer는 스케일링 전 데이터가 필요하며, 수익률 계산에도 마찬가지로 원본 종가 데이터가 필요하다. 그래서 원본 데이터와 스케일링 데이터셋을 모두 저장해 놓는 방법을 선택했다. 이는 아래의 고려사항에 이어진다. 

 

▪️ 트레이더 기능의 범위 

 모델 학습부터는 함수를 사용할 때마다 넣어주어야 하는 데이터셋이 모두 달랐다. 예를 들어, 모델학습에는 trainX, trian_classification (이진화), 모델 평가 시각화 할 때는 testX, test_classification (이진화), 수익성 검증 시각화에서는 testX, testY(이진화 전) 이 필요하다. 여기에 스케일링 데이터셋까지 고려한다면, 사용자 입장에서는 함수를 사용하기에 복잡해진다. 따라서 편의를 위해, 트레이더 객체 안에 데이터셋을 저장하는 함수를 생성했다. 이렇게 하면, 함수 안에 트레이더만 넣어주면 되므로 데이터는 고려하지 않아도 된다. 하지만 데이터가 많아지면 차지하는 메모리가 높아지는 문제가 발생하게 되는데, 일반적인 RAM 8GB~32GB인 컴퓨터 사양으로 돌리기에는 역부족이기에, 이 부분은 아직 고려 중이다.

 

 

2.4 pypi 등록 

pypi 등록은 04) pypi 등록하기 글을 참고하였다. 

 

pypi 등록은 생각보다 복잡하지 않았다. 이 과정에서는 사소한 오류 한가지가 있었다.

라이브러리명 오류 

처음에 stockAI로 시작하였다가, stockAir를 거쳐 최종적으로 stockait 라는 이름으로 배포하게 되었다. pypi 사이트에서 찾아보지 않고 이름을 정했다가 동일한 이름이어서 사용하지 못했고, 대문자가 아닌 소문자로 적용하기위해 stockAir를 지우고 stockair로 배포하려다 동일한 이름으로 인식하여 실패했다. (삭제된 라이브러리의 이름은 사용하지 못한다.) 결국엔 우리 라이브러리의 정체성(trader)이 들어가도록 적절하게 지어졌다.🙂 이름 명명규칙은 공식문서에 나와있으니 참고하여 지으면, 깃헙이나 여러 문서에서 바뀐 라이브러리명으로 일일이 바꿔주어야 하는 일이 발생하지 않을 것이니, 이런 사소한 점도 꼼꼼히 살펴보면 좋을 것 같다. 

 

 

2.5 JOSS 논문 등록

 JOSS 논문 등록은 아직 예정 중에 있다. 그 전에 논문은 md, 참고문헌은 bib 파일로 작성하고 업로드하여  JOSS 논문 형식으로 컴파일하여 확인할 수 있는 과정이 필요했다. 우리팀은 github action으로 자동 컴파일하는 것을 선택했다. 다음과 같이 github action 을 사용할 수 있다.

 

JOSS 논문 - github action

 

github action 컴파일 (JOSS 논문)

파이썬 라이브러리 개발을 진행하고, 라이브러리 전용 저널인 JOSS에 논문을 제출하기 위해 github action을 사용해서 컴파일 테스트를 수행해보는 과정이 필요했습니다. 본 글에서는 github action으로

agsu.tistory.com

 

 

 

 


3. 사용 예시 

 위에 있는 github의 stockAI-py/stockAI/tutorials 파일에서 사용 예시를 볼 수 있다. (링크 바로가기)

다만, 영어로 되어있기 때문에 한글 버전 튜토리얼을 블로그에 업로드 하였다.  

 

Data Analysis blog - stockait stockait 사용하여 주가 예측 모델 학습하기 (ag-su.github.io)

 

Data Analysis blog - stockait stockait 사용하여 주가 예측 모델 학습하기

stockait 본 글에서는 직접 개발한 파이썬 라이브러리 stockait 사용법을 정리합니다. stockait는 주가 빅데이터 연구를 위한 통합 라이브러리로, 데이터 수집부터 데이터 전처리, 모델 학습 모델 평가,

ag-su.github.io

 

Data Analysis blog - [stockait] stockait에서 trader의 개념과 사용법 (ag-su.github.io)

 

Data Analysis blog - [stockait] stockait에서 trader의 개념과 사용법

트레이더 정의하기 stockait는 모델학습 과정에서 트레이더라는 개념이 나옵니다. 게임 캐릭터가 장비를 장착하는 것 처럼 하나의 트레이더 안에 모델학습에 필요한 데이터셋을 저장하고, 모델의

ag-su.github.io

 

 

Data Analysis blog - [stockait] stockait 사용하여 주가 예측 머신러닝 모델 실험하기 (ag-su.github.io)

 

Data Analysis blog - [stockait] stockait 사용하여 주가 예측 머신러닝 모델 실험하기

import stockait as sai import pandas as pd 본 글은 stockait 라이브러리를 사용하여 같은 방식으로 전처리한 데이터셋으로 각각 다른 머신러닝 모델을 학습하여 어떤 트레이더의 수익률이 가장 높게 나오는

ag-su.github.io

 

 

Data Analysis blog - [stockait] stockait 사용하여 주가 데이터 표준화 실험하기 (ag-su.github.io)

 

Data Analysis blog - [stockait] stockait 사용하여 주가 데이터 표준화 실험하기

import pandas as pd import stockait as sai 본 글은 같은 트레이더의 조건일 때 네개의 다른 표준화 방법으로 전처리한 데이터셋 중 어떤 데이터셋의 성능이 가장 높게 나오는지 비교 실험을 수행하는 글

ag-su.github.io

 

 

 


4. 마치며 

 이 전에 연구를 진행하여 유의미한 결과를 얻었던 방식을 구조화하여 라이브러리를 개발하는 아이디어였기에, 이미 작성했었던 코드들의 함수화만 하면 금방 완성이 될 줄 알았다. 그런데 생각보다 사용자 입장에서 고려해야 할 사항도 많고, 변수도 많아서 여러 시행착오를 겪었던 프로젝트였습니다. 라이브러리는 처음 개발해봐서 메모리 성능이나, 코드 형식 작성에 미숙함이 분명히 존재했다. 이는 파이썬 공부를 계속 하면서 리팩토링을 지속적으로 고려할 예정이다.  

 

 데이터를 크롤링하고 클라우드 서비스에 적재하는 과정에서 새로 배운 방법(lfs, parquet, 여러 클라우드 서비스)들이 많았다. 또, stockait의 트레이더 구조가 생소했고, 어려웠는데, 이 과정에서는 클래스 코드를 직접 짜보고, 객체와 객체를 연결하는 경험을 하며 객체지향적인 클래스와 함수에 대한 심도깊은 이해를 할 수 있었다. 거의 매주 일요일에 만나서 개발을 진행하였는데, 데이터 수집과 적재, 라이브러리 개발 및 등록, 영어 논문 작성, 이 네가지를 직접 밑바닥부터 수행하고 시행착오를 겪으면서 팀원들과 완성된 결과물을 냈다는 점에서 뿌듯했던 경험이었다.

 

 이후에는 주가 빅데이터를 연구로 투고했던 논문을 직접 개발한 이 라이브러리를 사용하여 구현 해 볼 예정이다. 

 

  

'프로젝트 > 팀 프로젝트' 카테고리의 다른 글

[논문리뷰] AlexNet  (0) 2023.04.05
Comments