파이썬으로 만드는 시스템 트레이딩([Crawler]KRX marketdata 에서 거래소에 상장된 종목정보 추출하기)

쓴다 쓴다 해놓고 너무 늦었다...ㅠ.ㅠ
벌써 많이 잊어버렸다...
그래도 더 늦기전에!!!

오늘은 어찌보면 시스템 트레이딩을 하는데 있어서 반드시 필요한 데이터인 시장에 상장된 종목정보를 수집해 오는 방법이다.
반드시 필요하다고 한 이유는 아래와 같다.
  1. 종목정보 중에는 종목 코드가 있는데 이 종목코드가 결국 주가정보, 재무정보 등등을 조회하는데 필수 요소이기 때문이다
  2. 추후에 증권사 API 를 이용해서 거래를 할 수 있는 프로그램을 만들었다고 가정하자. 이때에도 거래를 할 종목코드를 argument 로 넘겨줘야 하기 때문에 꼭 필요하다
아직 직접 맞닥들이진 못했지만 앞으로 더 많은 곳에서 종목코드를 사용하게 될 것으로 보인다. 아무튼!!! 결국 종목코드 때문이다!!! 이 종목코드를 깔끔하게 제공해 주는 곳을 찾기 시작했다. 그 중에 딱 눈에 들어오는 사이트가 있었으니...
역시 KRX 에서 marketdata 라는 이름으로 제공되는 서비스가 있었다.


다른 블로그를 보면 심심찮게 이 사이트를 이용해서 crawling 을 하는 것을 볼 수 있다.
하지만 나에게 필요한 것은 종목정보!!! 찾아가 보도록 하자!!!


자!!! 이렇게 멋지게 제공해 주고 있다. 심지어 CSV 파일로 다운받을 수 있도록!!!
바로 코딩에 들어갔다...하지만 첫번째 난관에 봉착ㅠ.ㅠ
아마도 KRX에서 KOSCOM을 통해서 이 사이트를 개발할 때 jquery 와 ajax 기술을 사용해서 그냥 python 의 request를 통해서 html 을 추출해 내면 알맹이는 쏙 빠진 껍데기만 조회가 되었다.ㅠ.ㅠ
아래는 그 원인을 찾아보려고 Fiddler를 통해 패킷을 캡쳐해서 본 화면이다.

뭔가 이상했다. GenerateOTP.jspx 라는 페이지로 request 가 보내지는 것이며 MKD로 시작하는 numbering 된 jspx 페이지며...
조금 더 검색을 하다보니...ㅎㅎㅎ나보다 먼저 고민하고 이를 해결한 선배가 있었으니...

물론 이 분께서는 시세정보를 수집하기 위해 작성하셨지만 이분이 위의 페이지에 잘 정리를 해 놓으셔서 내가 원하는 페이지에 적용을 할 수 있었다.

아래는 종목정보를 받아오기 위해 작성한 코드이다.




def getStockInfo():
    gen_otp_url = "http://marketdata.krx.co.kr/contents/COM/GenerateOTP.jspx"
    gen_otp_data = {
        'name''fileDown',
        'filetype''csv',
        'url''MKD/04/0406/04060100/mkd04060100_01',
        'market_gubun''ALL',
        'isu_cdnm''전체',
        'isu_cd''',
        'isu_nm''',
        'isu_srt_cd''',
        'sort_type''A',
        'std_ind_cd''01',
        'par_pr''',
        'cpta_scl''',
        'sttl_trm''',
        'lst_stk_vl''1',
        'in_lst_stk_vl''',
        'in_lst_stk_vl2''',
        'cpt''1',
        'in_cpt''',
        'in_cpt2''',
        'isu_cdnm''전체',
        'isu_cd''',
        'mktpartc_no''',
        'isu_srt_cd''',
        'pagePath''/contents/MKD/04/0406/04060100/MKD04060100.jsp',
    }
    code = httpRequest(gen_otp_url, gen_otp_data)
    down_url = 'http://file.krx.co.kr/download.jspx'
    down_data = {
        'code': code,
    }
    response = httpRequest(down_url, down_data)
    dic = dataCleansing(response)
    dataStore(dic)
cs

맨 아래쪽의 dataCleansing은 csv 로 받은 데이터가 의도치 않게 내가 원하지 않는 부분이 있어서 (특히 도로명주소 도입된 후 주소에 콤마가 들어가면서 발생하는 문제가 많음) 이 부분에 대한 처리를 한 것이고 이렇게 정제한 데이터를 저장하도록 한 것이 dataStore 이다

아래는 위의 코드를 통해 저장된 데이터 결과이다.
result of data storing

다음번 포스팅에서는 전자공시 사이트에서 공시정보를 수집하는 것에 대해 정리해 보겠다.




댓글 2개:

  1. No columns to parse from file 그 선배가 풀어놓은 코드를 보면 이런 에러가 나오는데 혹시 발견하셨는지.

    답글삭제
    답글
    1. 어떻게 하셨는데 발생했는지요?? 저는 오류없이 잘 쓰고 있어서요

      삭제

Latest Contents

pytorch installation with GeForce RTX 3050 Ti

 1. Install CUDA toolkit 11.8     ※ WARNING : Please except for "Nsight VSE" to avoid Installation fail.      2. Download cuDNN ( ...

Most viewed