카테고리 없음

[Python] 키움증권 API를 사용한 예수금 조회 코드 설명

indigenthuman 2024. 9. 7. 14:42

키움증권 API를 사용한 예수금 조회 코드 설명

이번 포스팅에서는 키움증권 Open API를 사용하여 예수금을 조회하는 방법을 설명합니다. 예수금은 주식 거래에 있어서 중요한 요소로, 매매 가능한 자금의 금액을 의미합니다. 이를 조회하기 위해서는 **Kiwoom OpenAPI+**를 활용할 수 있으며, 이를 통해 간편하게 정보를 가져올 수 있습니다.

아래는 키움 API를 사용한 예수금 조회 코드를 포함한 전체적인 흐름을 설명합니다.


주요 코드 구조

from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import pandas as pd

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()

    # 키움 API 연결 인스턴스 생성
    def _make_kiwoom_instance(self):
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    # 시그널 슬롯 설정
    def _set_signal_slots(self):
        self.OnEventConnect.connect(self._login_slot)
        self.OnReceiveTrData.connect(self._on_receive_tr_data)

    # 로그인 성공 여부 처리
    def _login_slot(self, err_code):
        if err_code == 0:
            print("Login successful")
        else:
            print("Login failed")
        self.login_event_loop.exit()

    # 로그인 요청
    def _comm_connect(self):
        self.dynamicCall("CommConnect")
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

    # 계좌번호 조회
    def get_account_number(self):
        account_list = self.dynamicCall("GetLoginInfo(QString)", "ACCNO")
        account_number = account_list.split(';')[0]
        return account_number

    # 예수금 조회 요청
    def get_deposit(self):
        self.dynamicCall("SetInputValue(QString, QString)", "계좌번호", self.account_number)
        self.dynamicCall("SetInputValue(QString, QString)", "비밀번호입력매체구분", "00")
        self.dynamicCall("SetInputValue(QString, QString)", "조회구분", "1")
        self.dynamicCall("CommRqData(QString, QString, int, QString)", "opw00001_req", "opw00001", 0, "2000")

        self.tr_event_loop.exec_()

    # TR 데이터 수신 처리
    def _on_receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
        if rqname == "opw00001_req":
            deposit = self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, 0, "주문가능금액")
            deposit = int(deposit.strip())
            print(f"Available deposit: {deposit}")
            self.tr_event_loop.exit()

# 키움 API와 연결
app = QApplication([])
kiwoom = Kiwoom()

# 예수금 조회
kiwoom.get_deposit()

주요 코드 설명

1. Kiwoom 클래스 초기화

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()
  • 클래스가 초기화되면 API 인스턴스 생성, 시그널 슬롯 설정로그인 요청을 처리합니다.
  • QEventLoop()는 데이터를 요청할 때 이벤트 루프가 끝날 때까지 대기하는 데 사용됩니다.

2. API 인스턴스 생성

def _make_kiwoom_instance(self):
    self.setControl("KHOPENAPI.KHOpenAPICtrl.1")
  • 키움 API와의 연결을 위한 인스턴스를 생성하는 함수입니다.

3. 시그널 슬롯 설정

def _set_signal_slots(self):
    self.OnEventConnect.connect(self._login_slot)
    self.OnReceiveTrData.connect(self._on_receive_tr_data)
  • API와 연결되거나 데이터를 수신할 때 호출되는 이벤트에 대한 슬롯을 설정합니다.
  • OnEventConnect는 로그인 이벤트를, OnReceiveTrData는 조회 요청의 결과 데이터를 받을 때 사용됩니다.

4. 로그인 요청 및 처리

def _comm_connect(self):
    self.dynamicCall("CommConnect")
    self.login_event_loop = QEventLoop()
    self.login_event_loop.exec_()
  • 로그인 요청을 보냅니다. 요청 후 이벤트 루프가 실행되어 로그인 과정이 완료될 때까지 대기합니다.

5. 계좌번호 조회

def get_account_number(self):
    account_list = self.dynamicCall("GetLoginInfo(QString)", "ACCNO")
    account_number = account_list.split(';')[0]
    return account_number
  • 로그인 후 계좌 번호를 가져오는 함수입니다. 반환된 계좌 목록 중 첫 번째 계좌를 사용합니다.

6. 예수금 조회 요청

def get_deposit(self):
    self.dynamicCall("SetInputValue(QString, QString)", "계좌번호", self.account_number)
    self.dynamicCall("SetInputValue(QString, QString)", "비밀번호입력매체구분", "00")
    self.dynamicCall("SetInputValue(QString, QString)", "조회구분", "1")
    self.dynamicCall("CommRqData(QString, QString, int, QString)", "opw00001_req", "opw00001", 0, "2000")

    self.tr_event_loop.exec_()
  • SetInputValue 함수를 통해 필요한 입력값을 설정하고, CommRqData로 조회 요청을 전송합니다.
    • 계좌번호: 로그인된 사용자의 계좌번호.
    • 비밀번호입력매체구분: PC에서는 "00".
    • 조회구분: 1 (추정 예수금 조회).
  • 요청이 완료되기 전까지 이벤트 루프에서 대기합니다.

7. TR 데이터 수신 처리

def _on_receive_tr_data(self, screen_no, rqname, trcode, record_name, next, unused1, unused2, unused3, unused4):
    if rqname == "opw00001_req":
        deposit = self.dynamicCall("GetCommData(QString, QString, int, QString)", trcode, rqname, 0, "주문가능금액")
        deposit = int(deposit.strip())
        print(f"Available deposit: {deposit}")
        self.tr_event_loop.exit()
  • 데이터 요청 후 수신된 데이터를 처리합니다.
  • opw00001_req라는 rqname은 예수금 조회 요청의 응답임을 의미합니다.
  • GetCommData를 사용하여 예수금 정보를 가져온 뒤 출력합니다.

8. 실행결과

main.py함수를 실행해보면 다음과 같이 예수금이 출력되는걸 알 수 있습니다.

 


결론

위 코드를 통해 키움증권 OpenAPI+를 활용하여 예수금 조회를 할 수 있습니다. 이는 주식 거래를 시작하기 전에 필요한 자금을 확인하는 중요한 단계입니다. API를 통해 데이터를 자동으로 가져오고 처리하는 과정을 이해하고 활용할 수 있습니다.

해당 코드는 예수금 외에도 다양한 정보를 조회하는 데 활용될 수 있으며, 추후 이를 확장하여 자동 매매 시스템이나 자산 관리 시스템에 통합할 수 있습니다.