def __end_of_backtest(self, *arg, **kwargs): # 开始分析 # 对于account.detail做一定的整理 self.account.detail = detail = pd.DataFrame(self.account.detail, columns=['date', 'code', 'price', 'amounts', 'order_id', 'trade_id', 'sell_price', 'sell_order_id', 'sell_trade_id', 'sell_date', 'left_amount', 'commission']) self.account.detail['sell_average'] = self.account.detail['sell_price'].apply( lambda x: mean(x)) self.account.detail['pnl_persentage'] = self.account.detail['sell_average'] - \ self.account.detail['price'] self.account.detail['pnl'] = self.account.detail['pnl_persentage'] * ( self.account.detail['amounts'] - self.account.detail['left_amount']) - self.account.detail['commission'] self.account.detail = self.account.detail.drop( ['order_id', 'trade_id', 'sell_order_id', 'sell_trade_id'], axis=1) QA_util_log_info('start analysis====\n' + str(self.strategy_stock_list)) QA_util_log_info('=' * 10 + 'Trade History' + '=' * 10) QA_util_log_info('\n' + tabulate(self.account.history, headers=('date', 'code', 'price', 'towards', 'amounts', 'order_id', 'trade_id', 'commission'))) QA_util_log_info('\n' + tabulate(self.account.detail, headers=(self.account.detail.columns))) __exist_time = int(self.end_real_id) - int(self.start_real_id) + 1 if len(self.__messages) > 1: performace = QA_backtest_analysis_start( self.setting.client, self.strategy_stock_list, self.__messages, self.trade_list[self.start_real_id:self.end_real_id + 1], self.benchmark_data.data) _backtest_mes = { 'user': self.setting.QA_setting_user_name, 'strategy': self.strategy_name, 'stock_list': performace['code'], 'start_time': self.strategy_start_date, 'end_time': self.strategy_end_date, 'account_cookie': self.account.account_cookie, 'annualized_returns': performace['annualized_returns'], 'benchmark_annualized_returns': performace['benchmark_annualized_returns'], 'assets': performace['assets'], 'benchmark_assets': performace['benchmark_assets'], 'trade_date': performace['trade_date'], 'total_date': performace['total_date'], 'win_rate': performace['win_rate'], 'alpha': performace['alpha'], 'beta': performace['beta'], 'sharpe': performace['sharpe'], 'vol': performace['vol'], 'benchmark_vol': performace['benchmark_vol'], 'max_drop': performace['max_drop'], 'exist': __exist_time, 'time': datetime.datetime.now() } QA_SU_save_backtest_message(_backtest_mes, self.setting.client) QA_SU_save_account_message(self.__messages, self.setting.client) QA_SU_save_account_to_csv(self.__messages) self.account.detail.to_csv( 'backtest-pnl--' + str(self.account.account_cookie) + '.csv')
def __end_of_backtest(self, *arg, **kwargs): # 开始分析 QA_util_log_info('start analysis====\n' + str(self.strategy_stock_list)) QA_util_log_info('=' * 10 + 'Trade History' + '=' * 10) QA_util_log_info('\n' + tabulate(self.account.history, headers=('date', 'code', 'price', 'towards', 'amounts', 'order_id', 'trade_id', 'commission'))) QA_util_log_info('\n' + tabulate(self.account.detail, headers=('date', 'code', 'price', 'amounts', 'order_id', 'trade_id', 'sell_price', 'sell_order_id', 'sell_trade_id', 'sell_date', 'left_amount', 'commission'))) __exist_time = int(self.end_real_id) - int(self.start_real_id) + 1 self.__benchmark_data = QA_fetch_index_day( self.benchmark_code, self.start_real_date, self.end_real_date) if len(self.__messages) > 1: performace = QA_backtest_analysis_start( self.setting.client, self.strategy_stock_list, self.__messages, self.trade_list[self.start_real_id:self.end_real_id + 1], self.market_data, self.__benchmark_data) _backtest_mes = { 'user': self.setting.QA_setting_user_name, 'strategy': self.strategy_name, 'stock_list': performace['code'], 'start_time': self.strategy_start_date, 'end_time': self.strategy_end_date, 'account_cookie': self.account.account_cookie, 'annualized_returns': performace['annualized_returns'], 'benchmark_annualized_returns': performace['benchmark_annualized_returns'], 'assets': performace['assets'], 'benchmark_assets': performace['benchmark_assets'], 'trade_date': performace['trade_date'], 'total_date': performace['total_date'], 'win_rate': performace['win_rate'], 'alpha': performace['alpha'], 'beta': performace['beta'], 'sharpe': performace['sharpe'], 'vol': performace['vol'], 'benchmark_vol': performace['benchmark_vol'], 'max_drop': performace['max_drop'], 'exist': __exist_time, 'time': datetime.datetime.now() } QA_SU_save_backtest_message(_backtest_mes, self.setting.client) QA_SU_save_account_message(self.__messages, self.setting.client) QA_SU_save_account_to_csv(self.__messages)
def __QA_backest_handle_data(self, outside_handle): '这个outside_handle就是一个外部的注入函数' # 首先判断是否能满足回测的要求` _info = {} _info['stock_list'] = self.strategy_stock_list __messages = {} self.__init_cash_per_stock = int( float(self.account.init_assest) / len(self.strategy_stock_list)) # 策略的交易日循环 for i in range(int(self.start_real_id), int(self.end_real_id) - 1, 1): # 正在进行的交易日期 __running_date = self.trade_list[i] QA_util_log_info( '=================daily hold list====================') QA_util_log_info('in the begining of ' + __running_date) QA_util_log_info( tabulate(self.account.message['body']['account']['hold'])) for __j in range(0, len(self.strategy_stock_list)): if __running_date in [l[6] for l in self.market_data[__j]] and \ [l[6] for l in self.market_data[__j]].index(__running_date) \ > self.strategy_gap + 1: __data = self.__QA_data_handle([ __l[6] for __l in self.market_data[__j] ].index(__running_date), __j) __amount = 0 for item in __data['account']['body']['account']['hold']: if self.strategy_stock_list[__j] in item: __amount = __amount + item[3] if __amount > 0: __hold = 1 else: __hold = 0 __result = outside_handle.predict(__data['market'], __data['account'], __hold, _info) if float(self.account.message['body']['account']['cash'] [-1]) > 0: self.__QA_backtest_excute_bid( __result, __running_date, __hold, str(self.strategy_stock_list[__j])[0:6], __amount) else: QA_util_log_info('not enough free money') else: pass # 在回测的最后一天,平掉所有仓位(回测的最后一天是不买入的) while len(self.account.hold) > 1: __hold_list = self.account.hold[1::] pre_del_id = [] for item_ in range(0, len(__hold_list)): if __hold_list[item_][3] > 0: __last_bid = self.bid.bid __last_bid['amount'] = int(__hold_list[item_][3]) __last_bid['order_id'] = str(random.random()) __last_bid['price'] = 'close_price' __last_bid['code'] = str(__hold_list[item_][1]) __last_bid['date'] = self.trade_list[self.end_real_id] __last_bid['towards'] = -1 __last_bid['user'] = self.setting.QA_setting_user_name __last_bid['strategy'] = self.strategy_name __last_bid['bid_model'] = 'auto' __last_bid['status'] = '0x01' __last_bid['amount_model'] = 'amount' __message = self.market.receive_bid( __last_bid, self.setting.client) _remains_day = 0 while __message['header']['status'] == 500: # 停牌状态,这个时候按停牌的最后一天计算价值(假设平仓) __last_bid['date'] = self.trade_list[self.end_real_id - _remains_day] _remains_day += 1 __message = self.market.receive_bid( __last_bid, self.setting.client) # 直到市场不是为0状态位置,停止前推日期 __messages = self.account.QA_account_receive_deal( __message) else: pre_del_id.append(item_) pre_del_id.sort() pre_del_id.reverse() for item_x in pre_del_id: __hold_list.pop(item_x) try: # 在末尾增加一个回调给策略 outside_handle.on_end(__data['market'], __data['account'], __hold, _info) except: pass # 开始分析 QA_util_log_info('start analysis====\n' + str(self.strategy_stock_list)) QA_util_log_info('=' * 10 + 'Trade History' + '=' * 10) QA_util_log_info('\n' + tabulate(self.account.history, headers=('date', 'code', 'price', 'towards', 'amounts', 'order_id', 'trade_id', 'commission'))) QA_util_log_info( tabulate(self.account.detail, headers=('date', 'code', 'price', 'amounts', 'order_id', 'trade_id', 'sell_price', 'sell_order_id', 'sell_trade_id', 'sell_date', 'left_amount', 'commission'))) __exist_time = int(self.end_real_id) - int(self.start_real_id) + 1 self.__benchmark_data = QA_fetch_index_day(self.benchmark_code, self.start_real_date, self.end_real_date) performace = QA_backtest_analysis_start( self.setting.client, self.strategy_stock_list, __messages, self.trade_list[self.start_real_id:self.end_real_id + 1], self.market_data, self.__benchmark_data) _backtest_mes = { 'user': self.setting.QA_setting_user_name, 'strategy': self.strategy_name, 'stock_list': performace['code'], 'start_time': self.strategy_start_date, 'end_time': self.strategy_end_date, 'account_cookie': self.account.account_cookie, 'annualized_returns': performace['annualized_returns'], 'benchmark_annualized_returns': performace['benchmark_annualized_returns'], 'assets': performace['assets'], 'benchmark_assets': performace['benchmark_assets'], 'trade_date': performace['trade_date'], 'total_date': performace['total_date'], 'win_rate': performace['win_rate'], 'alpha': performace['alpha'], 'beta': performace['beta'], 'sharpe': performace['sharpe'], 'vol': performace['vol'], 'benchmark_vol': performace['benchmark_vol'], 'max_drop': performace['max_drop'], 'exist': __exist_time, 'time': datetime.datetime.now() } QA_SU_save_backtest_message(_backtest_mes, self.setting.client) QA_SU_save_account_message(__messages, self.setting.client) QA_SU_save_account_to_csv(__messages)