2022.09.07 - [취미로 하는 파이썬/투자 실험실 with 파이썬] - 파이썬으로 PER 밴드 차트 그리기 2 - 수정주가 가져와서 선형으로 그래프 그리기
지난번 포스트에서 얘기한 것 처럼 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__(self, None)
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=(18, 8))
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__(self, None)
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
'파이썬(Python) > PER밴드' 카테고리의 다른 글
파이썬으로 PER 밴드 차트 그리기 2 - 수정주가 가져와서 선형으로 그래프 그리기 (0) | 2022.09.07 |
---|---|
파이썬으로 PER 밴드 만들기 1 (0) | 2022.09.05 |
댓글