개요
파이썬 문법을 익힌 후 내가 원하는 종목을 찾기 위해서 어떤방법이 좋을까 생각해 보았다.
코스피, 코스닥에 엄청 많은 기업들이 있는데 그 모든 기업에 대해 내가 일일히 하나씩 알기는 불가능에 가까웠고, 이에 관련된 Open API 들이 없을까 찾아보다가
Dart 에서 간단한 절차를 통해 API KEY 만 발급 받으면 주요공시 조회, 재무제표, 손익계산서 등을 조회 할 수 있는 API 를 사용할 수 있는 것으로 확인하여 파이썬으로 데이터를 받는 프로그램을 만들기 시작했다.
API KEY 발급신청
1. 먼저 OpenDart 홈페이지에 접속. Open Dart 홈페이지 (https://opendart.fss.or.kr/)
2. 엄청 크게 표시된 인증키 신청 클릭
3. 간단한 정보를 입력하고 등록 버튼을 누르면 등록한 Email 주소로 인증메일이 도착한다.
메일에서 인증하기 클릭만 하면 등록 완료!
파이썬 프로그램 시작하기
OpenDart API 와 연동하기 위해선 API 통신을 위한 라이브러리가 필요할텐데..
찾아보니 requests, json 등을 간단하게 import 해서 사용하는 것으로 보인다.
import requests import json
import 하고자 한 라이브러리가 설치되지 않아서 인 듯 하다. (당연 처음 해보는거니..)
이런 경우 Alt + F12 로 터미널창을 열어 다음과 같이 입력하여 requests 모듈을 설치한다.
C:\workspace\python\eps_module> pip install requests
콘솔창에 쭈욱 메시지들이 뜨며 설치가 완료되면 설치된 모듈을 통해 통신하는 함수를 생성한다.
import requests import json import Constants import Utils import zipfile import io # 전역변수로 선언하면 현재 일자를 세팅해둘 수 있다. strToday = Utils.getStrCurrentDate('%Y%m%d') def getNotification(pageNo): # 공시요청 API 파라메터 세팅 reqUrl = 'https://opendart.fss.or.kr/api/list.json?' # 발급받은 API 키 reqUrl += 'crtfc_key=' + Constants.Global.dartApiKey # 조회시작일자 reqUrl += '&bgn_de=' + strToday # 조회종료일자 reqUrl += '&end_de=' + strToday # Page 수 reqUrl += '&page_no=' + str(pageNo) # 한페이지 표시 데이터 수 (가이드 참조 10~100) reqUrl += '&page_count=' + str(100) # 요청 후 데이터 받아옴 (이렇게 간단하다니..) response = requests.get(reqUrl) hasNextData = False # 응답이 정상이라면 if response.status_code == 200: data = json.loads(response.text) # 데이터 중 현재 페이지와 총 페이지를 비교하여 이후 요청 할 것인지 체크 hasNextData = data['page_no'] < data['total_page'] print('--------------------------------------------------------------------')
print('--- ' + str(data['page_no']) + '/' + str(data['total_page']) + ' ---') print('--------------------------------------------------------------------') # 리스트를 1줄씩 {회사명: 공시명} 포맷으로 출력 for i in data['list']: print(i['corp_name'] + ': ' + i['report_nm']) else: print('status code %s', response.status_code) return hasNextData
위 함수는 pageNo 를 인자로 받아 오늘 일자에 발표된 공시를 가져오는 역할을 하는 함수이며 main 함수에서 while loop 를 통하여 모든 공시를 받아오도록 처리할 예정이다.
def main(): pageNo = 0 while True: pageNo += 1 hasNextData = getNotification(pageNo) if not hasNextData: break if __name__ == '__main__': main()
파이썬에서 메인함수 선언은 Java와 다른듯 유사하였다.
1. 먼저 main() 이라는 함수를 선언(def) 하고
2. 그 아래 __name__ == '__main__': 문구를 통하여 함수명이 main 이면 위에 선언한
함수를 실행하게 처리해주었다.
3. 함수의 선언순서가 중요한데 아래에서 호출할 함수면 이전에 선언되어 있어야 한다.
그렇지 않으면 NameError: name 'xxxx' is not defined 에러를 만날 수 있다.
결과
while 문에서 pageNo 를 늘려가며 모든 공시정보를 가져오는 것을 확인하였다.
... 지투알: 임원ㆍ주요주주특정증권등소유상황보고서 이마트: 임원ㆍ주요주주특정증권등소유상황보고서 엔씨소프트: 임원ㆍ주요주주특정증권등소유상황보고서 만도: 임원ㆍ주요주주특정증권등소유상황보고서 LG화학: 임원ㆍ주요주주특정증권등소유상황보고서 LG유플러스: 임원ㆍ주요주주특정증권등소유상황보고서 ...
추가로 Open Dart 홈페이지에선 API 사용에 관한 정보도 확인이 가능하다.
인증키를 신청한 곳에서 현재 호출한 API 종류 및 횟수를 확인 할 수 있으니 참고하면 좋을 듯 하다.
마치며
API 연동과 별개로 python 의 간편함을 몸소 느낀 하루였다.
pip install + 코드 몇줄이면 원하는 바를 얻을 수 있다니..
이런 공시정보 중 유의미한 정보를 걸러내는 것은 2차로 작업해 볼 예정이다.
먼저는 당일 공시를 특정시간 (ex. 1시간) 마다 조회하고, 로컬 DB에 저장하여 유의미 한 것으로 판단되는 공시를 추리는 작업이 될 듯 하다.
댓글 없음:
댓글 쓰기