RSIStrategy.py
(...)
def check_buy_signal_and_order(self, code):
if not check_adjacent_transaction_closed_for_buying():
return False
universe_item = self.universe[code]
if code not in self.kiwoom.universe_realtime_transaction_info.keys(): ------ 현재 체결 정보가 존재하는지 확인
print("매수대상 확인 과정에서 아직 체결정보가 없습니다.") ------ 체결 정보가 없으면 더 이상 진행하지 않고 함수 종료
return
open = self.kiwoom.universe_realtime_transaction_info[code]['시가'] high = self.kiwoom.universe_realtime_transaction_info[code]['고가'] low = self.kiwoom.universe_realtime_transaction_info[code]['저가'] close = self.kiwoom.universe_realtime_transaction_info[code]['현재가'] volume = self.kiwoom.universe_realtime_transaction_info[code]['누적거래량']
----- 실시간 체결 정보가 존재하면 현시점의 시가 / 고가 / 저가 / 현재가 / 누적 거래량 저장
today_price_data = [open, high, low, close, volume] ------ 오늘 가격 데이터를 과거 가격 데이터(DataFrame)의 행으로 추가하고자 리스트로 만듦
df = universe_item['price_df']
df.loc[datetime.now().strftime('%Y%m%d')] = today_price_data ------ 과거 가격 데이터에 금일 날짜로 데이터 추가
period = 2 ------ 기준일 N 설정
date_index = df.index.astype('str')
U = np.where(df['close'].diff(1) > 0, df['close'].diff(1), 0) ------ df.diff로 ‘기준일 종가 - 기준일 전일 종가’를 계산하여 0보다 크면 증가분을 넣고, 감소했으면 0을 넣음
D = np.where(df['close'].diff(1) < 0, df['close'].diff(1) * (-1), 0) ------ df.diff로 ‘기준일 종가 - 기준일 전일 종가’를 계산하여 0보다 작으면 감소분을 넣고, 증가했으면 0을 넣음
AU = pd.DataFrame(U, index=date_index).rolling(window=period).mean() ------ AU, period = 2일 동안 U의 평균
AD = pd.DataFrame(D, index=date_index).rolling(window=period).mean() ------ AD, period = 2일 동안 D의 평균
RSI = AU / (AD + AU) * 100 ------ 0부터 1로 표현되는 RSI에 100을 곱함
df['RSI(2)'] = RSI
df['ma20'] = df['close'].rolling(window=20, min_periods=1).mean() ------ 종가(close)를 기준으로 이동평균 구하기
df['ma60'] = df['close'].rolling(window=60, min_periods=1).mean()
rsi = df[-1:]['RSI(2)'].values[0]
ma20 = df[-1:]['ma20'].values[0]
ma60 = df[-1:]['ma60'].values[0]
idx = df.index.get_loc(datetime.now().strftime('%Y%m%d')) – 2 ------ 2 거래일 전 날짜(index)를 구함
close_2days_ago = df.iloc[idx]['close'] ------ 위 index부터 2 거래일 전 종가를 얻어 옴
price_diff = (close - close_2days_ago) / close_2days_ago * 100 ------ 2 거래일 전 종가와 현재가를 비교
if ma20 > ma60 and rsi < 5 and price_diff < -2: ------ 매수 신호 확인(조건에 부합하면 주문 접수)
pass ------ 매수 주문을 구현할 부분
else: ------ 매수 신호가 없다면 종료
return