이하영

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

1 +import datetime
2 +from sqlalchemy import *
3 +import pandas as pd
4 +from pandas import DataFrame
5 +
6 +import config
7 +
8 +class DailyInfo():
9 + def __init__(self):
10 + self.date_setting()
11 + self.engine_setting()
12 + self.create_stocks()
13 + self.create_daily_table()
14 +
15 + # 날짜 정보 설정
16 + def date_setting(self):
17 + self.today=datetime.datetime.today().strftime("%Y%m%d")
18 + self.start_date=config.start_buying
19 +
20 + # 데이터베이스 엔진 설정
21 + def engine_setting(self):
22 + self.engine_daily=create_engine(
23 + "mysql+pymysql://" + config.db_id + ":" + config.db_pw + "@" + config.db_ip + ":" + config.db_port +
24 + "/daily_info", encoding='utf-8')
25 + self.engine_stock=create_engine(
26 + "mysql+pymysql://" + config.db_id + ":" + config.db_pw + "@" + config.db_ip + ":" + config.db_port +
27 + "/stock_info", encoding='utf-8')
28 +
29 + # date에 해당하는 이름을 가진 테이블이 daily_info 데이터베이스 안에 존재하는지 확인하는 함수
30 + def is_date_table_exist(self,date):
31 + query = "select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
32 + result=self.engine_daily.execute(query%date).fetchall()
33 + if len(result)==0:
34 + return False
35 + else:
36 + return True
37 +
38 + def create_daily_table(self):
39 + print("setting daily_info database!!")
40 + self.get_date_list()
41 +
42 + for date in self.date_list:
43 + if not self.is_date_table_exist(date):
44 + print(date,"테이블이 존재하지 않습니다. 테이블을 생성합니다")
45 +
46 + daily_list=list()
47 +
48 + for i in range(len(self.all_list)):
49 + code_name=self.all_list.loc[i][0]
50 + code=self.all_list.loc[i][1]
51 +
52 + if self.is_stock_table_exist(code,code_name):
53 + query="select * from {} where date='{}' group by date"
54 + result=self.engine_stock.execute(query.format(code_name,date)).fetchall()
55 + daily_list+=result
56 +
57 + # diff_rate : 전날대비 가격 상승/하락률
58 + # close : 종가
59 + # open : 시가
60 + # high : 고가
61 + # low : 저가
62 + # volume : 거래량
63 + # avg5 : 5일 이동평균선
64 + # ...
65 + # prev_avg5 : 전날의 5일 이동평균선
66 + # ...
67 + # vol5 : 5일동안 거래량의 평균
68 + # ...
69 + if (len(daily_list)!=0):
70 + df=DataFrame(daily_list,
71 + columns=['index', 'date', 'code', 'code_name', 'diff_rate',
72 + 'close', 'open', 'high', 'low', 'volume',
73 + 'avg5', 'avg10', 'avg20', 'avg60', 'avg120',
74 + 'prev_avg5', 'prev_avg10', 'prev_avg20', 'prev_avg60', 'prev_avg120',
75 + 'vol5', 'vol10', 'vol20', 'vol60', 'vol120'
76 + ])
77 + df.to_sql(name=date,con=self.engine_daily,if_exists='replace')
78 +
79 + # 지정한 날짜부터 현재까지의 날짜 리스트를 반환
80 + # 모든 지정한 날짜에 대해 정확한 값을 반환하기 위해
81 + # 한국에서 가장 오래된 상장기업 중 하나인 'CJ대한통운' 테이블을 활용한다
82 + def get_date_list(self):
83 + query="select date from 'CJ대한통운' where date>=%s group by date"
84 + self.date_list=self.engine_stock.execute(query%self.start_date)
85 + print(self.date_list)
86 +
87 + # 코스피 주식 리스트 저장
88 + def get_item_kospi(self):
89 + print("get_item_kospi!!")
90 + self.kospi_list = pd.read_html(
91 + 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13&marketType=stockMkt',
92 + header=0)[0]
93 +
94 + self.kospi_list.종목코드 = self.kospi_list.종목코드.map('{:06d}'.format)
95 + self.kospi_list = self.kospi_list[['회사명', '종목코드']]
96 + self.kospi_list = self.kospi_list.rename(columns={'회사명': 'code_name', '종목코드': 'code'})
97 +
98 + # 코스닥 주식 리스트 저장
99 + def get_item_kosdaq(self):
100 + print("get_item_kosdaq!!")
101 + self.kosdaq_list = pd.read_html(
102 + 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13&marketType=kosdaqMkt',
103 + header=0)[0]
104 +
105 + self.kosdaq_list.종목코드 = self.kosdaq_list.종목코드.map('{:06d}'.format)
106 + self.kosdaq_list = self.kosdaq_list[['회사명', '종목코드']]
107 + self.kosdaq_list = self.kosdaq_list.rename(columns={'회사명': 'code_name', '종목코드': 'code'})
108 +
109 + # 코스피 테이블 생성
110 + def create_kospi_table(self):
111 + self.get_item_kospi()
112 + table_kospi='stock_kospi'
113 + query="select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
114 + result=self.engine_daily.execute(query%table_kospi).fetchall()
115 + if len(result)==0:
116 + df=DataFrame(self.kospi_list)
117 + df.to_sql(name=table_kospi,con=self.engine_daily,if_exists='replace')
118 +
119 + # 코스닥 테이블 생성
120 + def create_kosdaq_table(self):
121 + self.get_item_kosdaq()
122 + table_kosdaq="stock_kosdaq"
123 + query = "select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
124 + result=self.engine_daily.execute(query%table_kosdaq).fetchall()
125 + if len(result)==0:
126 + df=DataFrame(self.kosdaq_list)
127 + df.to_sql(name=table_kosdaq,con=self.engine_daily,if_exists='replace')
128 +
129 + # 코스피 + 코스닥 테이블 생성
130 + def create_stock_all_table(self):
131 + self.all_list=pd.concat([self.kospi_list,self.kosdaq_list],ignore_index=True)
132 + table_all="stock_all"
133 + query = "select 1 from information_schema.tables where table_schema ='daily_info' and table_name = '%s'"
134 + result=self.engine_daily.execute(query%table_all).fetchall()
135 + if len(result)==0:
136 + self.all_list.to_sql(name=table_all,con=self.engine_daily,if_exists='replace')
137 +
138 + # 주식 리스트 생성
139 + def create_stocks(self):
140 + self.create_kospi_table()
141 + self.create_kosdaq_table()
142 + self.create_stock_all_table()
143 +
144 + # stock info 데이터베이스에 code_name 테이블이 존재하는지 확인하는 함수
145 + def is_stock_table_exist(self,code,code_name):
146 + query = "select 1 from information_schema.tables where table_schema ='stock_info' and table_name = '%s'"
147 + result=self.engine_stock.execute(query%code_name).fetchall()
148 + if len(result)==0:
149 + return False
150 + else:
151 + return True
...\ No newline at end of file ...\ No newline at end of file
...@@ -24,6 +24,11 @@ class OpenApi(QAxWidget): ...@@ -24,6 +24,11 @@ class OpenApi(QAxWidget):
24 self.account_no=None # 계좌번호 24 self.account_no=None # 계좌번호
25 self.ohlcv = None # 거래정보(시가,종가,고가,저가,거래량) 25 self.ohlcv = None # 거래정보(시가,종가,고가,저가,거래량)
26 self.remained_data=None # 다음페이지 존재여부 26 self.remained_data=None # 다음페이지 존재여부
27 + self.simul_num=None # 모의투자 번호
28 + self.db_name=None # 거래데이터를 담고 있는 AutoBot 데이터베이스
29 +
30 + # engine list
31 + self.engine_bot=None # AutoBot데이터베이스에 접속하는 engine
27 32
28 # screen number list 33 # screen number list
29 self.screen_data_req="0101" # 거래 데이터 34 self.screen_data_req="0101" # 거래 데이터
...@@ -32,17 +37,16 @@ class OpenApi(QAxWidget): ...@@ -32,17 +37,16 @@ class OpenApi(QAxWidget):
32 self._signal_slots() 37 self._signal_slots()
33 self.comm_connect() # 로그인 38 self.comm_connect() # 로그인
34 self.get_account_info() # 계좌정보 가져오기 39 self.get_account_info() # 계좌정보 가져오기
35 - self.variable_setting() 40 + self.variable_setting() # 데이터베이스 설정
36 41
42 + # 데이터베이스 설정
37 def variable_setting(self): 43 def variable_setting(self):
38 print("============variable setting function===============") 44 print("============variable setting function===============")
39 - # 모의투자 45 + # 모의투자인 경우
40 - if self.account_no==config.test_account_no: 46 + if self.account_no == config.test_account_no:
41 - print("test investment!!!!!!") 47 + self.simul_num = config.simul_num1
42 - self.simul_num=config.simul_num1
43 self.db_name_setting(config.simul_name1) 48 self.db_name_setting(config.simul_name1)
44 49
45 -
46 # AutoBot Database 생성 50 # AutoBot Database 생성
47 def create_database(self,cursor): 51 def create_database(self,cursor):
48 print("create database") 52 print("create database")
...@@ -59,6 +63,7 @@ class OpenApi(QAxWidget): ...@@ -59,6 +63,7 @@ class OpenApi(QAxWidget):
59 else: 63 else:
60 return False 64 return False
61 65
66 + # 데이터베이스 확인 및 생성
62 def db_name_setting(self,db_name): 67 def db_name_setting(self,db_name):
63 self.db_name=db_name 68 self.db_name=db_name
64 print("db_name : %s"%self.db_name) 69 print("db_name : %s"%self.db_name)
...@@ -77,6 +82,7 @@ class OpenApi(QAxWidget): ...@@ -77,6 +82,7 @@ class OpenApi(QAxWidget):
77 db_name, encoding='utf-8') 82 db_name, encoding='utf-8')
78 self.db_setting(cursor) 83 self.db_setting(cursor)
79 84
85 + # AutoBot 이외에 필요한 데이터베이스를 생성
80 def db_setting(self,cursor): 86 def db_setting(self,cursor):
81 # 생성해야 할 데이터베이스 리스트 87 # 생성해야 할 데이터베이스 리스트
82 to_create=['stock_info','daily_info','minute_info'] 88 to_create=['stock_info','daily_info','minute_info']
......