from urllib.request import urlopen
import json
key = ''
url="http://ecos.bok.or.kr/api/StatisticSearch/"+key+"/json/kr/1/24/010Y002/MM/201401/201912/?/?/?/"
result = urlopen(url)
html = result.read()
data = json.loads(html)
print(data)
이제는 값을 받아오고 데이터 가공을 필요로 합니다 :)
필요한 값을 호출하고 필요에 따라 값을 재가공해서 사용을 해주시면 되겠습니다.
아래는 우리 로컬에서 테스트하기 전에 한국은행경제 통계시스템에서 직접 테스트를 해보실 수 있습니다. 우리 로컬에서 조회를 하기 전에 테스트를 해보세요!!
키움 증권에서 제공하는 키움 클래스를 활용하기 위해서 키움 API를 설치할 때 우리의 컴퓨터에 미리 등록되어 있는 ID를 갖고 옵니다. ID는 레지스트리에 등록이 되어 있으며 다음과 같습니다. -> KHOPENAPI.KHOpenAPICtrl.1
이로써 우리는 키움 클래스를 사용할 수 있습니다. 아래는 2개 버튼을 만들었는데 1)하나는 로그인 그리고 다른 하나는 2)접속 상태를 확인 하는 버튼입니다. 버튼이 눌릴 때 이벤트 clicked라는 이벤트가 발생합니다. 이때 등록해놓은 btn1_clicked / btn2_clicked 함수가 호출이 되는 것입니다.
키움 API에서 제공되는 함수는 1)Commconnect() 와 2)GetConnectState() 함수입니다. 일반적으로 API를 호출한다고 하면 함수를 그냥 호출하면 되지만 OCX 방식이기 때문에 API 호출 시 dynamiccall을 wrapper로 사용해주셔야 됩니다.
QAxWidget -> self.kiwoom -> dynamiccall
API 호출 할 때 이점을 유의해주세요.
또 하나 눈여 볼 것은 kiwoom은 self라는 키워드가 붙어 있고 btn1, btn2는 그냥 쓰여 있습니다. kiwoom은 다른 메서드에서도 사용이 되기 때문에 self 키워드를 붙여 줍니다.
1번 코드에서는 CommentConnect() 호출을 통해서 로그인을 진행했습니다. CommentConnect() 호출 이후에 로그인을 하면 OnEventConnect 이벤트가 발생(연결 상태가 변경될 때마다 발생)이 됩니다. 서버로부터 받는 응답입니다. 이벤트가 발생이 되면 등록되어 있는 event_connect() 함수가 호출이 됩니다.
3. 주식 기본정보 갖고 오기
단어 정리를 하나하고 가자면 TR은 서버로부터 데이터를 주고받는 작업입니다. 서버와 데이터를 주고받아 보도록 하겠습니다.
파이썬으로 무얼 할 수 있을까? 하다가 자료도 많고 정리도 잘 되어 있는 주식 트레이딩을 활용해볼까 합니다.
주식 데이터는 실제 데이터들이고 파이썬을 활용할 수 있는 곳이 명확합니다. 데이터 핸들, API 활용 및 자동화와 같이 말이죠. 돈을 벌려는 것이 아닌 파이썬을 잘 활용하고자 하는 마음에 학습을 시작합니다 :)
파이썬의 기본 개념은 앞 글에서 숙지를 했습니다. 파이썬 설치도 했고 환경 구축도 완료가 이미 되었습니다.
그래서 시작할 것은 주식계좌를 만들어 주세요.
계좌를 만들고 주식 데이터를 받아 올 수 있도록 키움주식회사에서 제공하는 모듈을 설치했습니다. 키움 번개 / 키움 OPEN API / KOA Studio 3가지를 설치하고 접속까지 되는 모습을 확인했습니다.
주식 트레이딩 전용 파이썬 가상 환경을 만들고 PYQT도 설치했습니다. 일반적으로 많은 사람들은 아나콘다라는 파이썬 패키지 묶음을 한 번에 설치를 하는데 우리는 파이썬만 설치를 했기에 다음과 같은 명령어로 pyqt를 설치해주세요.
가상환경을 구동하고 설치를 해주세요 :)
pip install pyqt5
설치가 어렵지 않습니다.
오늘은 pyqt 사용법을 간략하게 익혔습니다.
1. 기본 pyqt 사용
PYQT5.QtWidgets 패키지를 임포트하고 QApplication을 만들어서 레이블을 만들고 실행을 시켜주시면 됩니다.
2. QMainWindow 상송 후 창 크기 조절
QMainWindow를 상속받는 MyWindow 클래스를 만들었습니다. MyWindow는 QMainWindow의 기능들을 사용할 수 있고 타이틀과 창 크기는 원하는 값으로 변경했습니다.
super().__init__() 라인이 있습니다. 이 라인의 뜻은 QMainWindow 생성자를 호출하는 모습입니다. 이 라인이 없다면 상속받은 기능들을 사용할 수는 있지만 별도로 생성자를 호출하지는 않습니다. 그렇다면 기본 세팅은 안 되겠죠? 그렇기 때문에 부모 생성자를 호출해주는 모습니다.
3. 이벤트 등록
2번 항목의 향상된 기능입니다. 바로 사용자가 버튼을 누를 때 발생하는 이벤트를 등록했습니다. 이로써 우리는 프로그램을 만들고 무언가 액션을 취할수 있게 되었습니다.
이름을 입력받을 때 text input과 submit input이 있습니다. 유저로부터 받은 데이터는 myform:index 위치로 전송되고 HTTP 방식은 POST입니다. 우리가 많이 봐 오던 폼 형태입니다.
예제에서는 예시 코드로 코드 내용이 그리 많지 않으나 실제로는 폼 관련 코드가 복잡하고 양이 많을 겁니다.
그중 많은 필드는 미리 데이터가 작성이 되어 있어야 되고 유효성 검사도 필요로 합니다.
이쯤 되면 장고에서의 폼 기능을 필요로 합니다.
forms.py
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name name', max_length=7)
우리는 위에서 작성한 HTML 모습의 폼 모양이 필요로 하는 것을 필요로 하는데, 그 점이 폼을 작성하기 위한 시작점입니다.
forms 코드를 보시게 되면 charField를 갖는 your_name 폼을 하나 갖고 있습니다. you_name의 최대 길이는 7로 제한(값 유효성 확인 가능)을 뒀으며 label 명도 직접 설정을 할 수 있습니다. 이상 폼 코드를 작성한 내용입니다.
위의 작성한 코드를 사용해서 화면에 rendering 하기도 하고 값을 받아와서 처리를 하는 것입니다. form html 코드를 작성하지 않고 말이죠.
Form 인스턴스는 is_valid() 함수를 갖고 있습니다. is_valid() 함수는 입력받은 폼의 대한 유효성 검사를 실행합니다. is_valid() 함수가 호출되면 값이 유효하다면 참이 리턴되고 cleaned_data에 값이 저장이 됩니다. 이 내용은 뷰 로직에서 다뤄지니 뷰 코드에서 다시 보도록 하겠습니다. 지금은 값이 유효하다면 참이 리턴되고 cleaned_data에 저장이 되는 것을 명심해주시면 됩니다.
뷰에서 작성한 폼을 사용하도록 하겠습니다.
views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import NameForm
def index(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/myform/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'myform/name.html', {'form': form})
def thanks(request):
return render(request, 'myform/thanks.html')
GET 요청이 들어왔다면 NameForm()을 통해서 비어 있는 폼을 사용자 화면에 보여 줄 것입니다.
POST 요청이 들어온다면 NameForm(request.POST)을 통해서 요청으로부터 받은 데이터와 폼을 묶어(바인딩) 줍니다. form.is_valid()를 통해서 유효성 검사를 하는 겁니다. 앞서 설명드린 바와 같이 유효하다면 참이 리턴되어 thanks 페이지로 이동하고 그렇지 않다면 다시 이름 입력 페이지가 보이게 됩니다.
참이 될 때는 cleaned_data에 유효한 데이터는 모두 저장이 됩니다. cleaned_data는 어떻게 사용이 되는지 잠시 후에 보도록 하겠습니다.