이전 강의에서 2번째 창을 어떻게 구성하고 전시시키는지와 특정 사이트에서 원하는 데이터를 크롤링하는 방법을 강의해 드렸습니다. 이번 강의에서는 앞선 강의를 바탕으로 환율 데이터를 한번 2번째 창에 넣어 보겠습니다.
이번 강의는 특별히 중급반인데도 불구하고 코드를 공유해 드리겠습니다.
1. 환율 데이터 가져오기
아래 그림은 환율이 오르면 경제에 어떠한 영향을 미치는지 간략히 나와 있습니다. 요점만 말씀드리면 환율 상승 시 원화가치가 하락하여, 외국인들이 가지고 있는 보유 주식을 처분할 때 주식이 보합이라도 손해를 보게 됩니다. 즉, 환율이 상승하는 시기에는 외국인들의 빠른 이탈로 주식은 하락하게 될 가능성이 매우 높습니다. 반대로 환율이 하락할 때는 외국인들의 매수세가 커져 증시가 상승하게 될 확률이 높아집니다.
이렇듯 환율은 우리나라 증시에 아주 큰 영향을 미치므로 관련 데이터를 가져와 투자 판단에 밑거름이 되도록 해 보겠습니다.
위의 그림처럼 네이버에 환율을 치시면 환율 변동량에 대하여 값을 얻을 수 있습니다. 우선 F12를 누르시고 개발자 모드에서 1,285.00의 값이 어떤 태그의 클래스 안에 있는지 확인해야 합니다. [링크 : 크롤링 방법 참조]
확인해 보니 span 테크의 "spt_con dw"라는 클래스 안에 우리가 원하는 모든 값이 숨어 있었습니다. 그러면 저 값을 어떻게 받아오는지 코딩해 보겠습니다.
2. 환율 데이터 크롤링 코딩하기
환율 데이터를 크롤링하기 전에 관련 데이터를 저장하고 보여 줄 수 있는 GUI를 만드셔야겠죠? 관련 GUI는 이전 강의에서 어떻게 만드는지 말씀드렸습니다. [링크 : GUI 생성 및 기초 구성하기]
하지만 약간 변화된 부분이 있어서 조금 더 설명드리겠습니다.
(1) ALBA2.ui 수정하기
아래 그림을 보시면 ALBA2.ui가 이전 강의와 다르게 약간 수정된 것을 확인할 수 있습니다. 환율 데이터를 담는 곳을 Group Box로 구분하고 그에 상응하는 값을 Text Edit에 넣을 준비를 합니다. 즉, 투자의 방향성을 정할 수 있는 다양한 데이터를 Group Box로 구분(환율, 에너지 가격, 인플레이션, CPI, PPI 등)하고 관련 데이터를 집어넣고 데이터 기반으로 투자 점수를 부여하는 작업입니다.
- Group Box로 원하는 데이터 구분하기
- 환율 관련 데이터 Text Edit에 삽입하기
* 환율 가격 : 1,285.00
* 변동 가격 : 11
* 변동 율 : -0.85
* 투자 점수 : 각자 생각대로 구현
(2) 코딩하기
저번 강의에 이어 Thread_4에 환율을 가져와 GUI에 입력하는 코딩을 해 보도록 하겠습니다. 우선 저번 강의에서 추가된 기능은 아래와 같습니다.
두 번째 GUI를 전시하는 메인 코드 News_all.py에서 관련 값을 가져오는 스레드를 실행시킵니다.
- self.check_exchang_rate() : self.check_exchang_rate 함수 실행하기
- def self.check_exchang_rate(self) : self.check_exchang_rate 함수 구성하기
- h4 = Thread4(self) : Thread4 기능을 h4에 인스턴스화 하기
- h4.start() : Thread4 실행하기
위의 코딩을 마치면 자연스럽게 Thread4를 실행합니다. 그러면 Thread4를 구성해야겠죠?
① 관련 함수 가져오기 : [링크 : 크롤링 방법 참조]
② Thread 구성하기 : 스레드 기능을 할당하고 부모 윈도우 창을 초기화 및 가져오는 작업 [링크 : Thread 구성]
③ 환율 데이터 받아오기 : [링크 : 크롤링 방법 참조]
- response = urlopen() : urlopen 함수를 사용하여 원하는 사이트 페이지의 모든 값을 response에 저장합니다.
- soup = BeautifulSoup(response, "html.parser") : BeautifulSoup 함수를 이용하여 response에 있는 데이터를 파이썬이 읽을 수 있는 언어로 바꿔 soup에 저장합니다.
- value = soup.find() : 앞서 설명한 span 태그의 "spt_con dw"클레스에 들어있는 값을 가져오기 위해 find 함수를 사용하고 관련 값을 value에 저장합니다.
- if value is not None : 우리가 value 값을 받아 올 때 환율이 하락이면 spt_con dw로 클래스가 구성되며, 환율 상승시에는 spt_con up으로 구성됩니다. 즉, 환률 상승 시 spt_con dw라는 것이 없으므로 None 값이 리턴되고 만약 환률이 하락이면 ["환율 가격", "변동 가격", "변동 율"]의 특정 3개의 값이 반환됩니다.
- value2 = value.text.split() : value에는 환율 가격, 변동 가격, 변동 율이 들어 있고 이 3개 값을 텍스트로 변환 후 리스트로 구분 짓기 위해 split() 함수를 사용합니다. value2에는 ["환율 가격", "변동 가격", "변동 율"]이 저장됩니다.
- else : None이라면, 즉 환율이 상승하여 spt_con dw라는 클래스가 존재하지 않고 spt_con up이 존재할 경우
- value = soup.find() : span 태그의 "spt_con up을 value에 저장합니다.
- value2 = value.text.split() : value에는 환율 가격, 변동 가격, 변동 율이 들어 있고 이 3개 값을 텍스트로 변환 후 리스트로 구분 짓기 위해 split() 함수를 사용합니다. value2에는 ["환율 가격", "변동 가격", "변동 율"]이 저장됩니다.
그리고 실제 value2에는 아래 그림과 같이 값들이 반환됩니다.
첫 번째 값은 "지수1,291.00'으로 지수라는 단어는 필요 없어 아래와 같이 환율 가격을 가져옵니다.
- a = value2[0][2:10] : value2의 0번째는 환율 가격이고 환율 가격의 2번 째부터 10번째까지 데이터를 가져옵니다.
- b = value2[1][4:11] : 전일대비를 생략한 값을 가져옵니다.
- c = vlaue2[2][1:7] : 괄호를 생략한 값을 가져옵니다.
관련 데이터 GUI에 삽입하기 위해 아래와 같이 간단히 코딩합니다.
④ 관련 데이터 GUI에 삽입하기
- self.parent.exchange_1.setPlainText(a) : a값을 첫 GUI 첫 번째 Text Edit에 저장합니다. 이때 Text Edit의 objectName은 exchange_1 입니다.
- 나머지 동일합니다.
- self.parent.exchange_1.setAlignment(Qt.AlignVcenter | Qt.AlignRight) : 우측 정렬합니다.
- 나머지 동일합니다.
⑤ 투자 점수 할당하기
환율 데이터를 바탕으로 투자 점수 할당합니다.
- 만약 환율 변동 율이 하락이면서 1%보다 크면 0.15점(만점)
- 만약 환율 변동 율이 하락이면서 1%보다 작으면 0.10점
- 만약 환율 변동 율이 상승이면서 1%보다 작으면 0.05점
- 만약 환율 변동 율이 상승이면서 1%보다 크면 0.01점
위와 같이 할당합니다. 물론 구분이나 점수 할당은 각자 알아서 하시면 됩니다. 저 같은 경우는 이 값은 샘플로 보여 드린 것이고 과거 데이터를 바탕으로 딥러닝을 통해 각 구분 % 와 점수를 할당하여 투자 위험도를 판단할 것입니다. 이 부분은 차 후 강의가 완강되고 딥러닝 수업 때 다루도록 하겠습니다.
우선 코딩은 위의 말과 동일하게 해 보겠습니다.
- if "-" in c and float(c[1:5]) >1 : 만약 환율 변동 율이 하락이면서("-") 1%보다 크면
- self.parent.exchange_4.setPlainText(str(0.15)) : exchange_4에 0.15점 할당
- 나머지 동일합니다.
- self.parent.exchange_4.setAlignment(Qt.AlignVcenter | Qt.AlignRight) : 우측 정렬합니다.
3. 최종 결과 및 코드
최종 결과는 아래와 같습니다. 이렇듯 우리는 다양한 데이터를 클릭 한 번에 전부 가져올 수 있습니다. 얼마나 편리하며, 투자에 도움이 되겠습니까. 이것이 자동매매의 아주 큰 획과 같습니다. 이번 강의를 끝으로 크롤링은 마무리 짓도록 하겠습니다. 저 빈 Group Box에 여러분의 아이디어를 채워 넣어 투자 위험도 프로그램을 만드시기 바랍니다.
다음 강의에서는 제가 만든 투자 위험도 프로그램을 보여 드리겠습니다. 감사합니다.
* 코드 : New_all.py
import sys # system specific parameters and functions : 파이썬 스크립트 관리
from PyQt5.QtWidgets import * # GUI의 그래픽적 요소를 제어 하단의 terminal 선택, activate py37_32, pip install pyqt5, 전부다 y
from PyQt5 import uic # ui 파일을 가져오기위한 함수
###################################################
from Qthread_4 import Thread4 # thread
###################################################
form_secondwindow = uic.loadUiType("ALBA2.ui")[0]
class secondwindow(QMainWindow, QWidget, form_secondwindow):
def __init__(self):
super(secondwindow, self).__init__()
self.initUi()
self.show()
self.check_exchang_rate()
self.pushButton.clicked.connect(self.btn_second_to_main) # GUI 종료 버튼튼
def initUi(self): self.setupUi(self)
def btn_second_to_main(self):
self.close() # 클릭시 종료됨.
def check_exchang_rate(self):
print("환율 가져오기")
h4 = Thread4(self)
h4.start()
if __name__ == '__main__': # import된 것들을 실행시키지 않고 __main__에서 실행하는 것만 실행 시킨다.
# 즉 import된 다른 함수의 코드를 이 화면에서 실행시키지 않겠다는 의미이다.
app = QApplication(sys.argv) # PyQt5로 실행할 파일명을 자동으로 설정, PyQt5에서 자동으로 프로그램 실행
CH = secondwindow() # Main 클래스 myApp으로 인스턴스화
CH.show() # myApp에 있는 ui를 실행한다.
app.exec_() # 이벤트 루프
* Thread_4.py
from PyQt5.QtCore import * # 쓰레드 함수를 불러온다.
from kiwoom import Kiwoom # 메타클레스 기반 싱글턴
from urllib.request import urlopen # 크롤링 사이트 여는 함수
from bs4 import BeautifulSoup # 크롤링 사이트의 값을 가져오는 함수
class Thread4(QThread):
def __init__(self, parent): # 부모의 윈도우 창을 가져올 수 있다.
super().__init__(parent) # 부모의 윈도우 창을 초기화 한다.
self.parent = parent # 부모의 윈도우를 사용하기 위한 조건
self.k = Kiwoom()
response = urlopen("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%ED%99%98%EC%9C%A8/") # 크롤링하고자하는 사이트
soup = BeautifulSoup(response, "html.parser") # html에 대하여 접근할 수 있도록
value = soup.find("span", {"class": "spt_con dw"})
if value is not None:
value2 = value.text.split() # split(구분좌)
else:
value = soup.find("span", {"class": "spt_con up"})
value2 = value.text.split() # split(구분좌)
print(value2)
a = value2[0][2:10] # 환율값
b = value2[1][4:11] # 증가/하락
c = value2[2][1:7] # 증가/하락 비율
self.parent.exchange_1.setPlainText(a)
self.parent.exchange_2.setPlainText(b)
self.parent.exchange_3.setPlainText(c)
self.parent.exchange_1.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.exchange_2.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.exchange_3.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
print(float(c[1:4]))
if "-" in c and float(c[1:5]) > 1: # 환률이 떨어지고, 떨어지는 폭이 1퍼센트 이상이면
self.parent.exchange_4.setPlainText(str(0.15))
if "-" in c and float(c[1:5]) < 1: # 환률이 떨어지고, 떨어지는 폭이 1퍼센트 이하이면
self.parent.exchange_4.setPlainText(str(0.10))
elif "-" not in c and float(c[1:5]) < 1: # 환률이 올라가고, 올라가는 폭이 1퍼센트 이하이면
self.parent.exchange_4.setPlainText(str(0.05))
elif "-" not in c and float(c[1:5]) > 1: # 환률이 올라가고, 올라가는 폭이 1퍼센트 이상이면
self.parent.exchange_4.setPlainText(str(0.01))
self.parent.exchange_4.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
'주식 자동매매 강의 > 중급반(시황 및 차트 구현)' 카테고리의 다른 글
[주식자동매매] 분할 매수/매도 코딩하기(1), 개념 설명 (4) | 2022.07.05 |
---|---|
시황 파악(상승/하락) 및 투자 위험도 판단 프로그램(크롤링) 마지막 편 (8) | 2022.07.02 |
[특강] 웹크롤링(Web Crowling) 기초 개념과 코드 구현(with Python) (10) | 2022.06.27 |
원하는 뉴스 및 시황 데이터 받아와(크롤링, crowling) 자신만의 주식 위험도 프로그램 만들기(1) (5) | 2022.06.25 |
[크롤링(crawling) 데이터] GUI 전시 및 모니터 스크린 정 가운데 전시하기 (12) | 2022.06.23 |