파이썬 자동매매 개발, 키움증권 API, 이벤트 처리

안녕하세요, 오늘은 파이썬을 사용하여 자동매매 시스템을 개발하는 방법, 특히 키움증권 API를 활용하는 방법에 대해 자세히 설명하겠습니다. 자동매매 시스템은 주식 거래의 알고리즘을 자동으로 실행하여 수익을 올리기 위한 프로그램입니다. 이 강좌에서는 기본적인 설치부터 이벤트 처리와 API 사용법까지 심도 깊은 내용을 다룰 예정입니다.

1. 키움증권 API 준비하기

키움증권의 API를 사용하여 자동매매를 구현하기 위해서는 먼저 API 키를 발급받아야 합니다. 이어지는 단계는 다음과 같습니다:

  • 키움증권 홈페이지에 로그인하고, API 사용자 등록을 합니다.
  • API 키를 발급받고, 필요한 라이브러리를 설치합니다.

1.1 라이브러리 설치

키움증권 API는 윈도우 환경에서 동작하기 때문에, 먼저 파이썬과 PyQt5를 설치해야 합니다. 이는 UI를 구성하기 위한 필수 패키지입니다.

pip install PyQt5

그 다음, 키움증권 오픈 API를 다운로드하여 설치하면 됩니다. API는 키움증권 홈 페이지에서 찾을 수 있습니다.

2. 키움증권 API 로그인

API를 통해 우선 키움증권에 로그인이 필요합니다. 아래 코드는 사용자 로그인을 처리하는 예제입니다.

import win32com.client
import pythoncom
import time

class Kiwoom:
    def __init__(self):
        self.api = win32com.client.Dispatch("KHOPENAPI.KHOpenAPICtrl.1")
        self.login()

    def login(self):
        self.api.CommConnect()
        while self.api.GetConnectState() == 0:
            time.sleep(1)

kiwoom = Kiwoom()

위 코드는 키움증권에 로그인을 하고 연결 상태를 확인하는 역할을 합니다. 로그인 후에는 원하는 정보를 가져올 수 있습니다.

3. 이벤트 처리

이벤트 처리는 자동매매 시스템의 핵심입니다. 특정 이벤트가 발생했을 때 해당 이벤트에 대해 적절한 작업을 처리할 수 있게 해줍니다.

3.1 주문 이벤트

주문을 발송하거나 상태를 확인하기 위해서는 이벤트 핸들러를 지정해야 합니다. 다음은 주문 이벤트를 처리하는 코드입니다.

class Kiwoom:
    def __init__(self):
        self.api = win32com.client.Dispatch("KHOPENAPI.KHOpenAPICtrl.1")
        self.api.OnEventConnect.connect(self.on_event_connect)

    def on_event_connect(self, err_code):
        if err_code == 0:
            print("로그인 성공")
        else:
            print("로그인 실패")

    def send_order(self, order_type, code, qty, price, price_type):
        order = self.api.SendOrder("주문명", "5000", self.api.GetAccList()[0], order_type, code, qty, price, price_type, "")
        return order

위 함수는 주문을 발송하는 역할을 하며, 주문 성공 여부는 반환값으로 확인할 수 있습니다.

3.2 실시간 잔고 이벤트

잔고를 실시간으로 모니터링하고 싶다면, 다음과 같이 구현합니다.

class Kiwoom:
    def __init__(self):
        self.api = win32com.client.Dispatch("KHOPENAPI.KHOpenAPICtrl.1")
        self.api.OnReceiveRealData.connect(self.on_receive_real_data)

    def on_receive_real_data(self, code, data):
        print(f"잔고 정보 수신: {code}, {data}")

이 코드는 실시간으로 데이터가 들어올 때마다 호출됩니다.

4. 자동매매 전략 설계

자동매매를 위한 전략의 설계가 필요합니다. 예를 들어, 이동 평균을 기반으로 하는 전략을 살펴보겠습니다. 이동 평균을 통해 주식의 매매 시점을 판단할 수 있습니다.

class MovingAverageStrategy:
    def __init__(self):
        self.short_window = 5
        self.long_window = 20
        self.data = []

    def compute_moving_average(self):
        if len(self.data) < self.long_window:
            return None
        short_ma = sum(self.data[-self.short_window:]) / self.short_window
        long_ma = sum(self.data[-self.long_window:]) / self.long_window
        return short_ma, long_ma

이 전략은 짧은 기간의 이동 평균과 긴 기간의 이동 평균을 비교하여 매매 신호를 생성합니다.

5. 주문 실행

이제 이벤트를 통한 자동매매 시스템을 구현했으므로, 마지막으로 실제로 주문을 실행하는 코드를 작성해야 합니다.

def execute_trade(self):
    short_ma, long_ma = self.compute_moving_average()
    if short_ma is not None and short_ma > long_ma:
        print("매수 시점")
        self.send_order(1, "005930", 10, 0, 0)  # 삼성전자 매수 예
    elif short_ma is not None and short_ma < long_ma:
        print("매도 시점")
        self.send_order(2, "005930", 10, 0, 0)  # 삼성전자 매도 예

이 코드는 이동 평균 기반의 매매 전략에 따른 주문을 실행합니다. 매수 및 매도 시점은 이동 평균의 교차를 통해 결정됩니다.

6. 전체 자동매매 시스템

위의 모든 요소를 통합하여 전체 자동매매 시스템을 구현할 수 있습니다. 최종적으로 모든 클래스를 결합한 코드는 다음과 같습니다.

class AutoTradingSystem:
    def __init__(self):
        self.kiwoom = Kiwoom()
        self.strategy = MovingAverageStrategy()

    def run(self):
        while True:
            self.kiwoom.api.BlockRequest("opw00018", ...) # 잔고 정보 요청
            self.strategy.data.append(self.get_market_data())  # 시장 데이터 수집
            self.strategy.execute_trade()  # 매매 실행
            time.sleep(60)  # 주기적으로 실행

이것이 자동매매 시스템의 기본적인 구조입니다. API와 이벤트 처리, 매매 전략을 적절히 결합하여 자신만의 자동매매 시스템을 만들어 보세요.

결론

이번 강좌에서는 파이썬을 이용하여 키움증권 API로 자동매매 시스템을 구현하는 방법과 이벤트 처리의 중요성에 대해 알아보았습니다. 각 요소를 잘 이해하고 활용하여 자신만의 자동매매 시스템을 개발해 보시기 바랍니다. 추가적으로, 더 많은 전략을 시도해 보고, Thoth와 같은 백테스트 프레임워크를 활용하여 자신이 만든 전략의 성능을 체크해보면 좋습니다. 현재 시장의 변동성을 반영한 알고리즘을 만들기 위해 지속적인 연구가 필요합니다.

참고자료