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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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