2022년 5월 13일 금요일

주식 프로그램 개발 (1)

주식을 접하는 방법은 그 사람이 처한 환경과 조건에 따라 달리 바라보게 되는 것 같습니다. 

경제 분석을 기반으로 주식 시장을 바라 보는 분들도 있고, 오랜 기간 주식 시장에 있어서 

감각적으로 뛰어난 분들도 많은 것 같습니다.

주식이나, 경제에 대해 아는 것이 별로 없는 프로그램 개발자의 관점에서는 평균, 이동평균, 

표준편차 등으로 표기되는 Chart나 시가, 고가, 저가, 종가, 거래량 등의 데이터로 미래의 주가 예측이 가능한 지 의문이 들었습니다. 

현재 많이 회자되는 AI를 활용한 방법도 그런 예측을 높이고자 하는 방법이겠지만, 개인용 PC 정도의 사양에서 많은 데이터를 학습하는 것이 그리 간단한 일이 아닐 뿐더러, 그 방법이 최적의 해를 구할 수 있는지도 확신할 수 없는 것 같습니다. 

100% 예측이 가능한 방법이 있다면 좋겠지만, 아마도 사람이 심리가 녹아 있고, 변수가 참여한 

사람 수 만큼 많은, 어쩌면 더 많은 조건이 있기 때문에 쉬운 예측은 가능하지 않을 것 같습니다. 

다만, 간단한 통계 데이터로 수치화 된 값이 얼마나 예측의 질을 높일 수 있는지, 아주 조금이라도 예측에 도움이 되는 방법을 찾아보고자 프로그램을 구성해 보고자 합니다. 

1차로 개발하는 프로그램은 다음 정도의 제한을 두고자 합니다.

환경적인 요소는 시스템은 개인 PC 급에서 구동이 가능한 정도로 데이터를 제한 합니다. 

10년에서 20년 정도의 하루 데이터 정도(시가,고가,저가,종가등) 가 사용할 수 있는 한도가 아닐까 합니다.

프로그램은 크게 데이터 수집, 데이터 분석, 가상 트레이딩 의 3가지 큰 항목으로 구성할 

예정 입니다.  ( 아직 구성이 완료되지는 않았지만, 아래의 구성 입니다. )


데이터를 수집하기 위해서는 유료로 데이터를 구입하거나, 증권사 API 를 통해 구하거나, 사이트 데이터를 직접 찾아서 가져오거나, 그 데이터를 자동 Crawling 하는 방법이 있을 것 같습니다. 

가공하기 위한 데이터는 조정된 주가와, 하루 단위의 주식 거래 데이터를 가져 올 수 있어야 합니다.

조정된 주가는  Naver 의 finance.naver.com 의 chart data 를 통해 가져 올 수 있습니다. 

주의해 볼 부분은 예전에 어떤 가격 이었던, 현재 가격을 기준으로 조정해서 가격을 

표기해 주고 있는 부분입니다. 예를 들어 100만원 하던 주식이 액면분할로 5만원이 되면

이전 주식 금액도 현재에 맞춰서 조정한 가격을 표기하는 부분입니다.  이렇게 같은 잣대로

보아야 분석이 용이 할 수 있습니다.   

가격이 100만원인 주식과 만원인 주식을 비교해 더 오를 주식을 찾으려면 가급적 유사한

기준으로 판단할 수 있는 기준이 있어야 합니다.  특히 눈으로 보는 것이 아닌 수치로 해석

하기 위해서는 그런 기준이 있어야 하는데 앞선 글에 언급한 선형회귀의 1차 추세를 활용해

보겠습니다.

기초 데이터는 한국증권거래소의 데이터를 활용합니다. 

증권거래소의 주소는 http://www.krx.co.kr/main/main.jsp 이고, 정보데이터 시스템이 접속하

면 하루단위의 가격, 지수, PBR 자료등을 excel, 혹은 csv 로 다운 받을 수 있습니다. 

아래는 그중 하나를 받는 화면 입니다. 


위의 내용을 다운 받아 데이터를 분해 후 Database 등에 저장하면 해당 데이터를 분석할 수 

있는 원본 데이터를 구성할 수 있습니다. 

수동으로도 할 수 있고, 자동 crawling 할 수 있지만, 해당 데이터는 제공하는 사이트의 상황

에 따라 언제든 사라지거나 변경될 수 있습니다.  테스트 용도의 데이터는 이곳에서 수집하는

데이터로 구성합니다. 

참고로 위 사이트의 파일은 euc-kr (ms949) 의 유니코드 방식을 따릅니다. utf-8 의 방식으로

는 데이터가 정상적으로 파싱 되지 않습니다. ( 현재 개발 트랜드는 utf-8 입니다. )


위 사이트로 부터 원본 데이터를 가져오면, 데이터를 1차 가공 합니다. 

가공의 기준은 이동평균, 표준편차, 1차선형회귀, min, max, median 등의 가장 단순한 통계

입니다.  특히 거래량은 제한 폭이 없기 때문에 중앙값과, min, max 의 값이 중요할 것 같습니다.

5일간 거래량이 100, 101, 100000, 99, 100 일때 평균은 100000 이라는 값에 의해 왜곡이 

일어납니다. 이때 중앙값과, 당일 거래량을 비율로 수치화 하면 outlier 에 해당하는 날과

그 날이 포함된 영역 , 그 기간 이후의 추이 등을 수치화된 값으로 추적해 볼 수 있지 않을까

생각하고 있습니다. 

3일, 5일, 10일, 20일, 30일, 60일, 120일 정도의 데이터는 원본 데이터를 기준으로 먼저

계산을 해 놓습니다.  원본 데이터 수집, 기초 데이터 계산, 계산 데이터 확인 및 재 계산 등을

crawling 항목에서 관리하는 것이 어떨까 합니다  



아직 화면 구성이 안되어 있지만, 위의 Crawling Tab 에서 해당 기능을 수행하도록 구성해 보려 합니다.

현재 화면은 수동으로 구성된 데이터를 로딩하여 각 날짜별로 기초 통계를 보여주는 화면입니다. 

종목수가 조금 다른 이유는 시가총액등 제한을 두고 종목을 로딩하였기에 다르게 나타나고 

있습니다.  준비되면 다른 글에서 해당 내용을 기재하겠습니다. 













댓글 없음:

댓글 쓰기