def calculate_profit(self, stock_code): ''' 수익률을 구하는 공식 1. 전일 매수 하였을 경우 - 전일 종가에 매수하여, 익일 시가에 매도한 수익률을 구한다. 2. 전일 홀드 하였을 경우 - 수익률은 1(백분위 환산 0%) ''' position_data = self.set_position(stock_code) stock_data = logic.add_technical_analyze_data(stock_code) profit_array = [1] ## 첫날에는 매수를 하지 않기 때문에 수익률이 0% today = 1 ## 수익률 계산 while today < len(position_data): yesterday = today - 1 ## 어제 Buy Position이었으면 전일 종가에 매수, 금일 시가에 매도 수익률을 돌려준다. if position_data[yesterday] == 'Buy': today_profit = ((stock_data.at[today, "Open"]) / stock_data.at[yesterday, "Close"]) * ( 1 - (self.trade_fee / 100) - (self.trade_tax / 100)) profit_array.append(today_profit) ## 조건에 안맞으면 아무것도 하지 않음. else: today_profit = 1 profit_array.append(today_profit) today += 1 return profit_array
def make_index_trade_data(self): profit_data_buy_and_hold = pd.DataFrame() ## 종목 수익률 측정 for i in range(len(config.basket_universe)): stock_code = config.basket_universe[i] stock_data = logic.add_technical_analyze_data(stock_code) profit_data_buy_and_hold['hold_%s' % stock_code] = stock_data[ 'Close'] / stock_data['Close'].shift(1) profit_data_buy_and_hold[ "profit_average"] = profit_data_buy_and_hold.mean(axis=1) profit_data_buy_and_hold = profit_data_buy_and_hold.fillna(1) ## 기본 잔고 = 1000 account_data_buy_and_hold = [1000] for i in range(len(profit_data_buy_and_hold.index)): temp_account_data = account_data_buy_and_hold[ i] * self.position_size * profit_data_buy_and_hold.at[ i, "profit_average"] + account_data_buy_and_hold[i] * ( 1 - self.position_size) account_data_buy_and_hold.append(temp_account_data) i += 1 return account_data_buy_and_hold
def calculate_account_data(self): ''' 잔고를 구하는 공식 금일 시가 매도 기준 잔고를 구함. => D-1일 잔고 * D-Day일 수익률 (위에서 구한 수익률) ''' ## 기본 잔고 = 1000 account_data = [1000] profit_data = self.merge_total_trade_data() ## 금일 잔고 : 주식비중(수익률 * 전일 잔고 * 주식비중) + 현금비중(전일 잔고 * 1 - 주식비중) for i in range(len(profit_data.index)): temp_account_data = account_data[ i] * self.position_size * profit_data.at[ i, "profit_average"] + account_data[i] * ( 1 - self.position_size) account_data.append(temp_account_data) i += 1 ## 잔고 데이터 추가 account_data_dataframe = pd.DataFrame(account_data, columns=['Basket']) account_data_dataframe.insert(len(account_data_dataframe.columns), "Basket_Buy_and_Hold", self.make_index_trade_data()) account_data_dataframe = pd.concat( [account_data_dataframe, profit_data], axis=1) ## 날짜 데이터 추가 temp_date_data = logic.add_technical_analyze_data( self.stock_universe[0]) account_data_dataframe = pd.concat( [account_data_dataframe, temp_date_data['Date']], axis=1) return account_data_dataframe
def set_position(self, stock_code): ## 포지션 설정 전 종목 데이터 호출 stock_data = logic.add_technical_analyze_data(stock_code) position_array = logic.set_position(stock_data) return position_array
def calculate_account_data(self): ''' 잔고를 구하는 공식 금일 시가 매도 기준 잔고를 구함. => D-1일 잔고 * D-Day일 수익률 (위에서 구한 수익률) ''' ## 시작 잔고 = 1000 account_data = [1000] profit_data = self.merge_total_trade_data() today = 1 ## 금일 종가 기준 잔고 while today < len(profit_data.index): yesterday = today - 1 today_account_data = account_data[ yesterday] * self.position_size * profit_data.at[ yesterday, "profit_average"] + account_data[yesterday] * ( 1 - self.position_size) account_data.append(today_account_data) today += 1 account_data_dataframe = pd.DataFrame(account_data, columns=['Basket']) account_data_dataframe = pd.concat( [account_data_dataframe, profit_data], axis=1) temp_date_data = logic.add_technical_analyze_data( self.stock_universe[0]) account_data_dataframe = pd.concat( [account_data_dataframe, temp_date_data['Date']], axis=1) return account_data_dataframe
def calculate_account_data(self): ## 기본 잔고 = 1000 account_data = [1000] profit_data = self.merge_total_trade_data() ## 기본 잔고 = 1000 for i in range(len(profit_data.index)): temp_account_data = account_data[ i] * self.position_size * profit_data.at[ i, "profit_average"] + account_data[i] * ( 1 - self.position_size) account_data.append(temp_account_data) i += 1 account_data_dataframe = pd.DataFrame(account_data, columns=['Basket']) account_data_dataframe = pd.concat( [account_data_dataframe, profit_data], axis=1) temp_date_data = logic.add_technical_analyze_data( self.stock_universe[0]) account_data_dataframe = pd.concat( [account_data_dataframe, temp_date_data['Date']], axis=1) print(account_data_dataframe) return account_data_dataframe
def calculate_profit(self, stock_code): position_data = self.set_position(stock_code) stock_data = logic.add_technical_analyze_data(stock_code) profit_array = [1] * len(position_data) ## 첫날에는 매수를 하지 않기 때문에 수익률이 0% today = 1 yesterday = 0 ## while today < len(position_data): for i in range(len(position_data) - 1): ## 매수 포지션 ## 수익률 = 종가에 매수하였으므로 전일 수익률 * (1 - 증권 거래수수료) if position_data[yesterday] == 'Hold' and position_data[ today] == 'Buy': temp_profit = 1 * (1 - (self.trade_fee / 100)) profit_array[i + 1] = temp_profit ## 매수 유지 포지션 ## 수익률 = 전일 수익률 * 전일 종가 / 금일 종가 elif position_data[yesterday] == 'Buy' and position_data[ today] == 'Buy': temp_profit = 1 * (stock_data.at[today, "Close"] / stock_data.at[yesterday, "Close"]) profit_array[i + 1] = temp_profit ## 매도 포지션 ## 수익률 = 전일 수익률 * 전일 종가 / 금일 종가 * (1 - 증권 거래수수료 - 증권거래세) elif position_data[yesterday] == 'Buy' and position_data[ today] == 'Hold': temp_profit = 1 * (stock_data.at[today, "Close"] / stock_data.at[yesterday, "Close"]) * ( 1 - (self.trade_fee / 100) - (self.trade_tax / 100)) profit_array[i + 1] = temp_profit ## 현금 보유 포지션 else: temp_profit = 1 profit_array[i + 1] = temp_profit today += 1 yesterday += 1 return profit_array