제 프로젝트는 사용자가 특정 차트를 고르면, 코스피 코스닥 전 종목의 과거(10년) 차트들을 모두 탐색하여 가장 유사한 차트 10개 정도를 골라 사용자에게 보여주는 것이 목표입니다.
비슷한 차트 검색기
전 종목의 최근 10년간 모든 차트를 탐색합니다. 내 종목의 차트는 과연 상승하는 차트일까요?
www.similarchart.com
모든 것을 자동화해 보자
데이터 흐름
1. 종목 리스트 업데이트
맨 처음에는 코스피와 코스닥(미국은 NYSE와 NASDAQ)의 최신 종목 리스트를 불러와 기존 데이터베이스에 있는 종목 리스트와 비교하고 달라진 부분이 있으면 업데이트합니다.
code
: 종목코드name
: 종목명ranking
: 시가총액 순위valid
: 해당 종목에 관해 어떠한 오류라도 있으면 0industry
: 업종
- 종목코드를 제외한 종목명, 시가총액 순위, 업종은 변경의 여지가 있기 때문에 매일 최신 데이터를 받을 때마다 달라진 부분이 있는지 체크한 후 갱신합니다.
2. 주가 데이터 업데이트
코스피와 코스닥은 FinanceDataReader
라이브러리, NYSE와 NASDAQ은 yfinance
라이브러리를 사용해 최신일자의 주가 데이터를 불러와 기존 데이터베이스에 업데이트합니다.
- 한국은 price들에 소수점이 없기 때문에 int, 미국은 소수점이 있어 float으로 설정합니다.
- 데이터베이스가 비어있는 초기 상태면 원하는 만큼의 N연차 데이터를 모두 불러와 저장하고, 데이터베이스에 데이터가 있는 상태면 최신 데이터만 추가합니다.
- 여기서 주의할 점이 있습니다. 주가는 어느 날 갑자기 수정될 수 있습니다. 제가 알기로는 유상증자, 무상증자, 액면분할, 병합등의 이유로 가격이 수정되는 경우가 있습니다. 주가가 수정된 것이 감지되면 기존 데이터베이스에 있던 해당 종목의 모든 주가 데이터를 갱신해 줍니다.
- 또한 지정된 기한(11년)이 지난 주가 데이터는 삭제해 줍니다.
- 한국은 약 350만 개, 미국은 약 750만 개의 데이터가 있습니다.
3. 각 종목별 비슷한 차트 업데이트
모든 종목 각각의 최신 일자의 주가 데이터를 포함하는 차트와 비슷한 과거 차트를 업데이트합니다.
base_stock_code
: 비교 기준이 되는 종목의 코드base_date
: 비교 기준이 되는 종목의 기준날짜compare_stock_code
: 비교 기준과 비슷한 차트를 가진 종목의 코드compare_date
: 비교 기준과 비슷한 차트를 가진 종목의 기준날짜distance
: 유사도의 반대개념after_close_change
: 향후 주가 변동률
- 전 종목의 과거(10년) 차트를 탐색하여 비슷한 차트를 10개를 고릅니다.
- 비슷한 차트를 여러 개 찾았을 때, 같은 종목인데 서로 날짜만 하루씩 차이 나는 것을 방지합니다.
- 테이블은 8개가 있는데, N(8, 16, 32, 64) 일치 비교, 한국/미국시장 2가지를 기준으로 수평 분할(파티셔닝)된 테이블입니다.
- 최대 1달치의 데이터를 저장합니다. 한 테이블에 한국은 약 300만 개, 미국은 약 700만 개의 데이터가 있습니다.
- 이 부분이 시간이 너무 오래 걸려 더 효율적인 알고리즘, 최적화등을 연구 중입니다.
4. 통계 테이블 업데이트
빠른 데이터 제공을 위해 통계 데이터들을 업데이트합니다.
code
: 종목코드date
: 기준날짜average_Nday
: N일치를 비교한 비슷한 차트들의 향후 평균 주가 변동률average_all
: average_Nday의 평균rise_count
: 비슷한 차트들 중 향후 주가가 상승한 데이터의 개수ranking
: average_all을 기준으로 한 순위
average_Nday를 계산할 때 10개 중 max와 min을 제외한 8개의 절사평균을 사용합니다.- 비슷한 차트들이 가장 상승률이 좋은 종목 등을 제공하거나 특정 종목의 순위 등을 제공하기 위해 사용합니다.
결론
사용자의 요청을 받을 때마다 비슷한 차트를 골라내는 것은 너무 응답시간이 길어 미리 데이터를 준비한 후, 저장되어 있는 데이터를 응답하는 방식을 선택했습니다. 하지만, 미리 데이터를 준비하는 과정도 시간이 너무 오래 걸려 시간을 줄일 방법을 연구 중입니다.
데이터베이스 설계도 처음 해보는 거라 저렇게 하는 것이 맞나 모르겠네요. 일단 목표하는 수준까지 프로젝트를 진행 후에 고쳐야 할 부분이 있으면 고쳐야겠습니다.
'프로젝트' 카테고리의 다른 글
7. Redis(레디스)의 유용한 기능 - 도커 컨테이너간 정보공유 (0) | 2024.02.17 |
---|---|
6. 파이썬 메모리 관련 주의할 점과 matplotlib 메모리누수 문제 (0) | 2024.02.17 |
비슷한 차트 탐색 프로젝트 - 4. AWS를 사용해서 배포해보자 (0) | 2024.02.17 |
비슷한 차트 탐색 프로젝트 - 3. 프로젝트를 Docker로 구성해보자 (0) | 2024.02.17 |
비슷한 차트 탐색 프로젝트 - 2. Flask, Django, Spring 어떤걸 쓸까? (0) | 2024.02.17 |