class MyWindow(QMainWindow, form_class): def __init__(self): super().__init__() self.setupUi(self) self.kiwoom = Kiwoom() self.kiwoom.CommConnect() self.timer = QTimer(self) self.timer.start(1000) self.timer.timeout.connect(self.timeout) # Get Account Number accouns_num = int(self.kiwoom.GetLoginInfo("ACCOUNT_CNT")) accounts = self.kiwoom.GetLoginInfo("ACCNO") accounts_list = accounts.split(';')[0:accouns_num] self.comboBox.addItems(accounts_list) self.lineEdit.textChanged.connect(self.code_changed) self.pushButton.clicked.connect(self.send_order) def timeout(self): current_time = QTime.currentTime() text_time = current_time.toString("hh:mm:ss") time_msg = "현재시간: " + text_time state = self.kiwoom.GetConnectState() if state == 1: state_msg = "서버 연결 중" else: state_msg = "서버 미 연결 중" self.statusbar.showMessage(state_msg + " | " + time_msg) def code_changed(self): code = self.lineEdit.text() code_name = self.kiwoom.GetMasterCodeName(code) self.lineEdit_2.setText(code_name) def send_order(self): order_type_lookup = {'신규매수': 1, '신규매도': 2, '매수취소': 3, '매도취소': 4} hoga_lookup = {'지정가': "00", '시장가': "03"} account = self.comboBox.currentText() order_type = self.comboBox_2.currentText() code = self.lineEdit.text() hoga = self.comboBox_3.currentText() num = self.spinBox.value() price = self.spinBox_2.value() self.kiwoom.SendOrder("SendOrder_req", "0101", account, order_type_lookup[order_type], code, num, price, hoga_lookup[hoga], "")
class MyWindow(QMainWindow, form_class): def __init__(self): super().__init__() self.setupUi(self) self.kiwoom = Kiwoom() self.kiwoom.CommConnect() # Timer self.timer = QTimer(self) self.timer.start(1000) self.timer.timeout.connect(self.timeout) # Timer2 self.timer2 = QTimer(self) self.timer2.start(1000 * 10) self.timer2.timeout.connect(self.timeout2) # Get Account Number accouns_num = int(self.kiwoom.GetLoginInfo("ACCOUNT_CNT")) accounts = self.kiwoom.GetLoginInfo("ACCNO") accounts_list = accounts.split(';')[0:accouns_num] self.comboBox.addItems(accounts_list) self.lineEdit.textChanged.connect(self.code_changed) self.pushButton.clicked.connect(self.send_order) self.pushButton_2.clicked.connect(self.check_balance) def timeout2(self): if self.checkBox.isChecked() == True: self.check_balance() def timeout(self): current_time = QTime.currentTime() text_time = current_time.toString("hh:mm:ss") time_msg = "현재시간: " + text_time state = self.kiwoom.GetConnectState() if state == 1: state_msg = "서버 연결 중" else: state_msg = "서버 미 연결 중" self.statusbar.showMessage(state_msg + " | " + time_msg) def code_changed(self): code = self.lineEdit.text() code_name = self.kiwoom.GetMasterCodeName(code) self.lineEdit_2.setText(code_name) def send_order(self): order_type_lookup = {'신규매수': 1, '신규매도': 2, '매수취소': 3, '매도취소': 4} hoga_lookup = {'지정가': "00", '시장가': "03"} account = self.comboBox.currentText() order_type = self.comboBox_2.currentText() code = self.lineEdit.text() hoga = self.comboBox_3.currentText() num = self.spinBox.value() price = self.spinBox_2.value() self.kiwoom.SendOrder("SendOrder_req", "0101", account, order_type_lookup[order_type], code, num, price, hoga_lookup[hoga], "") def check_balance(self): self.kiwoom.init_opw00018_data() # Request opw00018 self.kiwoom.SetInputValue("계좌번호", "8080996211") self.kiwoom.SetInputValue("비밀번호", "0000") self.kiwoom.CommRqData("opw00018_req", "opw00018", 0, "2000") while self.kiwoom.prev_next == '2': time.sleep(0.2) self.kiwoom.SetInputValue("계좌번호", "8080996211") self.kiwoom.SetInputValue("비밀번호", "0000") self.kiwoom.CommRqData("opw00018_req", "opw00018", 2, "2000") # Request opw00001 self.kiwoom.SetInputValue("계좌번호", "8080996211") self.kiwoom.SetInputValue("비밀번호", "0000") self.kiwoom.CommRqData("opw00001_req", "opw00001", 0, "2000") # balance item = QTableWidgetItem(self.kiwoom.data_opw00001) item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight) self.tableWidget.setItem(0, 0, item) for i in range(1, 6): item = QTableWidgetItem(self.kiwoom.data_opw00018['single'][i - 1]) item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight) self.tableWidget.setItem(0, i, item) self.tableWidget.resizeRowsToContents() # Item list item_count = len(self.kiwoom.data_opw00018['multi']) self.tableWidget_2.setRowCount(item_count) for j in range(item_count): row = self.kiwoom.data_opw00018['multi'][j] for i in range(len(row)): item = QTableWidgetItem(row[i]) item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight) self.tableWidget_2.setItem(j, i, item) self.tableWidget_2.resizeRowsToContents()
class Algos(QMainWindow, form_class): def __init__(self): super().__init__() self.setupUi(self) self.trade_stocks_done = False self.kiwoom = Kiwoom() ########계좌번호#################### self.account = 5624118510 ##################################### ########변수#################### # 공통 self.check = None self.count = 0 self.profit = 0 self.amount = {} self.bid_price = {} self.ask_price = {} # algo_1 self.spread_1 = [] # algo_2 self.spread_2 = [] # algo_3 self.spread_3 = [] # algo_4 self.spread_4 = [] # algo_7 self.short_spread_7 = [] self.long_spread_7 = [] ################################# ########종목코드 실시간 등록############## code_two = '069500;102110' code_five = '005930;005935' code_six = '364690;365040' code_seven = '069500;102780' code_eight = '069500;364690' codes = code_eight #code_two + ';' + code_five + ';' + self.kiwoom.subscribe_stock_conclusion('2000', codes) ############################################ ############종목수량, 매수/매도호가 ############# def get_data(self): bid_price = self.kiwoom.bid_price ask_price = self.kiwoom.ask_price self.kiwoom.get_amount() # if self.check : # self.kiwoom.get_amount() # else: # pass return self.kiwoom.amount, bid_price, ask_price def get_price(self): bid_price = self.kiwoom.bid_price ask_price = self.kiwoom.ask_price # earning = self.kiwoom.earning return bid_price, ask_price def get_price(self): import win32com.client # 연결 여부 체크 objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos") bConnect = objCpCybos.IsConnect if (bConnect == 0): print("PLUS가 정상적으로 연결되지 않음. ") exit() # 현재가 객체 구하기 objStockMst = win32com.client.Dispatch("DsCbo1.StockMst") # 현재가 정보 조회 for code in self.codes_one: objStockMst.SetInputValue(0, code) objStockMst.BlockRequest() # 현재가 통신 및 통신 에러 처리 rqStatus = objStockMst.GetDibStatus() rqRet = objStockMst.GetDibMsg1() # print("통신상태", rqStatus, rqRet) if rqStatus != 0: exit() name = objStockMst.GetHeaderValue(1) bid = objStockMst.GetHeaderValue(16) ask = objStockMst.GetHeaderValue(17) print(bid, ask) self.bid_price[name] = int(bid) self.ask_price[name] = int(ask) # return bid_price, ask_price ################################################# ########매수/매도 메소드########################################################################################### # self.kiwoom.send_order("send_order_req", "0101", account, order_type, code, num, price, hoga, "") 00:지정가, 03 :시장가 def buy_dafualt(self, code, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, code, leverage, price, '00', "") def sell_defualt(self, code, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, code, leverage, price, '00', "") def buy_kodex(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, 364690, leverage, price, '00', "") def sell_kodex(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, 364690, leverage, price, '00', "") def buy_tiger(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, 365040, leverage, price, '00', "") def sell_tiger(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, 365040, leverage, price, '00', "") def buy_kodex200(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, '069500', leverage, price, '00', "") def sell_kodex200(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, '069500', leverage, price, '00', "") def buy_tiger200(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, '102110', leverage, price, '00', "") def sell_tiger200(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, '102110', leverage, price, '00', "") def buy_kodex_inv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, 114800, leverage, price, '03', "") def sell_kodex_inv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, 114800, leverage, price, '03', "") def buy_tiger_inv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, 123310, leverage, price, '03', "") def sell_tiger_inv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, 123310, leverage, price, '03', "") def buy_kodex_kosdaqinv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, 251340, leverage, price, '03', "") def sell_kodex_kosdaqinv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, 251340, leverage, price, '03', "") def buy_tiger_kosdaqinv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, 250780, leverage, price, '03', "") def sell_tiger_kosdaqinv(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, 250780, leverage, price, '03', "") def buy_samsung(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, '005930', leverage, price, '00', "") def sell_samsung(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, '005930', leverage, price, '00', "") def buy_samsung_wu(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, '005935', leverage, price, '00', "") def sell_samsung_wu(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, '005935', leverage, price, '00', "") def buy_samsung_group(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 1, '102780', leverage, price, '00', "") def sell_samsung_group(self, price, leverage): self.kiwoom.SendOrder("send_order_req", "0101", self.account, 2, '102780', leverage, price, '00', "") ################################################################################################################### ### trading algorithms ### ################################################### Algo_0########################################################## def zero(self, amount, bid_price, ask_price): ### 알고리즘 요약 # 1. 가지고 있는 모든 포지션의 손익이 +인 경우 일괄매도 ### initial condition ### kodex200 = 'KODEX 200' kodex_inv = 'KODEX 인버스' ### sell if profit is plus ### if self.kiwoom.cash > 2000: self.sell_kodex200(0, amount[kodex200]) self.sell_kodex_inv(0, amount[kodex_inv]) time.sleep(5) self.buy_kodex200(0, amount[kodex200]) self.buy_kodex_inv(0, amount[kodex_inv]) ################################################### Algo_1########################################################## def one(self): print( '[algo_one]-----------------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. kodex200과 kodex_inv의 매수호가(매도가격) 스프레드가 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. # 3. 해당 지정가로 주문, 만약 해당 지정가로 주문 실패시 # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 1 init_count = 25 time_term = 2 hedge_ratio = 1 ###변수 설정### kodex200 = 'KODEX 200' kodex_inv = 'KODEX 인버스' bid_ask_spread = 25 ###스프레드 계산### if len(self.bid_price) != 2: pass else: print('bid_price :', self.bid_price) bid_kodex200 = self.bid_price[kodex200] # 매수가격 bid_kodex_inv = self.bid_price[kodex_inv] ask_kodex200 = self.ask_price[kodex200] #매도가격 ask_kodex_inv = self.ask_price[kodex_inv] self.spread_1.append(bid_kodex200 - bid_kodex_inv * hedge_ratio) if len(self.spread_1) <= 100: print(len(self.spread_1), '/100') ###이동평균 계산 후 트레이딩 시작### if len(self.spread_1) >= 100: spread_1 = pd.Series(self.spread_1) threshold = spread_1.rolling(window=100, center=False).mean() print('spread_inv :', round(spread_1.iloc[-1], 4), 'threshold :', round((threshold.iloc[-1]), 4), ' ///', round(spread_1.iloc[-1] - (threshold.iloc[-1]), 4)) # if self.time_count % time_term == 0: if spread_1.iloc[-1] > (threshold.iloc[-1] + bid_ask_spread): amount = self.get_amount() amount_kodex200 = amount[kodex200] amount_kodex_inv = amount[kodex_inv] if amount_kodex200 >= 1: print('short position') self.sell_kodex200(0, leverage) self.buy_kodex_inv(0, leverage * hedge_ratio) elif spread_1.iloc[-1] < (-threshold.iloc[-1] - bid_ask_spread): amount = self.get_amount() amount_kodex200 = amount[kodex200] amount_kodex_inv = amount[kodex_inv] if amount_kodex_inv >= 1: print('long position') self.sell_kodex_inv(0, leverage * hedge_ratio) self.buy_kodex200(0, leverage) # self.time_count += 1 # print('time to trade : ', time_term - (self.time_count)%time_term) # if (threshold.iloc[-1]-5) < spread_1.iloc[-1] < (threshold.iloc[-1]+5) : if abs(spread_1.iloc[-1]) < (threshold.iloc[-1] + 5): amount = self.get_amount() amount_kodex200 = amount[kodex200] amount_kodex_inv = amount[kodex_inv] print('close position') if amount_kodex200 < init_count: self.sell_kodex_inv(0, (init_count - amount_kodex200) * hedge_ratio) self.buy_kodex200(0, init_count - amount_kodex200) elif amount[kodex200] > init_count: self.sell_kodex200(0, amount_kodex200 - init_count) self.buy_kodex_inv(0, (amount_kodex200 - init_count) * hedge_ratio) else: pass print( '------------------------------------------------------------------------------' ) ################################################### Algo_2########################################################## def two(self, amount, bid_price, ask_price): print( '[algo_two]-----------------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. kodex200과 tiger200의 매도가격 스프레드가 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. 25 # 3. 숏 또는 롱 포지션 취한 후, # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 1 init_count = 20 kodex_200 = 'KODEX 200' tiger_200 = 'TIGER 200' start_spread = 15 finish_spread = -5 if kodex_200 in amount.keys(): amount_kodex_200 = amount[kodex_200] else: amount_kodex_200 = 0 if tiger_200 in amount.keys(): amount_tiger_200 = amount[tiger_200] else: amount_tiger_200 = 0 ### get bid ask### if kodex_200 in bid_price.keys() and tiger_200 in bid_price.keys(): bid_kodex_200 = bid_price[kodex_200] # 매수가격 bid_tiger_200 = bid_price[tiger_200] ask_kodex_200 = ask_price[kodex_200] # 매도가격 ask_tiger_200 = ask_price[tiger_200] self.check = False if ask_kodex_200 - bid_tiger_200 >= start_spread and amount_tiger_200 <= ( init_count * 2 - leverage): print('start position') self.sell_kodex200(ask_kodex_200, leverage) self.buy_tiger200(bid_tiger_200, leverage) self.profit += ask_kodex_200 - bid_tiger_200 self.check = True elif amount_tiger_200 > init_count and ask_tiger_200 - bid_kodex_200 >= finish_spread: print('close position') self.sell_tiger200(ask_tiger_200, (amount_tiger_200 - init_count)) self.buy_kodex200(bid_kodex_200, (amount_tiger_200 - init_count)) self.profit += ask_tiger_200 - bid_kodex_200 self.check = True print('profit :', self.profit) ################################################### Algo_3########################################################## def three(self, amount, bid_price, ask_price): print( '[algo_three]----------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. KODEX 인버스과 TIGER 인버스의 매수호가(매도가격) 스프레드가 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. # 3. 숏 또는 롱 포지션 취한 후, # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 1 init_count = 10 kodex_inv = 'KODEX 인버스' tiger_inv = 'TIGER 인버스' spread = 400 if kodex_inv in amount.keys(): amount_kodex_inv = amount[kodex_inv] else: amount_kodex_inv = 0 if tiger_inv in amount.keys(): amount_tiger_inv = amount[tiger_inv] else: amount_tiger_inv = 0 ### get bid ask### if kodex_inv in bid_price.keys() and tiger_inv in bid_price.keys(): bid_kodex_inv = bid_price[kodex_inv] # 매수가격 bid_tiger_inv = bid_price[tiger_inv] ask_kodex_inv = ask_price[kodex_inv] # 매도가격 ask_tiger_inv = ask_price[tiger_inv] if ask_kodex_inv > bid_tiger_inv + spread + 10 and amount_tiger_inv <= 19: print('short position') self.sell_kodexinv(ask_kodex_inv, leverage) self.buy_tigerinv(bid_tiger_inv, leverage) elif ask_tiger_inv > bid_kodex_inv + spread + 10 and amount_tiger_inv <= 19: print('long position') self.sell_tigerinv(ask_tiger_inv, leverage) self.buy_kodexinv(bid_kodex_inv, leverage) if amount_tiger_inv > init_count and bid_kodex_inv == ask_tiger_inv + spread: print('close position') self.sell_tigerinv(ask_tiger_inv, (amount_tiger_inv - init_count)) self.buy_kodexinv(bid_kodex_inv, (amount_tiger_inv - init_count)) elif amount_kodex_inv > init_count and ask_kodex_inv + spread == bid_tiger_inv: print('close position') self.sell_kodexinv(ask_kodex_inv, (amount_kodex_inv - init_count)) self.buy_tigerinv(bid_tiger_inv, (amount_kodex_inv - init_count)) ################################################### Algo_4########################################################## def four(self, amount, bid_price, ask_price): print( '[algo_four]--------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. KODEX 코스닥150선물인버스과 TIGER 코스닥150선물인버스의 매수호가(매도가격) 스프레드가 # 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. # 3. 숏 또는 롱 포지션 취한 후, # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 5 init_count = 75 time_term = 1 hedge_ratio = 1 kodex_kosdaqinv = 'KODEX 코스닥150선물인버스' tiger_kosdaqinv = 'TIGER 코스닥150선물인버스' bid_ask_spread = 20 ###스프레드 계산### if '251340' in bid_price.keys() and '250780' in bid_price.keys(): print(bid_price) self.spread_4.append(bid_price['250780'] - bid_price['251340'] * hedge_ratio) if len(self.spread_4) <= 60: print(len(self.spread_4), '/60') ###이동평균 계산 후 트레이딩 시작### if len(self.spread_4) >= 60: spread_4 = pd.Series(self.spread_4) threshold = spread_4.rolling(window=60, center=False).mean() print('spread_4 :', round(spread_4.iloc[-1], 4), 'threshold :', round((threshold.iloc[-1]), 4), '/', round(spread_4.iloc[-1] - (threshold.iloc[-1]), 4)) if self.time_count % time_term == 0: if spread_4.iloc[-1] > (threshold.iloc[-1] + bid_ask_spread ) and amount[tiger_kosdaqinv] >= 1: print('short position') self.sell_tiger_kosdaqinv(0, leverage) self.buy_kodex_kosdaqinv(0, leverage * hedge_ratio) elif spread_4.iloc[-1] < (threshold.iloc[-1] - bid_ask_spread ) and amount[kodex_kosdaqinv] >= 1: print('long position') self.sell_kodex_koskosdaqinv(0, leverage * hedge_ratio) self.buy_tiger_koskosdaqinv(0, leverage) self.time_count += 1 print('time to trade : ', time_term - (self.time_count) % time_term) if abs(spread_4.iloc[-1]) < (threshold.iloc[-1] + 5): print('close position') if amount[kodex_kosdaqinv] > init_count: self.sell_kodex_koskosdaqinv(0, (amount[kodex_kosdaqinv]) - init_count) self.buy_tiger_koskosdaqinv( 0, (amount[kodex_kosdaqinv]) * hedge_ratio - init_count) elif amount[kodex_kosdaqinv] < init_count: self.sell_tiger_koskosdaqinv( 0, init_count - amount[kodex_kosdaqinv]) self.buy_kodex_koskosdaqinv( 0, (init_count - amount[kodex_kosdaqinv]) * hedge_ratio) else: pass print('') ################################################### Algo_5########################################################## def five(self, amount, bid_price, ask_price): print( '[algo_five]--------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. 삼성전자와 삼성전자우의 매수호가(매수가격) 스프레드가 # 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. # 3. 숏 또는 롱 포지션 취한 후, # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 1 init_count = 5 samsung = '삼성전자' samsung_wu = '삼성전자우' spread = 10000 if samsung in amount.keys(): amount_samsung = amount[samsung] else: amount_samsung = 0 if samsung_wu in amount.keys(): amount_samsung_wu = amount[samsung_wu] else: amount_samsung_wu = 0 ### get bid ask### if samsung in bid_price.keys() and samsung_wu in bid_price.keys(): bid_samsung = bid_price[samsung] # 매수가격 bid_samsung_wu = bid_price[samsung_wu] ask_samsung = ask_price[samsung] # 매도가격 ask_samsung_wu = ask_price[samsung_wu] if ask_samsung > bid_samsung_wu + spread + 200 and amount_samsung_wu <= 9: print('short position') self.sell_samsung(ask_samsung, leverage) self.buy_samsung_wu(bid_samsung_wu, leverage) elif ask_samsung_wu > bid_samsung and amount_samsung <= 9: print('long position') self.sell_samsung_wu(ask_samsung_wu, leverage) self.buy_samsung(bid_samsung, leverage) if amount_samsung > init_count and ask_samsung == bid_samsung_wu + spread + 100: print('close position') self.sell_samsung(ask_samsung, (amount_samsung - init_count)) self.buy_samsung_wu(bid_samsung_wu, (amount_samsung - init_count)) elif amount_samsung_wu > init_count and bid_samsung + spread + 100 == ask_samsung_wu: print('close position') self.sell_samsung_wu(ask_samsung_wu, (amount_samsung_wu - init_count)) self.buy_samsung(bid_samsung, (amount_samsung_wu - init_count)) print('') ################################################### Algo_6########################################################## def six(self, amount, bid_price, ask_price): print( '[algo_six]--------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. kodex_active와 tiger_active 매수호가(매수가격) 스프레드가 # 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. # 3. 숏 또는 롱 포지션 취한 후, # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 1 init_count = 50 short_spread = 125 long_spread = -65 kodex_active = 'KODEX 혁신기술테마액티브' tiger_active = 'TIGER AI코리아그로스액티브' if kodex_active in amount.keys(): amount_kodex_active = amount[kodex_active] else: amount_kodex_active = 0 if tiger_active in amount.keys(): amount_tiger_active = amount[tiger_active] else: amount_tiger_active = 0 ### get bid ask### if 'KODEX 혁신기술테마액티브' in bid_price.keys( ) and 'TIGER AI코리아그로스액티브' in bid_price.keys(): bid_kodex_active = bid_price['KODEX 혁신기술테마액티브'] # 매수가격 bid_tiger_active = bid_price['TIGER AI코리아그로스액티브'] ask_kodex_active = ask_price['KODEX 혁신기술테마액티브'] # 매도가격 ask_tiger_active = ask_price['TIGER AI코리아그로스액티브'] if ask_kodex_active - bid_tiger_active > short_spread and init_count < amount_tiger_active <= init_count * 2 - leverage: print('start short position') self.sell_kodex(ask_kodex_active, leverage) self.buy_tiger(bid_tiger_active, leverage) self.check = 'short' if ask_tiger_active - bid_kodex_active > long_spread and amount_tiger_active > init_count and self.check == 'short': print('close short position') self.sell_tiger(ask_tiger_active, (amount_tiger_active - init_count)) self.buy_kodex(bid_kodex_active, (amount_tiger_active - init_count)) if ask_tiger_active - bid_kodex_active > short_spread and init_count < amount_kodex_active <= init_count * 2 - leverage: print('start long position') self.sell_tiger(ask_tiger_active, leverage) self.buy_kodex(bid_kodex_active, leverage) self.check = 'long' if ask_kodex_active - bid_tiger_active > long_spread and amount_kodex_active > init_count and self.check == 'long': print('close long position') self.sell_kodex(ask_kodex_active, (amount_kodex_active - init_count)) self.buy_tiger(bid_tiger_active, (amount_kodex_active - init_count)) print('') ################################################### Algo_7########################################################## def seven(self, amount, bid_price, ask_price): print( '[algo_seven]--------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. kodex200와 samsung_group 매수호가(매수가격) 스프레드가 # 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. # 3. 숏 또는 롱 포지션 취한 후, # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 1 init_count = 40 # short_spread = 32900 # long_spread = - -32700 kodex200 = 'KODEX 200' samsung_group = 'KODEX 삼성그룹' if kodex200 in amount.keys(): amount_kodex200 = amount[kodex200] else: amount_kodex200 = 0 if samsung_group in amount.keys(): amount_samsung_group = amount[samsung_group] else: amount_samsung_group = 0 ### get bid ask### if kodex200 in bid_price.keys() and samsung_group in bid_price.keys(): bid_kodex200 = bid_price[kodex200] # 매수가격 bid_samsung_group = bid_price[samsung_group] ask_kodex200 = ask_price[kodex200] # 매도가격 ask_samsung_group = ask_price[samsung_group] print('short spread :', ask_kodex200 - bid_samsung_group) print('long spread :', ask_samsung_group - bid_kodex200) self.short_spread_7.append(ask_samsung_group - bid_kodex200) self.long_spread_7.append(ask_kodex200 - bid_samsung_group) if len(self.short_spread_7) < 150: print(self.count, '/', 150) self.count += 1 if len(self.short_spread_7) >= 150: short_spread_7 = pd.Series(self.short_spread_7) long_spread_7 = pd.Series(self.long_spread_7) short_spread_7 = short_spread_7.rolling(window=150, center=False).mean() long_spread_7 = long_spread_7.rolling(window=150, center=False).mean() short_spread = -short_spread_7.iloc[-1] + 50 long_spread = -long_spread_7.iloc[-1] + 50 print('ma spread :', short_spread, long_spread) if ask_kodex200 - bid_samsung_group > short_spread and init_count <= amount_samsung_group <= init_count * 2 - leverage: print('start short position') self.sell_kodex200(ask_kodex200, leverage) self.buy_samsung_group(bid_samsung_group, leverage) self.check = 'short' self.long_spread = short_spread_7 if ask_samsung_group - bid_kodex200 > self.long_spread and amount_samsung_group > init_count and self.check == 'short': print('close short position') self.sell_samsung_group(ask_samsung_group, (amount_samsung_group - init_count)) self.buy_kodex200(bid_kodex200, (amount_samsung_group - init_count)) if ask_samsung_group - bid_kodex200 > long_spread and init_count <= amount_kodex200 <= init_count * 2 - leverage: print('start long position') self.sell_samsung_group(ask_samsung_group, leverage) self.buy_kodex200(bid_kodex200, leverage) self.check = 'long' self.short_spread = long_spread_7 if ask_kodex200 - bid_samsung_group > self.short_spread and amount_kodex200 > init_count and self.check == 'long': print('close long position') self.sell_kodex200(ask_kodex200, (amount_kodex200 - init_count)) self.buy_samsung_group(bid_samsung_group, (amount_kodex200 - init_count)) print('') ################################################### Algo_8########################################################## def eight(self, amount, bid_price, ask_price): print( '[algo_eight]--------------------------------------------------------------------' ) ### 알고리즘 요약 # 1. kodex200와 kodex_active 매수호가(매수가격) 스프레드가 # 지난 60개의 데이터 이동평균과 달라지는 경우, # 2. 매수호가,매도호가 스프레드를 고려하여 threshold에 반영. # 3. 숏 또는 롱 포지션 취한 후, # 4. 반대 포지션으로 청산 ###초기 설정### leverage = 1 init_count = 40 kodex200 = 'KODEX 200' kodex_active = 'KODEX 혁신기술테마액티브' if kodex200 in amount.keys(): amount_kodex200 = amount[kodex200] else: amount_kodex200 = 0 if kodex_active in amount.keys(): amount_kodex_active = amount[kodex_active] else: amount_kodex_active = 0 ### get bid ask### if kodex200 in bid_price.keys() and kodex_active in bid_price.keys(): bid_kodex200 = bid_price[kodex200] # 매수가격 bid_kodex_active = bid_price[kodex_active] ask_kodex200 = ask_price[kodex200] # 매도가격 ask_kodex_active = ask_price[kodex_active] print('short spread :', ask_kodex200 - bid_kodex_active) print('long spread :', ask_kodex_active - bid_kodex200) self.short_spread_7.append(ask_kodex_active - bid_kodex200) self.long_spread_7.append(ask_kodex200 - bid_kodex_active) if len(self.short_spread_7) < 300: print(self.count, '/', 300) self.count += 1 if len(self.short_spread_7) >= 301: del short_spread_7[0] del long_spread_7[0] short_spread_7 = pd.Series(self.short_spread_7) long_spread_7 = pd.Series(self.long_spread_7) short_spread_7 = short_spread_7.rolling(window=300, center=False).mean() long_spread_7 = long_spread_7.rolling(window=300, center=False).mean() short_spread = -short_spread_7.iloc[-1] long_spread = -long_spread_7.iloc[-1] print('ma spread :', short_spread, long_spread) if ask_kodex200 - bid_kodex_active >= short_spread + 100 and init_count <= amount_kodex_active <= init_count * 2 - leverage: print('start short position') self.sell_kodex200(ask_kodex200, leverage) self.buy_kodex_active(bid_kodex_active, leverage) self.check = 'short' self.long_spread = ask_kodex200 - bid_kodex_active if ask_kodex_active - bid_kodex200 >= self.long_spread + 100 and amount_kodex_active > init_count and self.check == 'short': print('close short position') self.sell_kodex_active(ask_kodex_active, (amount_kodex_active - init_count)) self.buy_kodex200(bid_kodex200, (amount_kodex_active - init_count)) if ask_kodex_active - bid_kodex200 >= long_spread + 100 and init_count <= amount_kodex200 <= init_count * 2 - leverage: print('start long position') self.sell_kodex_active(ask_kodex_active, leverage) self.buy_kodex200(bid_kodex200, leverage) self.check = 'long' self.short_spread = ask_kodex_active - bid_kodex200 if ask_kodex200 - bid_kodex_active >= self.short_spread + 100 and amount_kodex200 > init_count and self.check == 'long': print('close long position') self.sell_kodex200(ask_kodex200, (amount_kodex200 - init_count)) self.buy_kodex_active(bid_kodex_active, (amount_kodex200 - init_count)) print('')