더북(TheBook)

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
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.