실시간 체결 데이터를 처리하는 방법: 키움증권 OpenAPI를 활용한 예제
이 글에서는 키움증권 OpenAPI를 사용하여 실시간으로 주식의 체결 데이터를 처리하는 방법에 대해 설명합니다. 해당 코드에서는 주식의 실시간 체결 정보를 받아와 출력하는 과정을 다룹니다.
1. Kiwoom 클래스 개요
Kiwoom 클래스는 키움증권의 API와 상호작용하는 핵심 클래스입니다. 이 클래스는 OpenAPI의 다양한 함수 호출을 통해 실시간 체결 데이터, 주문, 잔고 조회 등과 같은 기능을 제공합니다.
class Kiwoom(QAxWidget):
# 초기설정 함수
def __init__(self):
super().__init__()
self._make_kiwoom_instance()
self._set_signal_slots()
self._comm_connect()
self.account_number = self.get_account_number()
self.tr_event_loop = QEventLoop()
self.order = {}
self.balance = {}
self.universe_realtime_transaction_info = {}
- __init__: 초기화 메서드로, API 연결과 신호 슬롯을 설정하며 로그인 요청을 보냅니다.
- self.universe_realtime_transaction_info: 실시간 체결 정보를 저장하는 딕셔너리입니다.
2. 실시간 체결 데이터를 수신하는 부분
실시간 데이터를 수신하려면, 먼저 관심 있는 종목들에 대해 실시간 데이터를 등록하는 과정이 필요합니다. 이는 set_real_reg 메서드를 사용합니다.
def set_real_reg(self, str_screen_no, str_code_list, str_fid_list, str_opt_type):
self.dynamicCall("SetRealReg(QString, QString, QString, QString)", str_screen_no, str_code_list, str_fid_list, str_opt_type)
time.sleep(0.5)
- str_screen_no: 화면 번호로, 여러 종목의 데이터를 수신할 때 충돌을 방지하는 역할을 합니다.
- str_code_list: 실시간 데이터를 수신할 종목 코드들의 리스트입니다. 종목 코드는 세미콜론(;)으로 구분합니다.
- str_fid_list: 수신할 데이터 항목의 코드입니다. 예를 들어, "체결시간", "현재가", "거래량" 등의 데이터 항목을 의미합니다.
- str_opt_type: 등록 옵션으로, 0은 등록된 데이터에 덮어쓰기를 허용하고, 1은 기존 등록 데이터를 유지합니다.
3. 실시간 체결 데이터 수신 처리
실시간 데이터가 수신되면, OnReceiveRealData 이벤트 핸들러가 호출되어 데이터를 처리합니다.
def _on_receive_real_data(self, s_code, real_type, real_data):
if real_type == "주식체결":
signed_at = self.dynamicCall("GetCommRealData(QString, int)", s_code, get_fid("체결시간"))
close = self.dynamicCall("GetCommRealData(QString, int)", s_code, "현재가")
close = abs(int(close))
high = self.dynamicCall("GetCommRealData(QString, int)", s_code, "고가")
high = abs(int(high))
open = self.dynamicCall("GetCommRealData(QString, int)", s_code, "시가")
open = abs(int(open))
low = self.dynamicCall("GetCommRealData(QString, int)", s_code, "저가")
low = abs(int(low))
top_priority_ask = self.dynamicCall("GetCommRealData(QString, int)", s_code, "(최우선)매도호가")
top_priority_ask = abs(int(top_priority_ask))
top_priority_bid = self.dynamicCall("GetCommRealData(QString, int)", s_code, "(최우선)매수호가")
top_priority_bid = abs(int(top_priority_bid))
accum_volume = self.dynamicCall("GetCommRealData(QString, int)", s_code, "누적거래량")
accum_volume = abs(int(accum_volume))
# 데이터 출력
print(s_code, signed_at, close, high, open, low, top_priority_ask, top_priority_bid, accum_volume)
이 함수는 실시간으로 체결된 데이터를 처리하는 핵심 부분입니다. 아래는 주요 데이터 항목에 대한 설명입니다.
- 체결시간(signed_at): 해당 종목의 체결이 발생한 시간입니다.
- 현재가(close): 실시간으로 체결된 현재가를 받아옵니다.
- 시가(open), 고가(high), 저가(low): 각각 당일의 시가, 고가, 저가 정보를 가져옵니다.
- 최우선 매도호가(top_priority_ask), 최우선 매수호가(top_priority_bid): 최우선으로 매도 및 매수되는 호가를 나타냅니다.
- 누적거래량(accum_volume): 현재까지의 누적 거래량을 나타냅니다.
해당 데이터는 dynamicCall 메서드를 통해 키움 API에서 호출하며, 각 값은 abs() 함수를 사용하여 절대값으로 변환됩니다. 이는 주가 데이터가 음수로 표시되는 경우를 방지하기 위함입니다.
4. 실시간 데이터 처리 후 저장
실시간으로 수신한 데이터를 self.universe_realtime_transaction_info 딕셔너리에 저장하여, 나중에 사용할 수 있도록 합니다.
if s_code not in self.universe_realtime_transaction_info:
self.universe_realtime_transaction_info.update({s_code: {}})
self.universe_realtime_transaction_info[s_code].update({
"체결시간": signed_at,
"시가": open,
"고가": high,
"저가": low,
"현재가": close,
"(최우선)매도호가": top_priority_ask,
"(최우선)매수호가": top_priority_bid,
"누적거래량": accum_volume
})
이렇게 함으로써, 특정 종목에 대해 최신 체결 정보를 계속해서 업데이트할 수 있습니다.
5. 전체 실행 예제
마지막으로 실시간 데이터를 수신하는 전체 흐름을 실행하는 예제입니다.
# 실시간 데이터 받기
fids = get_fid("체결시간")
codes = '005930;007700;000660;'
kiwoom.set_real_reg("1000", codes, fids, "0")
app.exec_()
이 코드는 삼성전자(005930), 이수페타시스(007700), SK하이닉스(000660) 종목에 대해 실시간 체결 데이터를 등록하고, OnReceiveRealData 이벤트가 발생할 때마다 데이터를 받아와 처리합니다.
결론
위 코드와 설명을 통해 키움증권 OpenAPI를 사용하여 실시간으로 주식의 체결 데이터를 수신하고 처리하는 방법을 알아보았습니다. 실시간 데이터를 통해 거래 전략을 실행하거나, 주식 매매를 자동화하는 프로그램을 개발할 수 있습니다. 이와 같은 방식으로 다양한 데이터 항목을 추가하여 분석의 정확도를 높일 수 있습니다.