안녕하세요?


지난주 내내 모의 주식투자를 하면서 거의 1분 단위로 현재가를 체크해서 인공지능이 결정을 내리는데, 일단 지금까지는 두뇌역할을 하는 RLTrader의 수익모델을 만들기 위해서는 주식종목의 '일봉차트'를 가지고 했습니다. 그래서 분단위로 하루종일 감시하라고 해도, 제대로 대응을 못하는 모습을 보여주고 있었습니다. 그래서 이번에는 아예 분봉차트라고 해서, 분단위로 나온 주식종목의 차트가 있습니다. 이 차트를 가지고서 수익모델을 만드는 과정에 들어가려고 합니다. 그러기 위해서는 먼저 키충증권 Open API에서 이 주식의 분봉차트를 가지고 오는 작업이 먼저 필요하다는 생각이 들었습니다.



먼저 Qt Designer를 열어서, 위 스크린샷에서 보이는 것처럼 분봉차트를 가져오기 위한 버튼을 따로 만들어서 저장해 주는 것을 잊지 말도록 합니다.



다음으로는 pytrader.py로 가서, 위 스크린샷처럼 새로 추가된 버튼을 위한 코드를 집어 넣어 주도록 하며, 다음으로는 연결이 된 메서드인 minute_candel_data를 만들어 주러 갑니다. 원래는 candle이 되어야 하는데, 하다보니 오타를 내서 candel이 되었습니다.



일단 메소드 자체는 이전에 일봉차트의 데이터를 키움증권 Open API로 부터 가지고 오는 것과 똑같이 만들어 주는 작업을 하였습니다.  다만 이후부터는 차이가 나기 시작합니다.



먼저 차이점이 있다면, 이전에는 기준일자라고 적힌 부분이 원래는 있는데, 그 부분을 지우고 틱범위라고 바꾸었습니다. 그리고 입력값인 1은 1분 단위를 의미한다고 볼 수 있습니다.




다음으로는 kiwoom.py로 가서, trdata를 받는 곳으로 간 다음에, 여기서 opt10080이라는 TR을 전송해서 서버로 부터 받으면 작동을 하는 코드를 추가해 주도록 합니다. 그리고 이제 연결이 되어 있는 메서드를 만들어 주어야 하는 일이 남아 있습니다.



그리고 하나 잊었는데, 키움증권 서버에서 한번에 보내줄 수 있는 양은 한계가 있어서 언제나 남아 있는 데이터가 있을 수 있는데, 이에 대한 대비도 while문으로 해 주어야 합니다.



그리고 실수로 처음으로 comm_rq_data를 요청하면 남아 있는 데이터가 없기 때문에 0으로 해야 하는데, 2로 해 주었기 때문에, 이를 0으로 바꾸어 주도록 합니다.



그럼 이제는 kiwoom.py로 가서, 한번 opt10080이 오면 나오는 메서드를 만들어서 데이터를 받을 준비를 합니다. 여기서 원래는 일자라고 되어 있는 부분을 체결시간으로 고쳐서 놓기만 하면 되기는 되었습니다.




이제 pytrader를 실행시키고 나서, 종목코드를 입력한 다음, 저장경로를 지정해서 한번 가동시킬 준비를 하도록 합니다.



잠시간의 시간이 지나서 데이터 베이스 파일이 제대로 생성이 되는 것을 볼 수 있었습니다.



마지막으로 데이터 베이스를 열어서, 제대로 종목코드의 데이블이 생성이 된 것을 볼 수 있었습니다. 여기서 가장 과거의 데이터가 가장 위로 가도록 만드는 것도 성공했으며, 이제부터는 고글 코랩을 이용해서 한번 수익모델을 만들어 보는 시도를 하는 과정이 남아 있다는 생각이 듭니다.

  1. 도나곤 2019.03.22 17:31

    저는 왜 분봉데이터가 안받아질까요? 일봉은 잘 받아집니다만.. (주석은 일봉)

    def get_ohlcv(self, code):
    self.kiwoom.ohlcv = {'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}

    self.kiwoom.set_input_value("종목코드", code)
    self.kiwoom.set_input_value("틱범위", 1)
    # self.kiwoom.set_input_value("기준일자", "20190322")
    self.kiwoom.set_input_value("수정주가구분", 1)
    ret = self.kiwoom.comm_rq_data("opt10080_req", "opt10080", 0, "0101")
    # self.kiwoom.comm_rq_data("opt10081_req", "opt10081", 0, "0101")
    time.sleep(0.2)

    df = DataFrame(self.kiwoom.ohlcv, columns=['date', 'open', 'high', 'low', 'close', 'volume'],
    index=self.kiwoom.ohlcv['date'])

    print("ret : ", ret)
    print("ohlcv : ", self.kiwoom.ohlcv)

    =====================> 결과
    ret : None
    ohlcv : {'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}
    Empty DataFrame
    Columns: [date, open, high, low, close, volume]
    Index: []

    • 안녕하세요?

      일이 있어서 이래저래 답변이 늦어졌습니다. 일단...... 혹시 kiwoom.py에 가서 opt10080_req에 대한 메서드를 작성하셨나요?
      일봉차트 받는 것을 참고해서 작성해 놓지 않으면 분봉차트가 받아지지 않습니다.

  2. 학습자 2019.03.23 22:07

    안녕하세요~
    먼저, 상세한 설명 감사합니다^^

    영웅문에서는 대략 6개월 정도의 분차트를 제공하는 것 같은데
    키움증권 api 에서도 동일하게 6개월 정도의 데이터만 제공하나요?

    • 안녕하세요?
      영웅문과는 다르게 키움증권 open api는 잘하면 몇년치까지 제공해 줍니다.

    • 공유합니다~ 2019.04.04 10:53

      안녕하십니까. 키움증권 운영자입니다.
      먼저 키움증권에 관심을 가져주시고 이용해주시는 고객님께 감사 인사드립니다.

      OpenAPI도 영웅문과 동일한 차트데이터를 이용하기 때문에 분봉데이터는 영업일 기준 최대 160일치를 사용하실수 있습니다.


      감사합니다.

+ Recent posts