본문 바로가기
코딩 공부/python

시세조회 API 사용하기

by Camel_coding_food 2022. 2. 18.
반응형

 

후후

 

시세 데이터 획득 방법

 

 

주식 시세를 가지고 자동투자 코드를 돌리려면

제 컴퓨터로 시세 테이터를 가져와야합니다.

 

여기서 두가지 선택지가 있습니다.

 

1. OpenAPI를 이용한다.

2. 웹 스크래핑을 사용한다.

 

1번과 2번 모두 장단점을 갖고 있습니다.

 

 

 

 

1. OpenAPI를 이용한다.

장점: 직접 API를 만들지 않아도 웬만한 기능은 이미 구현되어 있다.

 

단점: 무료 API 중 빠르고 정확한 API는 존재하지 않는다.

오히려 시간 제한이 있거나, 일정 이상 사용하면 사용료를 지불해야한다.


2. 웹 스크래핑을 사용한다.

장점: 실시간으로 정확한 시세가 반영되는 웹사이트에서 데이터를 가져온다면

정확한 데이터를 기반으로 프로그램을 운영할 수 있다.

 

단점: 만들기 번거로우며, 웹스크래핑의 속도가 생각보다 느리다.

 

 


 

획득 데이터 처리 방식

 

 

한빛 미디어의 '파이썬 증권데이터 분석' 에서는

두번째 방법을 선택했습니다. 

 

웹스크래핑을 이용하여 네이버 금융에서

일정한 시간마다 시세정보를 가져오는 시세조회 API를 직접 만드는 방식입니다.

 

 

책에서 선택한 방법조차 

시세 데이터를 스크래핑하여 DB에 저장하고,

이를 필요할 때 조회하는 과정에서 시간 소요가 있습니다.

 

그래서 비트코인이나 이더리움과 같은 암호화폐 자동매매는

매매 대상의 큰 변동성으로 인해 바이낸스나 각 거래소에서 무료로 제공하는 API를 사용하는게 유리합니다.

이 책을 마친 후엔 파이썬을 이용한 암호화폐 자동매매도 해볼겁니다.

 

 


 

웹스크래핑한 데이터 DB에 업데이트하기

 

 

책에서는 서버시스템으로 MySQL을 선택했습니다.

 

마리아디비 설치 및 접속 확인은 타 블로그를 참조해주시길 바랍니다.

 

일단 5장에서 만들 모듈 스텁코드(실행은 안되는 설계도 정도의 코드) 입니다.

 

class DBUpdater:
    def __int__(self):
        """생성자: MariaDB 연결 및 종목코드 딕셔너리 생성"""

    def __del__(self):
        """소멸자: MariaDB 연결 해제"""

    def read_krx_code(self):
        """KRX오부터 상장법인목록 파일을 읽어와서 데이터프레임으로 반환"""

    def update_comp_info(self):
        """종목토드를 company_info 테이블에 업데이트한 후 딕셔너리에 저장"""

    def read_naver(self, code, company, pages_to_fetch):
        """네이버 금융에서 주식 시세를 읽어서 데이터프레임으로 반환"""

    def replace_into_db(self, df, num, code, company):
        """KRX 상장법인의 주식 시세를 네이버로부터 읽어서 DB에 업데이트"""

    def execute_daily(self):
        """실행 즉시 및 매일 오후 다섯시에 dailt_price 테이블 업데이트"""

if __name__ == '__main__':
    dbu = DBUpdater()
    dbu.execute_daily()

 

 

이제 파이마이에스큐엘로 테이블을 생성해보겠습니다.

 

헤이디에스큐엘로 쿼리문 실행하기,

즉 데이터 베이스에 테이블 생성하기는 

 

'헤이디에스큐엘로 쿼리문 실행하여 데이터 베이스에 테이블 생성하기' 라고

 

검색엔진에 검색했을때 나오는 블로그를 참고해주시길 바랍니다.

 

이제 파이썬 문법 중 하나인 클래스에 대해 알아가며 코드를 한줄씩 봅시다.

 

import pymysql

class DBUpdater:
    def __int__(self):
    #__int__함수를 선언하여 인스턴스 변수를 선언한다.
        """생성자: MariaDB 연결 및 종목코드 딕셔너리 생성"""

        self.conn = pymysql.connect (host='localhost', user='root',
        #변수 앞에 self를 붙여 메서드 밖에서도 사용 가능한 변수를 선언한다.
            passord='cho2002!', db='invetor', charset='utf8')
            #DB와 연결하기 위해 필요한 정보를 전한다.

        with self.conn.cursor() as curs:
            sql ="""
            CREATE TABLE IF NOT EXISTS company_info (
            #IF NOT EXISTS 구문을 이용하여 에러가 발생해도 메세지만 뜨고 계속 실행되도록 한다.
                code VARCHAR(20),
                company VARCHAR(40),
                last_update DATE,
                PRIMARY KEY (code))
            """
            curs.execute(sql)
            sql="""
            CREATE TABLE IF NOT EXISTS daily_price (
                code VARCHAR(20),
                date DATE,
                open BIGINT(20),
                high BIGINT(20),
                low BIGINT(20),
                close BIGINT(20),

            )
            """
            curs.execute(sql)
        self.conn.commit

        self.code =dict()
        self.update_comp_info()

    def __del__(self):
        """소멸자: MariaDB 연결 해제"""
        self.conn.close()

 

이 코드를 입력한 후 엔터를 눌렀을때

아무것도 뜨지않고 'done'이 뜨기만 하면 됩니다.

 

이제 한국기업공시 파일에서 종목코드를 가져와보겠습니다.

 

import pandas as pd
class DBUpdater:
    def read_krx_code(self):
        url = 'https://kind.krx.co.kr/corpgeneral/corpList.do?method='\
        'download&searchTpye=13'

        krx = pd.read_html(url, header=0)[0]    #html 파일을 읽어준다.
        krx = krx[['종목코드', '회사명']]   #데이터프레임을 이용하여 원하는 칼럼만 뽑는다.
        
        krx = krx.rename(columns={'종목코드':'code','회사명':'company'})
        #영어 칼럼을 한글 칼럼으로 바꿔준다. 꼭 필요하지는 않은 코드이다.
        
        krx.code = krx.code.map('{:06d}'.format)    #종목코드형식을 조정해준다.
        return krx

 

이 코드 이후에도 엔터를 눌렀을 때 'done'만 출력되면 됩니다.

 

중간에 칼럼 언어를 바꿔주는 코드는 없어도 무방합니다.

 

위에 제가 코드를 두덩어리로 분리해서 올렸지만

꼭 한번에 컴파일 해주셔야 합니다.

 

다음에는 받아온 종목코드를 DB에 업로드해보겠습니다.

반응형

댓글