이하영

daily_info데이터베이스 내 테이블 생성

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()
self.create_daily_table()
# 날짜 정보 설정
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
\ No newline at end of file
......@@ -24,6 +24,11 @@ class OpenApi(QAxWidget):
self.account_no=None # 계좌번호
self.ohlcv = None # 거래정보(시가,종가,고가,저가,거래량)
self.remained_data=None # 다음페이지 존재여부
self.simul_num=None # 모의투자 번호
self.db_name=None # 거래데이터를 담고 있는 AutoBot 데이터베이스
# engine list
self.engine_bot=None # AutoBot데이터베이스에 접속하는 engine
# screen number list
self.screen_data_req="0101" # 거래 데이터
......@@ -32,17 +37,16 @@ class OpenApi(QAxWidget):
self._signal_slots()
self.comm_connect() # 로그인
self.get_account_info() # 계좌정보 가져오기
self.variable_setting()
self.variable_setting() # 데이터베이스 설정
# 데이터베이스 설정
def variable_setting(self):
print("============variable setting function===============")
# 모의투자
if self.account_no==config.test_account_no:
print("test investment!!!!!!")
self.simul_num=config.simul_num1
# 모의투자인 경우
if self.account_no == config.test_account_no:
self.simul_num = config.simul_num1
self.db_name_setting(config.simul_name1)
# AutoBot Database 생성
def create_database(self,cursor):
print("create database")
......@@ -59,6 +63,7 @@ class OpenApi(QAxWidget):
else:
return False
# 데이터베이스 확인 및 생성
def db_name_setting(self,db_name):
self.db_name=db_name
print("db_name : %s"%self.db_name)
......@@ -77,6 +82,7 @@ class OpenApi(QAxWidget):
db_name, encoding='utf-8')
self.db_setting(cursor)
# AutoBot 이외에 필요한 데이터베이스를 생성
def db_setting(self,cursor):
# 생성해야 할 데이터베이스 리스트
to_create=['stock_info','daily_info','minute_info']
......