최근 주식 시장의 자동매매 시스템은 많은 투자자들 사이에서 주목받고 있습니다.
특히 파이썬(Python)은 그 간결함과 강력한 라이브러리들 덕분에 금융 데이터 처리 및 자동 매매 시스템
개발에 적합한 언어로 자리 잡았습니다. 이번 글에서는 키움증권 API를 활용한 자동매매
시스템 개발 방법과 사용자 인터페이스를 구축하기 위한 PyQt의 활용에 대해 알아보겠습니다.
1. 자가 진단: 왜 자동매매 시스템인가?
자동매매 시스템은 인간의 감정이나 순간의 판단에서 벗어나,
사전에 설정한 알고리즘에 따라 자동으로 매매를 수행할 수 있게 해줍니다.
이는 거래의 일관성을 유지하고 거래 시간을 최적화함으로써
수익을 극대화할 수 있는 가능성을 높입니다.
2. 키움증권 API 개요
키움증권 API는 키움증권에서 제공하는 프로그램적으로 매매를 수행할 수 있도록
도와주는 도구입니다. 이 API를 통해 사용자들은 실시간으로
주식 데이터를 조회하고, 주문을 생성하며, 거래 내역을 관리할 수 있습니다.
2.1. 키움 API 설치
키움 API를 사용하기 위해서는 먼저 키움증권의 Open API+를 설치해야 합니다.
설치 후, 다음과 같은 단계를 통해 API를 설정할 수 있습니다.
1. 키움증권의 홈페이지에서 'Open API+'를 다운로드합니다.
2. 설치 후, '키움증권 Open API' 폴더 안의 'OPKorea_1.2.0.exe'를 실행합니다.
3. API 키와 비밀번호를 입력하여 인증을 진행합니다.
4. API가 정상적으로 작동하는지 확인합니다.
2.2. 키움 API의 주요 기능
- 주식 종목 검색
- 실시간 시세 조회
- 주문 및 매매 체결
- 거래 내역 조회
- 포트폴리오 관리
3. 파이썬과 키움증권 API 연동
파이썬을 사용하여 키움증권 API를 연동하기 위해서는 PyQt5와 같은 GUI 프레임워크를 병행하여
사용할 수 있습니다. 키움 API와 PyQt5를 활용한 예제 코드를 살펴보겠습니다.
3.1. PyQt5 설치하기
pip install PyQt5
pip install PyQt5-tools
3.2. 키움 API를 통한 로그인 구현하기
아래는 키움증권 API에 로그인하는 기본 코드입니다.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtCore import pyqtSlot
import win32com.client
class Kiwoom(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("키움증권 자동매매 시스템")
self.setGeometry(300, 300, 400, 300)
self.login_button = QPushButton("로그인", self)
self.login_button.clicked.connect(self.login)
self.login_button.resize(100, 40)
self.login_button.move(150, 130)
self.kiwoom = win32com.client.Dispatch("KHOpenAPI.KHOpenAPICtrl.1")
@pyqtSlot()
def login(self):
self.kiwoom.CommConnect()
if __name__ == "__main__":
app = QApplication(sys.argv)
kiwoom = Kiwoom()
kiwoom.show()
sys.exit(app.exec_())
4. 실시간 주식 데이터 조회
이제 로그인 기능을 추가한 후, 실시간 데이터 조회 기능을 추가해 보겠습니다.
실시간 시세를 조회하기 위해서는 데이터 요청을 위한 함수를 작성해야 합니다.
class Kiwoom(QMainWindow):
# ... 이전 코드 생략 ...
def retrieve_stock_data(self, stock_code):
self.kiwoom.SetInputValue("종목코드", stock_code)
self.kiwoom.CommRqData("주식기본정보", "opt10001", 0, "0101")
def OnReceiveTrData(self, scrno, rqname, trcode, recordname, prevnext,
dataLength, errorCode, message, splm):
print("데이터 수신")
self.current_price = self.kiwoom.GetCommData(trcode, rqname, 0, "현재가")
print(f"현재가: {self.current_price.strip()}")
4.1. 실시간 데이터 수신 기능 추가
위에서 돌아가는 기본 코드에 `OnReceiveTrData` 메서드를 추가하였습니다.
이 메서드에서는 수신된 데이터의 처리 로직을 구현하게 됩니다.
5. 주문 기능 구현
이제 간단한 주문 기능을 추가해 보겠습니다.
매수, 매도 주문을 처리하기 위한 코드 예제를 살펴보겠습니다.
def buy_stock(self, stock_code, quantity):
self.kiwoom.SetInputValue("종목코드", stock_code)
self.kiwoom.SetInputValue("주문수량", quantity)
self.kiwoom.SetInputValue("가격", 0) # 시장가
self.kiwoom.SetInputValue("주문구분", 1) # 매수
self.kiwoom.CommRqData("주식주문", "opt00001", 0, "0101")
def sell_stock(self, stock_code, quantity):
self.kiwoom.SetInputValue("종목코드", stock_code)
self.kiwoom.SetInputValue("주문수량", quantity)
self.kiwoom.SetInputValue("가격", 0) # 시장가
self.kiwoom.SetInputValue("주문구분", 2) # 매도
self.kiwoom.CommRqData("주식주문", "opt00001", 0, "0101")
6. GUI 디자인 최적화
PyQt5를 사용하여 좀 더 직관적이고 사용하기 쉬운 GUI를 설계할 수 있습니다.
다양한 위젯을 사용하여 사용자 경험을 높일 수 있습니다.
self.quantity_input = QLineEdit(self)
self.quantity_input.move(150, 50)
self.quantity_input.resize(100, 30)
self.stock_code_input = QLineEdit(self)
self.stock_code_input.move(150, 90)
self.stock_code_input.resize(100, 30)
self.buy_button = QPushButton("매수", self)
self.buy_button.move(150, 130)
self.buy_button.clicked.connect(self.on_buy_click)
6.1. 주문 버튼 클릭 이벤트 처리
def on_buy_click(self):
stock_code = self.stock_code_input.text()
quantity = int(self.quantity_input.text())
self.buy_stock(stock_code, quantity)
7. 자동매매 알고리즘 개발
이제 자동매매의 핵심인 알고리즘을 구현해 보겠습니다.
간단한 전략을 예제로 들면, 이동 평균 교차 전략을 사용할 수 있습니다.
def moving_average_strategy(self):
short_window = 5
long_window = 20
prices = self.get_past_prices(stock_code)
short_ma = prices[-short_window:].mean()
long_ma = prices[-long_window:].mean()
if short_ma > long_ma:
self.buy_stock(stock_code, 1)
elif short_ma < long_ma:
self.sell_stock(stock_code, 1)
7.1. 과거 가격 데이터 가져오기
def get_past_prices(self, stock_code):
# 과거 가격 데이터를 가져오는 메서드 구현
pass
8. 종료 및 지속적 거래
자산을 관리할 때에는 주문이 체결된 후 거래 내역을 모니터링하고,
필요한 조치를 취하는 것이 매우 중요합니다. 거래가 완료된 후에는
포트폴리오를 업데이트하는 절차가 필요합니다.
def update_portfolio(self):
# 포트폴리오 상태 업데이트 메서드 구현
pass
결론
본 글에서는 키움증권 API를 사용하여 파이썬으로 간단한 자동매매 시스템을
구현하는 방법을 살펴보았습니다. PyQt를 통해 사용자 인터페이스를 추가함으로써
더욱 직관적이고 사용하기 쉬운 시스템을 만들 수 있었습니다.
다음으로는 이 기초 위에 더 복잡하고 다양한 알고리즘을 추가하여
개인화된 자동매매 시스템을 만드는 것을 추천합니다.