파이썬 자동매매 개발, PyQt QTableWidget

파이썬을 활용한 자동매매 시스템 개발은 금융 트레이딩의 자동화를 통해 투자 효율성을 극대화하는 훌륭한 방법입니다. 여기서는 PyQt의 QTableWidget을 사용하여 데이터 시각화 및 사용자 인터페이스(Ui) 구성 방법에 대해 알아보겠습니다. 또한, QTableWidget을 통해 실시간으로 주식 데이터를 모니터링하며, 이를 자동매매 시스템과 연동하는 방법을 설계할 것입니다.

1. 파이썬 자동매매 시스템의 개요

자동매매 알고리즘은 사용자의 전략이 진행될 수 있도록 트레이딩 프로그램이 사람 대신 결정을 내리는 것을 말합니다. 파이썬은 그 손쉬운 문법과 강력한 라이브러리 덕분에 데이터 분석과 기계 학습 분야에서 인기가 높아져 있습니다.

1.1 자동매매 시스템의 필요성

자동매매 시스템은 다음과 같은 몇 가지 주요 이점을 겸비하고 있습니다:

  • 24시간 모니터링: 인간은 쉬거나 피로해질 수 있지만, 프로그램은 지속적으로 시장을 관찰할 수 있습니다.
  • 정확성: 프로그램 지정된 알고리즘에 따라 매매를 실행하여 감정의 영향을 배제합니다.
  • 속도: 자동매매는 수 밀리초 내에 주문을 실행할 수 있습니다.

2. PyQt 및 QTableWidget 소개

PyQt는 Python 프로그래밍 언어로 작성된 GUI 애플리케이션을 위한 라이브러리이며, Qt 프레임워크를 기반으로 합니다. PyQt는 다양한 위젯을 제공합니다. 그 중 QTableWidget은 데이터를 표 형식으로 보여주는 데 매우 유용한 위젯입니다.

2.1 QTableWidget의 주요 기능

  • 셀 기반의 데이터 입력 및 표시 지원
  • 각 셀에 다양한 데이터 타입을 저장 가능
  • 정렬 및 검색 기능 제공
  • 사용자 정의 스타일링 지원

2.2 QTableWidget 활용하기

QTableWidget을 사용하는 방법에 대해 예제 코드를 통해 구체적으로 입문해 보겠습니다.

2.3 기본 QTableWidget 예제


import sys
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget

class TableWidgetExample(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QTableWidget 예제")
        self.resize(600, 400)

        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(5)
        self.tableWidget.setColumnCount(3)

        self.tableWidget.setHorizontalHeaderLabels(["코드", "종목명", "현재가"])
        
        # 데이터 삽입
        self.tableWidget.setItem(0, 0, QTableWidgetItem("005930"))
        self.tableWidget.setItem(0, 1, QTableWidgetItem("삼성전자"))
        self.tableWidget.setItem(0, 2, QTableWidgetItem("90000"))

        layout = QVBoxLayout()
        layout.addWidget(self.tableWidget)
        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = TableWidgetExample()
    mainWin.show()
    sys.exit(app.exec_())
    

위의 코드는 기본적인 QTableWidget을 생성하는 예제입니다. 5개의 행과 3개의 열을 설정하였으며, 첫 번째 행에 삼성전자의 데이터를 입력하였습니다. 이제 이 위젯을 확장하여 자동매매 시스템과 연동해 보겠습니다.

3. 자동매매 시스템 기본 구조

자동매매 시스템을 구성하는 기본 요소는 데이터 피드, 전략 로직, 주문 실행, 그리고 리포팅입니다. 이러한 요소들을 PyQt 및 QTableWidget을 사용하여 실시간으로 시각화하는 방법을 다음과 같이 설명하겠습니다.

3.1 실시간 데이터 피드

주식 데이터 API를 사용하여 실시간 데이터를 받아올 수 있습니다. 예를 들어, yfinance 라이브러리를 사용해 애플 주식의 데이터를 가져오는 방법을 보여드리겠습니다.


import yfinance as yf

def get_real_time_data():
    ticker = 'AAPL'
    data = yf.download(ticker, period='1d', interval='1m')
    return data
    

3.2 자동매매 전략 로직

간단한 매매 전략으로는 이동 평균 교차 전략이 있습니다. 주가의 단기 이동 평균이 장기 이동 평균을 초과할 때 매수하고, 반대의 경우 매도하는 방식입니다. 이를 코드로 구현해 보겠습니다.


def moving_average_strategy(data):
    short_window = 5
    long_window = 20
    
    signals = pd.DataFrame(index=data.index)
    signals['price'] = data['Close']
    signals['short_mavg'] = data['Close'].rolling(window=short_window, min_periods=1).mean()
    signals['long_mavg'] = data['Close'].rolling(window=long_window, min_periods=1).mean()

    signals['signal'] = 0.0
    signals['signal'][short_window:] = np.where(signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:], 1.0, 0.0)    
    signals['positions'] = signals['signal'].diff()

    return signals
    

3.3 QTableWidget과 통합

위에서 생성한 QTableWidget에 실시간 데이터와 계산된 신호를 업데이트해 보겠습니다. 자동으로 데이터가 업데이트 되도록 타이머를 설정하고 신호를 표시하는 방법을 설명합니다.


from PyQt5.QtCore import QTimer
import pandas as pd
import numpy as np

class TradingApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("자동매매 시스템")
        self.resize(800, 600)
        
        # QTableWidget 및 데이터 초기화
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(10)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setHorizontalHeaderLabels(["코드", "이현재가", "신호", "포지션"])
        
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        self.setLayout(self.layout)
        
        # 데이터 업데이트 타이머
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_table)
        self.timer.start(10000)  # 10초마다 업데이트

    def update_table(self):
        data = get_real_time_data()  # 데이터 가져오
        signals = moving_average_strategy(data)

        for i in range(len(signals)):
            self.tableWidget.setItem(i, 0, QTableWidgetItem("AAPL"))  # 코드
            self.tableWidget.setItem(i, 1, QTableWidgetItem(str(signals['price'].iloc[i])))  # 현재가
            self.tableWidget.setItem(i, 2, QTableWidgetItem(str(signals['signal'].iloc[i])))  # 신호
            self.tableWidget.setItem(i, 3, QTableWidgetItem(str(signals['positions'].iloc[i])))  # 포지션

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = TradingApp()
    mainWin.show()
    sys.exit(app.exec_())
    

4. 결론

오늘은 PyQt의 QTableWidget을 사용하여 간단한 자동매매 시스템을 개발하는 과정을 살펴보았습니다. 사용자에게 실시간으로 데이터를 제공하고 자동매매 전략을 기반으로 표시할 수 있는 UI를 구축하는 방법을 배웠습니다. 더 나아가 고급 전략, 리포팅, 데이터베이스 연동 등을 활용하여 복잡한 시스템을 구성할 수 있습니다.

앞으로 더 많은 주제를 다루면서 더 나은 매매 시스템을 개발해 나가시길 바랍니다.