파이썬자동주식매매프로그램

ATS) 키움증권 로그인하기(3) - 가격 정보(일봉) 얻어 오기, 예수금 얻어 오기

Kanten no jiu 2023. 1. 8. 02:42

가격 정보(일봉) 얻어 오기

키움증권 API 서버에 전달하는 요청 단위를 TR이라고 하는데,
TR을 호출하려면 CommRqData() 함수를 사용해야 한다. 

키움 KOA 개발가이드
CommRqData Method

주식일봉조회(OPT10081) - KOA TR목록에서 TR이름을 찾을 수 있음.
OPT10081 TR의 응답으로 일자, 시가, 고가, 저가, 현재가, 거래량의 데이터를 가져올 수 있음.

TR요청에 대한 응답 슬롯 추가

#kiwoom.py
def _set_signal_slots(self):
    # TR의 응답 결과를 _on_receive_tr_data를 통해 받도록 설정
    self.OnReceiveTRData.connect(self._on_receive_tr_data)

_on_receive_tr_data는 모든 TR에 대한 응답을 받을 수 있는 함수

#TR별로 데이터 가져오기
    def _on_receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
        "TR조회의 응답 결과를 얻어오는 함수"
        print("[Kiwoom] _on_receive_tr_data is called {} / {} / {}".format(screen_no, rqname, trcode))
        tr_data_cnt = self.dynamicCall("GetRepeatCnt(QString, QString)", trcode, rqname)

        if next == '2':
            self.has_next_tr_data = True
        else:
            self.has_next_tr_data = False

        if rqname == "opt10081_req":
            ohlcv = {'date': [], 'open': [], 'high': [], 'low': [], 'close': [], 'volume': []}

            for i in range(tr_data_cnt):
                date = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "일자")
                open = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "시가")
                high = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "고가")
                low = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "저가")
                close = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "현재가")
                volume = self.dynamicCall("GetCommData(QString, QString, int, QString", trcode, rqname, i, "거래량")

                ohlcv['date'].append(date.strip())
                ohlcv['open'].append(int(open))
                ohlcv['high'].append(int(high))
                ohlcv['low'].append(int(low))
                ohlcv['close'].append(int(close))
                ohlcv['volume'].append(int(volume))

키움API는 1초에 최대 5회의 요청만 허용하기 때문에 time추가

self.tr_event_loop.exit() #TR요청을 보내고 응답을 대기시키는 데 사용하는 self.tr_event_loop를 종료시킴
time.sleep(0.5) #0.5초 대기

 

앞 코드에서  일봉 데이터는 ohlcv 딕셔너리에 저장되어있다..!

이 데이터를 DataFrame으로 만들면 더 쉽게 활용할 수 있기 때문에 pandas 패키지를 사용

Anaconda 가상환경에 pandas 설치

pip install pandas

get_price_data는 가격 정보를 얻어오는 함수

    def get_price_data(self, code):
        self.dynamicCall("SetInputValue(QString, QString)", "종목코드", code)
        self.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", "1")
        self.dynamicCall("CommRqData(QString, QString, int, QString)", "opt10081_req", "opt10081", 0, "0001")

        self.tr_event_loop.exec_()

        ohlcv = self.tr_data

        while self.has_next_tr_data:
            self.dynamicCall("SetInputValue(QString, QString)", "종목코드", code)
            self.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", "1")
            self.dynamicCall("CommRqData(QString, QString, int, QString)", "opt10081_req", "opt10081", 2, "0001")
            self.tr_event_loop.exec_()

            for key, val in self.tr_data.items():
                ohlcv[key] += val

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

        return df[::-1]

 

중간 점검으로  main.py에서 삼성전자(005930)의 일봉 정보를 출력해보기!

#main.py
from api.Kiwoom import *
import sys

app = QApplication(sys.argv)
kiwoom = Kiwoom()

df = kiwoom.get_price_data("005930")
print(df)

app.exec_()

실행을 하면...

main.py 출력결과

행(row)에는 시간기준 과거부터 최근까지 오름차순

열(column)에는 시가(open), 고가(high), 저가(low), 종가(close), 당일 거래량(volume) 순서로 데이터를 받아오는 것을 알 수 있다.

 

 

1985년도에 삼성전자주가를 샀더라면...

 


예수금 얻어 오기

예수금이란 증권사가 예비로 수령한 자금으로, 계좌에 보유 중인 현금을 의미한다.
예수금 정보를 알아야 종목당 얼마를 매수할지 결정할 수 있다.

def get_deposit(self)는 조회 대상 계좌의 예수금을 얻어 오는 함수

def get_deposit(self): ------ 조회 대상 계좌의 예수금을 얻어 오는 함수 
    self.dynamicCall("SetInputValue(QString, QString)", "계좌번호", self.account_number)
    self.dynamicCall("SetInputValue(QString, QString)", "비밀번호입력매체구분", "00")
    self.dynamicCall("SetInputValue(QString, QString)", "조회구분", "2")
    self.dynamicCall("CommRqData(QString, QString, int, QString)", "opw00001_req", "opw00001", 0, "0002")

    self.tr_event_loop.exec_()
    return self.tr_data

main.py를 실행하면

#main.py
from api.Kiwoom import *
import sys

app = QApplication(sys.argv)
kiwoom = Kiwoom()

deposit = kiwoom.get_deposit()

app.exec_()

10,000,000 찍히는 것을 볼 수 있다.