Showing
4 changed files
with
163 additions
and
6 deletions
proj/library/daily_info.py
0 → 100644
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 |
proj/library/minute_info.py
0 → 100644
File mode changed
... | @@ -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'] | ... | ... |
proj/library/stock_info.py
0 → 100644
File mode changed
-
Please register or login to post a comment