< 주가 일봉 데이터 저장 프로그램 개발 - 프로그램 기능 구현>


1. "프로그램 개발 개요"

2. "프로그램 DB 설계 및 구현"

3. "키움 OPEN API 구현"


해당 포스트를 읽기 전에 이전 포스트를 읽기 바란다.


이번에는 프로그램 전체 기능을 구현할 것이다. 다음 포스트에서 구현할 프로그램 GUI를 보고 어느 기능이 필요한 지 살펴 보자. 


보다시피 DB 로그인, 데이터 DB 저장, 데이터 엑셀 저장 기능이 필요한 걸 알 수 있다. 추가로 입력한 종목 코드가 실제 상장된 주식의 종목 코드인지 확인하는 기능이 필요하다. 코스피/코스닥 지수의 경우는 종목 코드가 없기 때문에 "kospi"를 입력하면 코스피 지수 일봉 데이터가, "kosdaq"을 입력하면 코스닥 지수 일봉 데이터가 요청된다.   


전체 코드는 다음과 같다. 이전 포스트에서 Kiwoom.py와 StockDB.py를 구현했기에 소스가 간단하다.

import Kiwoom as kw
import DB as db
from datetime import date, timedelta


class MainFunctions():
    def __init__(self):
        self.ki = kw.Kiwoom()
        self.dB = db.StockDB()

        self.date = date.today() - timedelta(1)

    def db_login(self, password):
        return self.dB.init(password)

    def is_stock(self, code):
        if code == 'kospi' or code == 'kosdaq':
            return code
        stock_name = self.ki.is_stock(code)
        if stock_name is not "":
            return stock_name
        return None

    def db_insert_stock(self, code):
        table_name = ""
        if code == 'kospi':
            table_name = code
            code = '001'

        elif code == 'kosdaq':
            table_name = code
            code = '101'

        else:
            table_name = 'a' + code

        # 테이블이 생성되지 않았으면 테이블 생성
        self.dB.create_table(table_name)
        # 테이블에 입력된 데이터 중 가장 최근 날짜 획득
        recent_day = self.dB.select_max_date(table_name)

        if recent_day == self.date:
            return

        #  일봉 데이터 획득
        if code == '001' or code =='101':
            data = self.ki.req_index_daily_value(code, recent_day)
        else:
            data = self.ki.req_stock_daily_value(code, recent_day)
        # 테이블에 데이터 insert
        self.dB.insert_chart(data, table_name)

    def data_to_excel(self, code):
        if code == 'kospi':
            # 코스피 일봉 데이터 획득
            data = self.ki.req_index_daily_value('001', None)
            data.to_excel('./kospi.xlsx')
        elif code == 'kosdaq':
            # 코스닥 일봉 데이터 획득
            data = self.ki.req_index_daily_value('101', None)
            data.to_excel('./kosdaq.xlsx')
        else:
            # 종목 일봉 데이터 획득
            data = self.ki.req_stock_daily_value(code, None)
            data.to_excel('./a' + code + '.xlsx')


다음 코드는 DB에 로그인하는 부분이다. 'StockDB' 클래스의 init() 메서드를 호출한다. 'init()' 메서드 코드는 위에 링크된 "프로그램 DB 및 설계" 포스트에 있다. init() 메서드에 password를 전달하면 DB에 접속한다. 만약 패스워드가 틀리다면 False를 리턴한다. 
    def db_login(self,password):
        return self.dB.init(password)

아래 코드는 인자로 전달된 code 값이 올바른 지 확인한다. "ki.is_stock(code)" 메서드를 이용해 code 값을 가진 주식이 있는 지 확인한다. 해당 메서드는 위에 링크된 "키움 OPEN API 구현" 포스트에 있다. code 값이 올바르지 않다면 False를 리턴한다
    def is_stock(self,code):
        if code == 'kospi' or code == 'kosdaq' or  self.ki.is_stock(code) is not "":
            return True
        else:
            return False


다음 코드는 주식의 일봉 데이터를 엑셀로 저장한다. code에 해당하는 주식의 일봉 데이터를 요청한다. 결과 값은 'data'에 DataFrame 형식으로 저장된다. 'data.to_excel()' 메서드로 프로그램 설치 장소에 데이터를 엑셀로 변환한다. 

    def data_to_excel(self,code):
        if code == 'kospi':
            # 코스피 일봉 데이터 획득
            data = self.ki.req_index_daily_value('001', None)
            data.to_excel('./kospi.xlsx')
        elif code == 'kosdaq':
            # 코스닥 일봉 데이터 획득
            data = self.ki.req_index_daily_value('101', None)
            data.to_excel('./kosdaq.xlsx')
        else:
            # 종목 일봉 데이터 획득
            data = self.ki.req_stock_daily_value(code, None)
            data.to_excel('./a'+code+'.xlsx')


다음은 code에 해당하는 주식 일봉 데이터를 DB에 저장하는 소스이다. 소스에 달린 주석을 보면 이해 가능할 것이다. 참고로 'self.date'는 클래스 초기화 부분에서 생성한 변수로 프로그램을 실행한 어제 날짜를 가지고 있다. 'if recent_day == self. date' 는 DB에 저장된 데이터의 최근 날짜가 어제 날짜와 동일한 지 확인한다. 같다면 바로 리턴한다. 이미 주식 일봉 데이터 전체를 가지기 때문이다.(해당 프로그램은 어제까지 주식 일봉 데이터를 저장한다.) 

    def db_insert_stock(self, code):
        table_name = ""
        if code == 'kospi':
            table_name = code
            code = '001'

        elif code == 'kosdaq':
            table_name = code
            code = '101'

        else:
            table_name = 'a' + code

        # 테이블이 생성되지 않았으면 테이블 생성
        self.dB.create_table(table_name)
        # 테이블에 입력된 데이터 중 가장 최근 날짜 획득
        recent_day = self.dB.select_max_date(table_name)

        if recent_day == self.date:
            return

        #  일봉 데이터 획득
        if code == '001' or code =='101':
            data = self.ki.req_index_daily_value(code, recent_day)
        else:
            data = self.ki.req_stock_daily_value(code, recent_day)
        # 테이블에 데이터 insert
        self.dB.insert_chart(data, table_name)


여기까지 전체적인 프로그램 기능을 구현했다. 대부분이 이전 포스트에서 구현한 메서드들을 사용한 것이기에 해당 포스트까지 잘 따라왔다면 이해하기 쉬울 것이다. 전체 소스코드는 아래 첨부파일에 있다.


MainFunctions.py


다음 포스트에서는 프로그램 GUI를 구현한다. GUI만 구현하면 주가 일봉 데이터 저장 프로그램 개발을 마치게 된다. 

 

+ Recent posts