이하영

simulator

1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4"> 2 <project version="4">
3 - <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" /> 3 + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (py38_64)" project-jdk-type="Python SDK" />
4 </project> 4 </project>
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
2 <module type="PYTHON_MODULE" version="4"> 2 <module type="PYTHON_MODULE" version="4">
3 <component name="NewModuleRootManager"> 3 <component name="NewModuleRootManager">
4 <content url="file://$MODULE_DIR$" /> 4 <content url="file://$MODULE_DIR$" />
5 - <orderEntry type="inheritedJdk" /> 5 + <orderEntry type="jdk" jdkName="Python 3.8 (py38_64)" jdkType="Python SDK" />
6 <orderEntry type="sourceFolder" forTests="false" /> 6 <orderEntry type="sourceFolder" forTests="false" />
7 </component> 7 </component>
8 </module> 8 </module>
...\ No newline at end of file ...\ No newline at end of file
......
File mode changed
...@@ -35,7 +35,7 @@ class simulator_api: ...@@ -35,7 +35,7 @@ class simulator_api:
35 self.rotate_date() 35 self.rotate_date()
36 36
37 else: 37 else:
38 - logger.error("Invalid option") 38 + logger.error("Invalid simulator number/simulator option")
39 39
40 # 오늘 날짜를 설정하는 함수 40 # 오늘 날짜를 설정하는 함수
41 def date_setting(self): 41 def date_setting(self):
...@@ -54,6 +54,9 @@ class simulator_api: ...@@ -54,6 +54,9 @@ class simulator_api:
54 self.buy_stop=False # 거래를 중지하는 변수 54 self.buy_stop=False # 거래를 중지하는 변수
55 self.trade_check_num=False # 실시간 조건 매수 옵션. 분별 시뮬레이팅의 경우 True, 일별 시뮬레이팅의 경우 False 55 self.trade_check_num=False # 실시간 조건 매수 옵션. 분별 시뮬레이팅의 경우 True, 일별 시뮬레이팅의 경우 False
56 56
57 + self.use_ai=False # ai(deep learning) 알고리즘 사용 여부
58 + self.ai_num=1 # ai 알고리즘 번호
59 +
57 print("simul_num : ",self.simul_num) 60 print("simul_num : ",self.simul_num)
58 61
59 self.volume_limit=1000 62 self.volume_limit=1000
...@@ -266,7 +269,7 @@ class simulator_api: ...@@ -266,7 +269,7 @@ class simulator_api:
266 # 시뮬레이팅 할 날짜 리스트를 가져오는 함수 269 # 시뮬레이팅 할 날짜 리스트를 가져오는 함수
267 # 장이 열렸던 날을 self.date_rows에 담기 위해 gs글로벌의 date값을 이용 270 # 장이 열렸던 날을 self.date_rows에 담기 위해 gs글로벌의 date값을 이용
268 def get_date_for_simul(self): 271 def get_date_for_simul(self):
269 - query = f"select date from `gs글로벌` " \ 272 + query = f"select date from `대한항공` " \
270 f"where date >= '{self.simul_start_date}' and date <= '{self.simul_end_date}' group by date" 273 f"where date >= '{self.simul_start_date}' and date <= '{self.simul_end_date}' group by date"
271 self.date_rows = self.engine_daily_craw.execute(query).fetchall() 274 self.date_rows = self.engine_daily_craw.execute(query).fetchall()
272 275
...@@ -277,12 +280,12 @@ class simulator_api: ...@@ -277,12 +280,12 @@ class simulator_api:
277 return 280 return
278 281
279 query="select sum(valuation_profit) from all_stocks" 282 query="select sum(valuation_profit) from all_stocks"
280 - self.sum_valuation_profit=self.engine_simul.execute(query).fethcall()[0][0] # 총수익금 (종목별 평가 금액의 합) 283 + self.sum_valuation_profit=self.engine_simul.execute(query).fetchall()[0][0] # 총수익금 (종목별 평가 금액의 합)
281 284
282 self.total_invest_price=self.start_invest_price+self.sum_valuation_profit # 총자산 285 self.total_invest_price=self.start_invest_price+self.sum_valuation_profit # 총자산
283 286
284 query="select sum(item_total_purchase) from all_stocks where sell_date='%s'" 287 query="select sum(item_total_purchase) from all_stocks where sell_date='%s'"
285 - self.total_purchase_price=self.engine_simul.execute(query%(0)).fethcall()[0][0] # 총투자금액 288 + self.total_purchase_price=self.engine_simul.execute(query%(0)).fetchall()[0][0] # 총투자금액
286 if self.total_purchase_price is None: 289 if self.total_purchase_price is None:
287 self.total_purchase_price=0 290 self.total_purchase_price=0
288 291
...@@ -436,12 +439,12 @@ class simulator_api: ...@@ -436,12 +439,12 @@ class simulator_api:
436 if self.is_date_exist(date_rows_today) and self.is_date_exist(date_rows_yesterday): 439 if self.is_date_exist(date_rows_today) and self.is_date_exist(date_rows_yesterday):
437 self.db_to_realtime_daily_buy_list(date_rows_today, date_rows_yesterday, i) # 매수리스트 확인 440 self.db_to_realtime_daily_buy_list(date_rows_today, date_rows_yesterday, i) # 매수리스트 확인
438 self.trading_by_min(date_rows_today, date_rows_yesterday, i) # 시뮬레이팅 시작 441 self.trading_by_min(date_rows_today, date_rows_yesterday, i) # 시뮬레이팅 시작
439 - self.db_to_jango(date_rows_today) # 잔고 테이블 업데이트
440 442
441 # all_stocks 테이블이 존재하고, 현재 보유 중인 종목이 있는 경우, 해당 종목에 대해 데이터베이스 업데이트 443 # all_stocks 테이블이 존재하고, 현재 보유 중인 종목이 있는 경우, 해당 종목에 대해 데이터베이스 업데이트
442 if self.is_simul_table_exist(self.db_name, "all_stocks") and len(self.get_data_from_possessed_item()) != 0: 444 if self.is_simul_table_exist(self.db_name, "all_stocks") and len(self.get_data_from_possessed_item()) != 0:
443 self.update_all_db_by_date(date_rows_today, option='ALL') 445 self.update_all_db_by_date(date_rows_today, option='ALL')
444 446
447 + self.db_to_jango(date_rows_today) # 정산
445 else: 448 else:
446 print("테이블이 존재하지 않습니다") 449 print("테이블이 존재하지 않습니다")
447 450
...@@ -464,13 +467,13 @@ class simulator_api: ...@@ -464,13 +467,13 @@ class simulator_api:
464 realtime_daily_buy_list=None # 다음날 매수할 종목 리스트를 저장하는 변수 467 realtime_daily_buy_list=None # 다음날 매수할 종목 리스트를 저장하는 변수
465 # (5,20) 골든크로스 468 # (5,20) 골든크로스
466 if self.db_to_realtime_daily_buy_list_num == 1: 469 if self.db_to_realtime_daily_buy_list_num == 1:
467 - query=f"select * from '{date_rows_yesterday}' " \ 470 + query=f"select * from `{date_rows_yesterday}` " \
468 f"where yes_clo20>yes_clo5 and clo5>clo20 and close<'{self.invest_unit}' group by code" 471 f"where yes_clo20>yes_clo5 and clo5>clo20 and close<'{self.invest_unit}' group by code"
469 realtime_daily_buy_list=self.engine_daily_buy_list.execute(query).fetchall() 472 realtime_daily_buy_list=self.engine_daily_buy_list.execute(query).fetchall()
470 473
471 # (20,60) 골든크로스 474 # (20,60) 골든크로스
472 elif self.db_to_realtime_daily_buy_list_num == 2: 475 elif self.db_to_realtime_daily_buy_list_num == 2:
473 - query = f"select * from '{date_rows_yesterday}' " \ 476 + query = f"select * from `{date_rows_yesterday}` " \
474 f"where yes_clo40 > yes_clo5 and clo5 > clo40 and close < '{self.invest_unit}' group by code" 477 f"where yes_clo40 > yes_clo5 and clo5 > clo40 and close < '{self.invest_unit}' group by code"
475 realtime_daily_buy_list = self.engine_daily_buy_list.execute(query).fetchall() 478 realtime_daily_buy_list = self.engine_daily_buy_list.execute(query).fetchall()
476 479
...@@ -526,7 +529,7 @@ class simulator_api: ...@@ -526,7 +529,7 @@ class simulator_api:
526 realtime_daily_buy_list=self.engine_simul.execute(query).fetchall() 529 realtime_daily_buy_list=self.engine_simul.execute(query).fetchall()
527 530
528 self.df_realtime_daily_buy_list=DataFrame(realtime_daily_buy_list, 531 self.df_realtime_daily_buy_list=DataFrame(realtime_daily_buy_list,
529 - columns=['index', 'index2', 'date', 'check_item', 'code', 532 + columns=['index', 'index2', 'index3','date', 'check_item', 'code',
530 'code_name', 'd1_diff','d1_diff_rate', 533 'code_name', 'd1_diff','d1_diff_rate',
531 'close', 'open', 'high','low', 'volume', 534 'close', 'open', 'high','low', 'volume',
532 'clo5', 'clo10', 'clo20', 'clo60', 'clo120', 535 'clo5', 'clo10', 'clo20', 'clo60', 'clo120',
...@@ -547,11 +550,11 @@ class simulator_api: ...@@ -547,11 +550,11 @@ class simulator_api:
547 self.update_all_db_by_date(date_rows_today,option='OPEN') 550 self.update_all_db_by_date(date_rows_today,option='OPEN')
548 551
549 # 분별 시간 데이터를 가져오기 552 # 분별 시간 데이터를 가져오기
550 - self.get_min_data_for_simul(date_rows_today) 553 + self.get_date_min_for_simul(date_rows_today)
551 - if len(self.min_data_rows)!=0: 554 + if len(self.min_date_rows)!=0:
552 # 분 단위로 시뮬레이팅 555 # 분 단위로 시뮬레이팅
553 - for t in range(len(self.min_data_rows)): 556 + for t in range(len(self.min_date_rows)):
554 - min=self.min_data_rows[t][0] 557 + min=self.min_date_rows[t][0]
555 # 현재 보유 종목이 있는 경우 558 # 현재 보유 종목이 있는 경우
556 if self.is_simul_table_exist(self.db_name,"all_stocks") and len(self.get_data_from_possessed_item())!=0: 559 if self.is_simul_table_exist(self.db_name,"all_stocks") and len(self.get_data_from_possessed_item())!=0:
557 self.show_info(min) 560 self.show_info(min)
...@@ -627,13 +630,13 @@ class simulator_api: ...@@ -627,13 +630,13 @@ class simulator_api:
627 # 보유한 종목의 이름을 반환하는 함수 630 # 보유한 종목의 이름을 반환하는 함수
628 def get_data_from_possessed_item(self): 631 def get_data_from_possessed_item(self):
629 query="select code_name from all_stocks where sell_date='0'" 632 query="select code_name from all_stocks where sell_date='0'"
630 - result=self.engine_simul.execute(query).fetchall() 633 + return self.engine_simul.execute(query).fetchall()
631 - return result[0][0]
632 634
633 # daily_buy_list를 통해 특정 날짜에 해당하는 주가정보를 가져오는 함수 635 # daily_buy_list를 통해 특정 날짜에 해당하는 주가정보를 가져오는 함수
634 def get_now_price_by_date(self,code_name,date): 636 def get_now_price_by_date(self,code_name,date):
637 + print(code_name)
635 query = f"select d1_diff,d1_diff_rate, close, open, high, low, volume, clo5, clo10, clo20, clo60, clo120 " \ 638 query = f"select d1_diff,d1_diff_rate, close, open, high, low, volume, clo5, clo10, clo20, clo60, clo120 " \
636 - f"from '{date}' " \ 639 + f"from `{date}` " \
637 f"where code_name = '{code_name}' group by code" 640 f"where code_name = '{code_name}' group by code"
638 result=self.engine_daily_buy_list.execute(query).fetchall() 641 result=self.engine_daily_buy_list.execute(query).fetchall()
639 642
...@@ -675,7 +678,7 @@ class simulator_api: ...@@ -675,7 +678,7 @@ class simulator_api:
675 simul_start_date_min=simul_start_date+self.start_min # 장 시작시간 = 9시 678 simul_start_date_min=simul_start_date+self.start_min # 장 시작시간 = 9시
676 simul_end_date_min=simul_start_date+"1530" # 장 마감시간 = 3시 30분 679 simul_end_date_min=simul_start_date+"1530" # 장 마감시간 = 3시 30분
677 680
678 - query = f"select date from `gs글로벌` " \ 681 + query = f"select date from `대한항공` " \
679 f"where date >= '{simul_start_date_min}' and date <='{simul_end_date_min}' and open != 0 group by date" 682 f"where date >= '{simul_start_date_min}' and date <='{simul_end_date_min}' and open != 0 group by date"
680 self.min_date_rows = self.engine_craw.execute(query).fetchall() 683 self.min_date_rows = self.engine_craw.execute(query).fetchall()
681 684
...@@ -684,16 +687,16 @@ class simulator_api: ...@@ -684,16 +687,16 @@ class simulator_api:
684 possessed_code_name=self.get_data_from_possessed_item() 687 possessed_code_name=self.get_data_from_possessed_item()
685 for i in range(len(possessed_code_name)): 688 for i in range(len(possessed_code_name)):
686 code_name=possessed_code_name[i][0] 689 code_name=possessed_code_name[i][0]
687 - current_close_price=self.get_current_close_price_by_min(code_name,min) 690 + current_close_price=self.get_now_close_price_by_min(code_name,min)
688 if current_close_price: 691 if current_close_price:
689 - self.db_to_transaction_update_present_price_by_min(code_name,current_close_price) 692 + self.db_to_all_stocks_present_price_update_by_min(code_name,current_close_price)
690 else: 693 else:
691 continue 694 continue
692 695
693 # 분별 현재 종가(close)를 가져오는 함수 696 # 분별 현재 종가(close)를 가져오는 함수
694 # 분별 데이터에서 종가는 현재가를 의미하므로 1분마다 시세를 가져오는 함수 697 # 분별 데이터에서 종가는 현재가를 의미하므로 1분마다 시세를 가져오는 함수
695 - def get_current_close_price_by_min(self,code_name,min): 698 + def get_now_close_price_by_min(self,code_name,min):
696 - query=f"select close from '{code_name}' " \ 699 + query=f"select close from `{code_name}` " \
697 f"where date='{min}' and open!=0 and volume!=0 order by sum_volume desc limit 1" 700 f"where date='{min}' and open!=0 and volume!=0 order by sum_volume desc limit 1"
698 result=self.engine_craw.execute(query).fethcall() 701 result=self.engine_craw.execute(query).fethcall()
699 if len(result)==1: 702 if len(result)==1:
...@@ -703,7 +706,7 @@ class simulator_api: ...@@ -703,7 +706,7 @@ class simulator_api:
703 706
704 # 보유한 종목에 현재가를 실시간으로 업데이트하는 함수 707 # 보유한 종목에 현재가를 실시간으로 업데이트하는 함수
705 def db_to_all_stocks_present_price_update_by_min(self,code_name,current_close_price): 708 def db_to_all_stocks_present_price_update_by_min(self,code_name,current_close_price):
706 - query=f"update all_stocks set present_price={current_close_price} " \ 709 + query=f"update all_stocks set present_price='{current_close_price}' " \
707 f"where code_name={code_name} and sell_date='{0}'" 710 f"where code_name={code_name} and sell_date='{0}'"
708 self.engine_simul.execute(query) 711 self.engine_simul.execute(query)
709 712
...@@ -874,7 +877,7 @@ class simulator_api: ...@@ -874,7 +877,7 @@ class simulator_api:
874 877
875 # 특정 날짜의 테이블에서 특정 종목의 시가를 가져오는 함수 878 # 특정 날짜의 테이블에서 특정 종목의 시가를 가져오는 함수
876 def get_now_open_price_by_date(self,code,date): 879 def get_now_open_price_by_date(self,code,date):
877 - query=f"select open from '{date}' where code = '{code}' group by code" 880 + query=f"select open from `{date}` where code = '{code}' group by code"
878 open=self.engine_daily_buy_list.execute(query).fetchall() 881 open=self.engine_daily_buy_list.execute(query).fetchall()
879 if len(open)==1: 882 if len(open)==1:
880 return open[0][0] 883 return open[0][0]
...@@ -883,7 +886,7 @@ class simulator_api: ...@@ -883,7 +886,7 @@ class simulator_api:
883 886
884 # 전날 종가(close)를 가져오는 함수 887 # 전날 종가(close)를 가져오는 함수
885 def get_yes_close_price_by_date(self,code,date): 888 def get_yes_close_price_by_date(self,code,date):
886 - query = f"select close from '{date}' where code = '{code}' group by code" 889 + query = f"select close from `{date}` where code = '{code}' group by code"
887 result = self.engine_daily_buy_list.execute(query).fetchall() 890 result = self.engine_daily_buy_list.execute(query).fetchall()
888 if len(result) == 1: 891 if len(result) == 1:
889 return result[0][0] 892 return result[0][0]
...@@ -892,7 +895,7 @@ class simulator_api: ...@@ -892,7 +895,7 @@ class simulator_api:
892 895
893 # 분별 현재 누적 거래량을 가져오는 함수 896 # 분별 현재 누적 거래량을 가져오는 함수
894 def get_now_volume_by_min(self,code_name,min): 897 def get_now_volume_by_min(self,code_name,min):
895 - query= f"select sum_volume from '{code_name}' " \ 898 + query= f"select sum_volume from `{code_name}` " \
896 f"where date = '{min}' and open != 0 and volume !=0 order by sum_volume desc limit 1" 899 f"where date = '{min}' and open != 0 and volume !=0 order by sum_volume desc limit 1"
897 result = self.engine_craw.execute(query).fetchall() 900 result = self.engine_craw.execute(query).fetchall()
898 if len(result) == 1: 901 if len(result) == 1:
...@@ -1000,8 +1003,8 @@ class simulator_api: ...@@ -1000,8 +1003,8 @@ class simulator_api:
1000 self.df_all_stocks.loc[0, 'clo5'] = df.loc[index, 'clo5'] 1003 self.df_all_stocks.loc[0, 'clo5'] = df.loc[index, 'clo5']
1001 self.df_all_stocks.loc[0, 'clo10'] = df.loc[index, 'clo10'] 1004 self.df_all_stocks.loc[0, 'clo10'] = df.loc[index, 'clo10']
1002 self.df_all_stocks.loc[0, 'clo20'] = df.loc[index, 'clo20'] 1005 self.df_all_stocks.loc[0, 'clo20'] = df.loc[index, 'clo20']
1003 - self.df_all_stocks.loc[0, 'clo60'] = df.loc[index, 'clo40'] 1006 + self.df_all_stocks.loc[0, 'clo60'] = df.loc[index, 'clo60']
1004 - self.df_all_stocks.loc[0, 'clo120'] = df.loc[index, 'clo60'] 1007 + self.df_all_stocks.loc[0, 'clo120'] = df.loc[index, 'clo120']
1005 1008
1006 if df.loc[index, 'clo5_diff_rate'] is not None: 1009 if df.loc[index, 'clo5_diff_rate'] is not None:
1007 self.df_all_stocks.loc[0, 'clo5_diff_rate'] = float(df.loc[index, 'clo5_diff_rate']) 1010 self.df_all_stocks.loc[0, 'clo5_diff_rate'] = float(df.loc[index, 'clo5_diff_rate'])
...@@ -1212,7 +1215,7 @@ class simulator_api: ...@@ -1212,7 +1215,7 @@ class simulator_api:
1212 1215
1213 # 최근 daily_buy_list의 날짜 테이블에서 code에 해당하는 데이터만 가져오는 함수 1216 # 최근 daily_buy_list의 날짜 테이블에서 code에 해당하는 데이터만 가져오는 함수
1214 def get_daily_buy_list_by_code(self,code,date): 1217 def get_daily_buy_list_by_code(self,code,date):
1215 - query = f"select * from '{date}' where code = '{code}' group by code" 1218 + query = f"select * from `{date}` where code = '{code}' group by code"
1216 1219
1217 daily_buy_list = self.engine_daily_buy_list.execute(query).fetchall() 1220 daily_buy_list = self.engine_daily_buy_list.execute(query).fetchall()
1218 1221
...@@ -1229,7 +1232,7 @@ class simulator_api: ...@@ -1229,7 +1232,7 @@ class simulator_api:
1229 1232
1230 # 현재 특정 종목의 종가를 가져오는 함수 1233 # 현재 특정 종목의 종가를 가져오는 함수
1231 def get_now_close_price_by_date(self,code,date): 1234 def get_now_close_price_by_date(self,code,date):
1232 - query=f"select close from '{date}' where code='{code}' group by code" 1235 + query=f"select close from `{date}` where code='{code}' group by code"
1233 result=self.engine_daily_buy_list.execute(query).fetchall() 1236 result=self.engine_daily_buy_list.execute(query).fetchall()
1234 1237
1235 if len(result)==1: 1238 if len(result)==1:
......
No preview for this file type
No preview for this file type
...@@ -24,7 +24,7 @@ real_daily_buy_list_db_name = "daily_buy_list" ...@@ -24,7 +24,7 @@ real_daily_buy_list_db_name = "daily_buy_list"
24 start_daily_buy_list='20190102' 24 start_daily_buy_list='20190102'
25 25
26 # api를 최대 몇 번까지 호출 하고 봇을 끌지 설정 하는 옵션 26 # api를 최대 몇 번까지 호출 하고 봇을 끌지 설정 하는 옵션
27 -max_api_call=98 27 +max_api_call=998
28 28
29 # openapi 1회 조회 시 대기 시간(0.2 보다-> 0.3이 안정적) 29 # openapi 1회 조회 시 대기 시간(0.2 보다-> 0.3이 안정적)
30 TR_REQ_TIME_INTERVAL = 0.3 30 TR_REQ_TIME_INTERVAL = 0.3
......
1 +lxml
2 +PyQt5
3 +pymysql
4 +selenium
5 +numpy
6 +dart_fss
7 +sqlalchemy
8 +pandas
9 +cryptography
...\ No newline at end of file ...\ No newline at end of file
1 +lxml
2 +pymysql
3 +selenium
4 +numpy<1.19.0
5 +sqlalchemy
6 +pandas
7 +dart_fss
8 +PyQt5
9 +cryptography
10 +
11 +matplotlib
12 +sklearn
13 +tensorflow==2.3.0
14 +keras==2.4.3
...\ No newline at end of file ...\ No newline at end of file
1 +from library.simulator_api import *
2 +
3 +class Simulator:
4 + def __init__(self):
5 + self.set_info()
6 + self.input_value()
7 +
8 + def set_info(self):
9 + self.simul_num=int(input("시뮬레이팅 알고리즘 번호 선택 : "))
10 + option=str(input("시뮬레이팅 데이터베이스 초기화 여부 (y/n) : "))
11 +
12 + if option=="y":
13 + self.simul_reset='reset'
14 + elif option=="n":
15 + self.simul_reset='continue'
16 + else:
17 + print("Invalid Input")
18 + sys.exit()
19 +
20 + def input_value(self):
21 + simulator_api(self.simul_num,self.simul_reset,0)
22 +
23 +if __name__=="__main__":
24 + Simulator()
...\ No newline at end of file ...\ No newline at end of file
...@@ -100,6 +100,9 @@ class Trader(QMainWindow): ...@@ -100,6 +100,9 @@ class Trader(QMainWindow):
100 if self.open_api.jango_check() and self.buy_time_check() and self.open_api.buy_check(): 100 if self.open_api.jango_check() and self.buy_time_check() and self.open_api.buy_check():
101 self.auto_trade_stock() 101 self.auto_trade_stock()
102 102
103 + else:
104 + break
105 +
103 if __name__ == "__main__": 106 if __name__ == "__main__":
104 app = QApplication(sys.argv) 107 app = QApplication(sys.argv)
105 trader = Trader() 108 trader = Trader()
......