daily_info.py 6.72 KB
import datetime
from sqlalchemy import *
import pandas as pd
from pandas import DataFrame

import config

class DailyInfo():
    def __init__(self):
        self.date_setting()
        self.engine_setting()
        self.create_stocks()

    # 날짜 정보 설정
    def date_setting(self):
        self.today=datetime.datetime.today().strftime("%Y%m%d")
        self.start_date=config.start_buying

    # 데이터베이스 엔진 설정
    def engine_setting(self):
        self.engine_daily=create_engine(
            "mysql+pymysql://" + config.db_id + ":" + config.db_pw + "@" + config.db_ip + ":" + config.db_port +
            "/daily_info", encoding='utf-8')
        self.engine_stock=create_engine(
            "mysql+pymysql://" + config.db_id + ":" + config.db_pw + "@" + config.db_ip + ":" + config.db_port +
            "/stock_info", encoding='utf-8')

    # date에 해당하는 이름을 가진 테이블이 daily_info 데이터베이스 안에 존재하는지 확인하는 함수
    def is_date_table_exist(self,date):
        query = "select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
        result=self.engine_daily.execute(query%date).fetchall()
        if len(result)==0:
            return False
        else:
            return True

    def create_daily_table(self):
        print("setting daily_info database!!")
        self.get_date_list()

        for date in self.date_list:
            if not self.is_date_table_exist(date):
                print(date,"테이블이 존재하지 않습니다. 테이블을 생성합니다")

                daily_list=list()

                for i in range(len(self.all_list)):
                    code_name=self.all_list.loc[i][0]
                    code=self.all_list.loc[i][1]

                    if self.is_stock_table_exist(code,code_name):
                        query="select * from {} where date='{}' group by date"
                        result=self.engine_stock.execute(query.format(code_name,date)).fetchall()
                        daily_list+=result

                # diff_rate :   전날대비 가격 상승/하락률
                # close     :   종가
                # open      :   시가
                # high      :   고가
                # low       :   저가
                # volume    :   거래량
                # avg5      :   5일 이동평균선
                # ...
                # prev_avg5 :   전날의 5일 이동평균선
                # ...
                # vol5      :   5일동안 거래량의 평균
                # ...
                if (len(daily_list)!=0):
                    df=DataFrame(daily_list,
                                 columns=['index', 'date', 'code', 'code_name', 'diff_rate',
                                          'close', 'open', 'high', 'low', 'volume',
                                          'avg5', 'avg10', 'avg20', 'avg60', 'avg120',
                                          'prev_avg5', 'prev_avg10', 'prev_avg20', 'prev_avg60', 'prev_avg120',
                                          'vol5', 'vol10', 'vol20', 'vol60', 'vol120'
                                          ])
                    df.to_sql(name=date,con=self.engine_daily,if_exists='replace')

    # 지정한 날짜부터 현재까지의 날짜 리스트를 반환
    # 모든 지정한 날짜에 대해 정확한 값을 반환하기 위해
    # 한국에서 가장 오래된 상장기업 중 하나인 'CJ대한통운' 테이블을 활용한다
    def get_date_list(self):
        query="select date from 'CJ대한통운' where date>=%s group by date"
        self.date_list=self.engine_stock.execute(query%self.start_date)
        print(self.date_list)

    # 코스피 주식 리스트 저장
    def get_item_kospi(self):
        print("get_item_kospi!!")
        self.kospi_list = pd.read_html(
            'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13&marketType=stockMkt',
            header=0)[0]

        self.kospi_list.종목코드 = self.kospi_list.종목코드.map('{:06d}'.format)
        self.kospi_list = self.kospi_list[['회사명', '종목코드']]
        self.kospi_list = self.kospi_list.rename(columns={'회사명': 'code_name', '종목코드': 'code'})

    # 코스닥 주식 리스트 저장
    def get_item_kosdaq(self):
        print("get_item_kosdaq!!")
        self.kosdaq_list = pd.read_html(
            'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13&marketType=kosdaqMkt',
            header=0)[0]

        self.kosdaq_list.종목코드 = self.kosdaq_list.종목코드.map('{:06d}'.format)
        self.kosdaq_list = self.kosdaq_list[['회사명', '종목코드']]
        self.kosdaq_list = self.kosdaq_list.rename(columns={'회사명': 'code_name', '종목코드': 'code'})

    # 코스피 테이블 생성
    def create_kospi_table(self):
        self.get_item_kospi()
        table_kospi='stock_kospi'
        query="select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
        result=self.engine_daily.execute(query%table_kospi).fetchall()
        if len(result)==0:
            df=DataFrame(self.kospi_list)
            df.to_sql(name=table_kospi,con=self.engine_daily,if_exists='replace')

    # 코스닥 테이블 생성
    def create_kosdaq_table(self):
        self.get_item_kosdaq()
        table_kosdaq="stock_kosdaq"
        query = "select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
        result=self.engine_daily.execute(query%table_kosdaq).fetchall()
        if len(result)==0:
            df=DataFrame(self.kosdaq_list)
            df.to_sql(name=table_kosdaq,con=self.engine_daily,if_exists='replace')

    # 코스피 + 코스닥 테이블 생성
    def create_stock_all_table(self):
        self.all_list=pd.concat([self.kospi_list,self.kosdaq_list],ignore_index=True)
        table_all="stock_all"
        query = "select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
        result=self.engine_daily.execute(query%table_all).fetchall()
        if len(result)==0:
            self.all_list.to_sql(name=table_all,con=self.engine_daily,if_exists='replace')

    # 주식 리스트 생성
    def create_stocks(self):
        self.create_kospi_table()
        self.create_kosdaq_table()
        self.create_stock_all_table()

    # stock info 데이터베이스에 code_name 테이블이 존재하는지 확인하는 함수
    def is_stock_table_exist(self,code,code_name):
        query = "select 1 from information_schema.tables where table_schema ='stock_info' and table_name = '%s'"
        result=self.engine_stock.execute(query%code_name).fetchall()
        if len(result)==0:
            return False
        else:
            return True