daily_info.py
6.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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