본문 바로가기
Python

[Python] 파이썬으로 배우는 알고리즘 트레이딩

by YJHTPII 2023. 7. 21.
반응형

 

 

https://wikidocs.net/5252

 

2) 그래프 그리기

이번 절에서는 앞서 개발한 메인 레이아웃에 이벤트를 추가해보겠습니다. 메인 윈도우에서 QPushButton을 클릭했을 때 pushButtonClicked 메서드가 호출됩니다. p…

wikidocs.net

 

 

16) -> 6) -> 2)

2) 그래프 그리기

이번 절에서는 앞서 개발한 메인 레이아웃에 이벤트를 추가해보겠습니다. 메인 윈도우에서 QPushButton을 클릭했을 때 pushButtonClicked 메서드가 호출됩니다. pushButtonClicked 메서드에서는 QLineEdit에 입력된 종목 코드를 얻어온 후 pandas 모듈을 이용해 20일 이동평균 값과 60일 이동평균 값을 계산한 후 그래프로 출력합니다.

예제 16.22는 그림 16.47 프로그램의 전체 코드입니다. 프로그램을 실행한 후 078930.KS를 입력하고 버튼을 클릭하면 그래프가 출력됩니다. 참고로 078930.KS는 GS의 종목 코드입니다.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import pandas_datareader.data as web
import pandas as pd
from pandas import Series, DataFrame

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setGeometry(600, 200, 1200, 600)
        self.setWindowTitle("PyChart Viewer v0.1")
        self.setWindowIcon(QIcon('icon.png'))

        self.lineEdit = QLineEdit()
        self.pushButton = QPushButton("차트그리기")
        self.pushButton.clicked.connect(self.pushButtonClicked)

        self.fig = plt.Figure()
        self.canvas = FigureCanvas(self.fig)

        leftLayout = QVBoxLayout()
        leftLayout.addWidget(self.canvas)

        # Right Layout
        rightLayout = QVBoxLayout()
        rightLayout.addWidget(self.lineEdit)
        rightLayout.addWidget(self.pushButton)
        rightLayout.addStretch(1)

        layout = QHBoxLayout()
        layout.addLayout(leftLayout)
        layout.addLayout(rightLayout)
        layout.setStretchFactor(leftLayout, 1)
        layout.setStretchFactor(rightLayout, 0)

        self.setLayout(layout)

    def pushButtonClicked(self):
        code = self.lineEdit.text()
        web.DataReader(code + ".ks", "yahoo")
        df['MA20'] = df['Adj Close'].rolling(window=20).mean()
        df['MA60'] = df['Adj Close'].rolling(window=60).mean()

        ax = self.fig.add_subplot(111)
        ax.plot(df.index, df['Adj Close'], label='Adj Close')
        ax.plot(df.index, df['MA20'], label='MA20')
        ax.plot(df.index, df['MA60'], label='MA60')
        ax.legend(loc='upper right')
        ax.grid()

        self.canvas.draw()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    app.exec_()

예제 16.22 그래프 그리기 이벤트 추가(소스코드: book/ch16/26.py)

pushButtonClicked 메서드에 대해 조금 더 자세히 살펴보겠습니다. QLineEdit 객체로부터 사용자가 입력한 종목 코드를 얻어온 후 pandas 모듈을 통해 주가 이동 평균값을 계산합니다.

code = self.lineEdit.text()
web.DataReader(code + ".ks", "yahoo")
df['MA20'] = df['Adj Close'].rolling(window=20).mean()
df['MA60'] = df['Adj Close'].rolling(window=60).mean()

그래프를 그리기 위해 add_subplot 메서드를 호출해 AxesSubplot 객체를 생성한 후 plot 메서드를 통해 그래프를 그립니다. 마찬가지로 범례와 그리드도 그립니다.

ax = self.fig.add_subplot(111)
ax.plot(df.index, df['Adj Close'], label='Adj Close')
ax.plot(df.index, df['MA20'], label='MA20')
ax.plot(df.index, df['MA60'], label='MA60')
ax.legend(loc='upper right')
ax.grid()

마지막으로 FigureCanvas 객체에 그래프를 그리기 위해 draw 메서드를 호출합니다.

self.canvas.draw()

 

반응형

댓글