daily_info.py
4.25 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
import datetime
from sqlalchemy import *
from pandas import DataFrame
import config
class Daily_Info():
def __init__(self):
self.set_variable()
def set_variable(self):
self.today=datetime.datetime.today().strftime("%Y%m%d")
self.today_time=datetime.datetime.today().strftime("%Y%m%d%H%M")
self.start_date=config.start_buying
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')
# 지정한 날짜부터 현재까지의 날짜 리스트를 반환
# 모든 지정한 날짜에 대해 정확한 값을 반환하기 위해
# 한국에서 가장 오래된 상장기업 중 하나인 'CJ대한통운' 테이블을 활용한다
def set_date_rows(self):
query="select date from 'CJ대한통운' where date>=%s group by date"
self.date_rows=self.engine_stock.execute(query%self.start_date)
# 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.set_date_rows()
self.get_all_stock_list()
for date in self.date_rows:
if not self.is_date_table_exist(date):
print(date,"테이블이 존재하지 않습니다. 테이블을 생성합니다")
daily_list=list()
for i in range(len(self.stock_all)):
code_name=self.stock_all.loc[i][0]
code=self.stock_all.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')
# 데이터베이스에 저장된 모든 주식 리스트를 가져오는 함수
def get_all_stock_list(self):
query="select code_name,code from stock_all"
self.stock_all=self.engine_daily.execute(query).fetchall()
# 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