파이썬으로 PER 밴드 차트 그리기 3 - qt designer로 UI 만들기
본문 바로가기
파이썬으로 만든 것들/PER밴드

파이썬으로 PER 밴드 차트 그리기 3 - qt designer로 UI 만들기

by Squat Lee 2022. 9. 19.

2022.09.07 - [취미로 하는 파이썬/투자 실험실 with 파이썬] - 파이썬으로 PER 밴드 차트 그리기 2 - 수정주가 가져와서 선형으로 그래프 그리기

 

파이썬으로 PER 밴드 차트 그리기 2 - 수정주가 가져와서 선형으로 그래프 그리기

2022.09.05 - [취미로 하는 파이썬/투자 실험실 with 파이썬] - 파이썬으로 PER 밴드 만들기 1 파이썬으로 PER 밴드 만들기 1 파이썬으로 PER 밴드를 만들어 보았습니다. https://m.blog.naver.com/PostView.nave..

dotsnlines.tistory.com

 

지난번 포스트에서 얘기한 것 처럼 UI를 만드는 방법입니다.

 

컨센서스도 가져와서 미래 예측까지 보여주려고 했는데, 잘 안되네요. 이 부분은 나중에 여유가 생기면 업데이트 하도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
import pandas_datareader.data as web
from datetime import datetime
from pykrx import stock
import matplotlib.pyplot as plt
import pandas as pd
 
ui = 'per_band.ui'
 
class MainDialog(QDialog):
    def __init__(self):
        QDialog.__init__(selfNone)
        uic.loadUi(ui, self)
 
        self.pushButton.clicked.connect(self.per_band)
 
 
    def per_band(self):
        # 해당 파아미터를 라인텍스트에서 입력하여 변수에 담기
        start = self.le_start.text()
        end = self.le_end.text()
        stock_code = self.le_code.text()
 
        # 수정주가 가져오기
        sy = start[:4]
        sm = start[4:6]
        sd = start[-2:]
 
        ey = end[:4]
        em = end[4:6]
        ed = end[-2:]
 
        date_start = datetime(int(sy), int(sm), int(sd))
        date_end = datetime(int(ey), int(em), int(ed))
 
        df_p = web.DataReader(stock_code+'.KS''yahoo', date_start, date_end)
        df_p = df_p[['Adj Close']].astype(int)
 
        #펀더멘털 구하기
        df_f = stock.get_market_fundamental(start, end, stock_code, freq='d')
 
        #EPS가 계단형으로 나오기에 선현으로 변경하기
        li_eps = df_f['EPS'].unique() #년도별 EPS를 리스트로 만들기
        c_eps = list(df_f['EPS'].value_counts())#각 EPS별 개수
 
        combined_eps = []
 
        #EPS 각 값과, 개수를 리스트로 합치기
        for n in range(len(li_eps)):
                combined_eps.append([li_eps[n], c_eps[n]])
 
        NEW_EPS = []
 
        for num, e in enumerate(combined_eps): #EPS와 월별 개수를 합친 리스트를 반복
            if num < len(combined_eps)-1#마지막까지 반복하면 에러가 나므로 마지막 전까지 반복
                for c in range(combined_eps[num][1]): #EPS별 개월수를 반복하기(0 to n-1)
                    new_eps = int(combined_eps[num][0+ ((combined_eps[num+1][0]-combined_eps[num][0])*c)/
                                  (combined_eps[num][1+ 1)) # 올해EPS + (내년EPS - 올해EPS) X (해당개월수 / 전체개월수)
                    NEW_EPS.append(new_eps)
            else#마지막 리스트 개체
                for c in range(combined_eps[-1][1]):#마지막 리스트 반복하기
                    new_eps = int(combined_eps[-1][0* (c+1/ combined_eps[-1][1])
                    NEW_EPS.append(new_eps)
 
        df_eps = pd.DataFrame(data=NEW_EPS, columns=['N_EPS'], index=df_f.index)
        df_f = pd.merge(df_f, df_eps, left_index=True, right_index=True)
 
        per_med = int(df_f['PER'].median())  # 중간값
        per_max = int(df_f['PER'].max() + 1)  # 최대값
        per_min = int(df_f['PER'].min() - 1)  # 최소값
        per_25 = int(df_f['PER'].quantile(0.25))  # 25%
        per_75 = int(df_f['PER'].quantile(0.75))  # 75%
 
        df_f['PER_' + str(per_min)] = df_f['N_EPS'* per_min
        df_f['PER_' + str(per_25)] = df_f['N_EPS'* per_25
        df_f['PER_' + str(per_med)] = df_f['N_EPS'* per_med
        df_f['PER_' + str(per_75)] = df_f['N_EPS'* per_75
        df_f['PER_' + str(per_max)] = df_f['N_EPS'* per_max
 
        df_f = df_f[['PER_' + str(per_min), 'PER_' + str(per_25), 'PER_' + str(per_med), 'PER_' + str(per_75),
                     'PER_' + str(per_max)]]
 
        df_t = pd.merge(df_p, df_f, left_index=True, right_index=True)
        df_t = df_t.astype(int)
 
        name = stock.get_market_ticker_name(stock_code)
 
        plt.figure(figsize=(188))
        plt.plot(df_t['Adj Close'], 'red')
        plt.plot(df_t['PER_' + str(per_min)], linestyle='--', color='black')
        plt.plot(df_t['PER_' + str(per_25)], linestyle='--', color='gray')
        plt.plot(df_t['PER_' + str(per_med)], linestyle='--', color='blue')
        plt.plot(df_t['PER_' + str(per_75)], linestyle='--', color='pink')
        plt.plot(df_t['PER_' + str(per_max)], linestyle='--', color='green')
        plt.title(name)
        plt.legend(df_t.columns)
        plt.show()
 
        return df_t
 
if __name__=='__main__':
    app = QApplication(sys.argv)
    Dialog = MainDialog()
    Dialog.show()
    app.exec_()
cs

 

코드가 좀 긴 것 처럼 보이는데, 지난번 코드에서 UI를 보여주는 클래스만 추가 했습니다.

 

아래와 같은 구조입니다.

ui = 'per_band.ui'
class MainDialog(QDialog):
    def __init__(self):
        QDialog.__init__(selfNone)
        uic.loadUi(ui, self)
        self.pushButton.clicked.connect(self.함수)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         def 함수():
            .............
            return 결과값
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if __name__=='__main__':
    app = QApplication(sys.argv)
    Dialog = MainDialog()
    Dialog.show()
    app.exec_()

기본 UI를 보여주는 코드에서 지난번에 만든 함수만 사이에 넣어 주면 됩니다.

 


 

Qt Desinger에서 UI 폼은 이렇게 만들었습니다.

 

텍스트 입력창은 QLineEdit을 이용했고, 글자의 Default 값은 그림과 같이 설정했습니다. 그리고 텍스트 입력창을 지울 수 있도록 'X' 버튼도 속성창에서 옵션으로 넣어 주었습니다.

 

 

 

728x90
반응형

댓글