백테스트 프로그램을 하나 만들고 있다. 코린이가 혼자 해내기엔 나름 방대한 프로젝트다. 이미 어느 정도 진행은 이루어졌지만, 가는 동안 방향과 위치를 잃어버리지 않도록... 머리 속에만 잠들어 있던 전체 계획을 글과 그림으로 정리해 두는 게 좋겠다.
이 프로그램의 목적은, 매수조건-매도조건-비중관리 등등의 투자전략을 코스피와 코스닥의 과거 데이터에 대입해 시뮬레이션 해보는 것이다.
그러려면 이 프로그램에는 크게 두 가지 기능이 요구된다. ▲모든 종목의 과거 주가를 보유하고 있으면서, 이 데이터에 대한 기술적 분석을 지원하는 여러 보조지표 함수들이 마련되어야 한다. ▲마찬가지로, 모든 종목의 과거 재무정보도 확보되어야 한다.
차트(chart)와 보조지표 함수들은 코딩이 끝났다. 과거 차트 자료는 증권사에서 제공하는 API를 이용해 얻을 수 있었다. 필요할 때마다 읽어올 필요 없도록, csv 파일로 하드디스크에 저장해 두었다. 물론 이 파일들을 업데이트하는 기능도 만들었다. 기술적 분석을 지원할 보조지표 함수들은 이동평균선, MACD, 볼린저밴드, 파라볼릭 SAR, RSI 등이 고려되었지만 필요하다면 다른 것들도 어렵지 않게 구현할 수 있을 것으로 기대한다.
문제는 과거의 재무데이터다. 증권사의 API에서는 최신 정보만 얻을 수 있다. 에프엔가이드 등의 플랫폼 서비스는 접근할 수 있는 시기가 제한적이거나 유료라는 단점이 있다. 그런 제약 조건들을 제거하고 나면 남는 건, 금융감독원이 전자공시시스템(DART)을 통해 제공하는 원본 데이터 뿐이다.
2015년 이후의 비교적 최근 자료들은 open DART 서비스로 API가 개선되면서 쉽게 접근할 수 있다. 다만 이 서비스에서는 2015년 이전 데이터를 제공하지 않는다. 재무제표 원본에 접근하는 방법이 없지는 않다. 데이터가 많이 ugly 하다는 게 흠이라면 흠이다.
따라서 DART 재무정보의 접근은 투 트랙으로 이루어져야 한다. 2015년을 기준으로 최근 자료는 open DART 서비스의 API를 통해 얻을 것이다. 2015년 이전의 자료는 정리되지 않은 원본 데이터라도 구하기로 해야겠다.
------------------------------< 절 취 선 >------------------------------
지금부터는 2015년 이전의 재무데이터를 확보하는 과정을 정리해 보겠다.
종목은 2천 개를 훌쩍 넘는 데다가 종목별로 분기보고서들은 수 십 개에 이르기 때문에, 자료의 개수로만 따지면 수 십만 개가 될 수도 있다. 하지만 전자공시시스템에서는 하나의 IP에서 24시간 내에 접근할 수 있는 자료의 개수를 1만 개로 제한하고 있다. 우리는 최종 자료를 하드디스크에 저장하는 것을 과제로 삼지만, 그 과정에서 파생되는 정보들도 단계별로 저장해야만 할 것이다. 이 점이 납득된다면, 컴퓨터에게 부과해야 할 과제를 모사하기 위해 사람이 재무제표를 열람하는 과정을 따라가 보자.
전체 지도를 단어로 표현하자면 [검색결과 저장 - URL 저장 - 재무제표 저장 - 재무제표 불러오기 - 재무지표 읽기 - 파일로 저장] 으로 요약해볼 수 있다.
전자공시시스템에 접속해 보면 일단, 종목과 원하는 공시를 지정해 검색을 하게 된다. 우리는 이 검색결과를 저장할 수 있다.
이제 원하는 공시를 클릭하면 새로운 창이 나타나면서 공시 내용을 열람할 수 있다. 가령, 재무제표를 보려면 분기/반기/사업보고서 를 찾아야 하는 식이다. 이 페이지의 url 역시 저장해두는 게 좋겠다.
새롭게 열린 이 창에서 연결재무제표, 재무제표 등의 메뉴를 클릭하는 행위는 컴퓨터 입장에서는 그 페이지에 해당하는 새로운 URL을 오픈하는 것과 같다. 이 메뉴 URL을 조립하는 방법도 알아두었기 때문에 역시 모든 종목 모든 보고서 모든 재무제표 메뉴의 URL을 만들어 저장해 둔다.
다음으로는 각각의 URL을 차례대로 열어서, 나타나는 모든 표를 엑셀파일의 각 시트에 나누어 저장한다.
현재 내 위치는 이 정도이다. 이후에 남은 할 일은, 제 각기 엉망으로 저장된 표를 읽어와 사용자가 원하는 재무지표(매출액, 영업이익, 부채총계 등)가 가리키는 숫자를 알아내는 스텝이다.
여기에 성공한다면, 그 모든 숫자들을 다시 파일로 저장해두는 반복작업이 마지막 과정일 것이다. 간단한 예를 들면,
종목명 | 보고서 | 매출액_연결 | 영업이익_연결 | 자산총계_연결 | 매출액_별도 | 영업이익_별도 |
삼성전자 | 2021 Q1 | |||||
삼성전자 | 2020 Q4 | |||||
삼성전자 | 2020 Q3 | |||||
LG화학 | 2021 Q1 | |||||
LG화학 | 2020 Q4 |
이 모든 자료들이 확보된다면, 남은 일은 매수/매도/비중 조건을 담아 백테스트 함수를 이용하는 것 뿐이다.
'투자자 > 알고리즘' 카테고리의 다른 글
개발첫걸음_ 파이썬에서 모든 주식의 차트데이터 저장하기 (0) | 2021.05.15 |
---|---|
개발첫걸음_ 모든 종목의 이름과 종목코드 저장하기 (0) | 2021.05.02 |
파이썬_ numpy array에서 문자열 찾아 바꿔넣기 (0) | 2021.04.26 |
코딩근황_ 사업보고서에서 재무제표 엑셀 바로 다운받기 (2) | 2021.04.22 |
저장된 재무제표를 읽어오려면 (feat. 문자열 유사성 판단하는 로직) (0) | 2021.04.15 |