안녕하세요 JeTech입니다.
지난번 강화학습을 통한 트레이딩 시스템 설계를 이야기했었는데요.
이번에는 구현 첫 단계로 데이터를 수집하는 부분을 구현했습니다.
8월이 되기도 해서 글 마무리에는 7월 알고리즘 종목들에 대한 수익률도 분석해 보도록 하겠습니다.
무엇을 위한 데이터인가
데이터 수집을 하기 전
최종적으로 어떤 AI를 위해 데이터를 수집하는지 생각해보아야 합니다.
저는 경제 구조를 Top-Down 방식으로 접근해서
각 단계별 필요한 AI들을 사용할 예정입니다.
거시적 관점에서 올웨더 전략에 기반한 자산배분에 최적의 자산배분비율을 강화학습으로 학습합니다.
그중 주식 비중에 대해서 주식 종목을 선정할 때
최근 시장의 선호도를 반영하여 종목을 추천하는 추천 AI를 만들어야 합니다.
단기적인 관점에선 지수, 종목 등 단일 상품 가격 시계열에서
특정 구간에서 방향성의 정도를 예측하는 AI도 필요합니다.
이번엔 필요한 데이터를 수집하기 위한 시스템을 구축하고
필요한 데이터들은 대략적으로 수집 후 모델을 학습 설계하면서 필요한 데이터들은 추가하기로 했습니다.
기본적으로 강화학습을 바탕으로 거시경제를 바라보기 때문에
강화학습에서의 환경, 상태를 데이터로 가지고 있어야 합니다.
제가 적용하려는 분야의 환경은 말 그대로 시장이 될 수 있습니다.
각 자산들의 가격들이 상태를 나타내고 매수, 매도라는 행동과 수익과 손실이라는 보상이 주어집니다.
강화학습에서 많이 쓰이는 그림입니다.
이제 상태 데이터로 자산별 가격을 미증시에 상장되어 있는 자산 가격과 연동된 ETF들의 가격, 가격 파생데이터들을 수집해 보도록 하겠습니다.
데이터수집
이전에 설명했던 것처럼 AWS Stepfunction들을 설계하고
수집역할은 python 3.9 환경을 기본으로 하는 lambda 리소스를 생성하고
가격데이터는 yahoo finance 라이브러리에서 쉽게 제공받을 수 있었습니다.
거시적으로 자산들의 가격을 수집하고
개별 주식 종목들의 데이터들도 수집해야 합니다. 이 부분은 한국투자증권 API를 통해 연동받을 예정입니다.
간단하게 Stepfunction을 설계해 보았습니다.
전체적인 데이터 처리 작업들이 Airflow Dag처럼 도식화되는데 데이터의 순차적인 처리가 눈에 쉽게 들어옵니다.
작업이 시작되면 Batch Job을 선택하게 했습니다.
거시경제 자산 데이터들을 수집하는 SectorDataCollect
개별주식 데이터들의 펀더멘털 데이터들을 수집하는 StockFundamentalCollect들입니다.
개별주식 데이터수집은 병렬처리 적용했습니다. LambdaCaller 함수가 먼저 호출되고
해당 함수가 병렬처리할 Lambda를 호출해서 데이터를 효율적으로 수집합니다.
Stepfunction에서 Map 작업을 지원해주기도 했는데
그냥 직관적으로 Lambda를 Linear 하게만 증가시켜도 될 것 같아서 학습곡선을 고려하여 개발했습니다.
AWS를 통한 개발은 SAM cli를 적극 활용합니다.
AWS에 다양한 기능들이 제공되다 보니 여러 기능들을 조합해서 사용해야 하는 경우가 많은데
관리가 되지 않을 경우 쓰지 않는 리소스가 생기거나 복잡해지기도 합니다.
sam은 aws에서 사용하는 여러 리소스를 프로젝트 단위로 구성한 CloudFormation을 만들어줍니다.
이번 프로젝트도 Sam을 활용해서 개발을 했습니다.
개발을 진행하고 수정할 때마다 Sam에서 AWS에서 어떤 리소스들이 추가되어야 하고 반납되는지 정리해 주어서 간편하고
필요한 리소스들도 template.yaml 파일에 작성하면 간단하게 생성 가능합니다.
배포가 진행되면 해당 CloudFormation내에 Stepfunction 실행에 필요한 리소스들이 생성됩니다.
저는 데이터를 수집하고 S3에 업로드하는 방식으로 Lambda를 작성했습니다.
Events Rule 리소스는 주기적으로 Batch Job을 실행시켜 주는 스케줄러역할을 합니다.
데이터 조회
S3에 업로드하는 데이터는 단순한 csv 파일입니다. 비개발자들은 직접 로컬 pc에서 데이터를 조회할 수 있고
개발자들은 S3에 적재된 데이터를 AWS Athena를 통해서 SQL을 통해 익숙하게 조회할 수 있습니다.
DataCatalog에 테이블을 직접 추가해 주어도 되고 Glue crawler를 사용해도 됩니다.
간단히 자산들의 일자별 가격데이터들을 적재했습니다.
S3에 적재한 데이터들을 RDB 사용하듯 조회할 수 있게 되었습니다.
여기에 올린 데이터들은 추후에 강화학습을 위한 학습데이터로 사용되거나
시장 데이터 분석을 위해 잘 사용될 수 있을 것 같습니다.
7월 주식 데이터 리뷰
지난달에 처음으로 매수 종목들을 공개했었습니다.
7월 한 달간 데이터들의 흐름이 어떻게 되었는지 공유드리고 개선점에 대해서도 살펴보겠습니다.
7월 매수 종목들에 대한 수익률 그래프입니다.
별도 AI가 내려준 데이터는 아니고 간단한 데이터 마이닝을 통해 일부 특성 구간 데이터들을 필터링한 알고리즘을 통해 선정된 종목들입니다.
7월 코스피가 2.6% 정도 상승했는데 선정한 주식들은 -1% 정도 수익인 것으로 보면
선정했던 모멘텀 주도섹터들이 변경되었던 건 아닌가 아쉬움이 듭니다.
7월은 이차전지 관련 종목들을 비롯해 등락이 조금 심하기도 했고
외국인들과 기관 공매도 대금도 많이 변경되기도 했습니다.
7월 VIX 지수를 한번 살펴보았습니다.
아래 파란 선이 VIX 지수이고 주황선은 대략적인 주식데이터들의 흐름인데 서로 상반되거나
VIX 자체가 시장참여자들의 공포지수이기 때문에 어느 정도 시장을 선행하여 반영하기도 하는 모습을 보이고 있습니다.
오늘 데이터를 수집하는 과정을 소개하면서
자산, 주식 섹터별 가격데이터를 수집했었는데요
가격데이터 외에 VIX처럼 시장이란 환경에서 상태로 이해할 수 있는 데이터들도 중요하게 작용할 수 있습니다.
강화학습 에이전트들이 VIX와 주가의 상관관계를 풀어줄 수도 있지 않을까 긍정적으로 생각해 볼 수 있습니다.
이 외에도 CPI, inflation 지표 등 시장 상태에 영향을 주거나 시장 상태를 판단할 수 있게 해 주는 다양한 데이터들도 수집해 보도록 하겠습니다.
감사합니다.
'Data & AI' 카테고리의 다른 글
강화학습 트레이딩 4. 논문과 유전알고리즘으로 성능 개선 (3) | 2023.08.27 |
---|---|
강화학습 트레이딩 3. 강화학습 (0) | 2023.08.14 |
트레이딩에 AI를 적용하기위한 준비 (1) | 2023.05.26 |
주식 데이터 분석과 Support Vector Machine 투자 모델 백테스트 (3) | 2023.05.07 |
AI 알고리즘 투자 - 몸풀기 (1) | 2023.05.03 |