먼저 20일, 60일 이동평균을 계산하는 방법을 살펴보겠습니다. 마찬가지로 과거 가격 데이터를 담고 있는 universe_item['price_df']를 df 변수에 저장하도록 한 후 이동평균을 구해 보겠습니다.
RSIStrategy.py
(...)
def check_buy_signal_and_order(self, code):
if not check_adjacent_transaction_closed():
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] df = universe_item['price_df'].copy() 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) D = np.where(df['close'].diff(1) < 0, df['close'].diff(1) * (-1), 0) AU = pd.DataFrame(U, index=date_index).rolling(window=period).mean() AD = pd.DataFrame(D, index=date_index).rolling(window=period).mean() RSI = AU / (AD + AU) * 100 ------ RSI(N) 계산, 0부터 1로 표현되는 RSI에 100을 곱함 df['RSI(2)'] = RSI
----- check_buy_signal_and_order 함수에서 사용한 실시간 체결 정보 조회 및 RSI(2) 계산 코드와 같은 코드
df['ma20'] = df['close'].rolling(window=20, min_periods=1).mean()
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]