def get_benchmark_net_asset_value(self, period, benchmark): data_class = GetKlineData() benchmark_close = None if period == Period.DAILY.value: start_time = Environment.benchmark_index[0] end_time = Environment.benchmark_index[-1] benchmark_close = data_class.get_market_data( Environment.index_daily_data, stock_code=[benchmark], field=['close'], start=start_time, end=end_time, period=period) elif period == Period.ONE_MIN.value: start_time = millisecond_to_date( millisecond=Environment.benchmark_index[0], format='%Y-%m-%d %H:%M:%S') end_time = millisecond_to_date( millisecond=Environment.benchmark_index[-1], format='%Y-%m-%d %H:%M:%S') benchmark_close = data_class.get_market_data( Environment.index_daily_data, stock_code=[benchmark], field=['close'], start=start_time, end=end_time) benchmark_close = list(benchmark_close) benchmark_net_asset_value = [ current_close / benchmark_close[0] for current_close in benchmark_close ] return benchmark_net_asset_value
def get_benchmark_net_asset_value(self, event): period = event.event_data_dict["strategy"].period data_class = GetData() benchmark = event.event_data_dict["strategy"].benchmark if period == Period.DAILY.value: start_time = millisecond_to_date(millisecond=Environment.benchmark_index[0], format="%Y-%m-%d") end_time = millisecond_to_date(millisecond=Environment.benchmark_index[-1], format="%Y-%m-%d") benchmark_close = data_class.get_market_data(Environment.daily_data, stock_code=[benchmark], field=["close"], start=start_time, end=end_time) elif period == Period.ONE_MIN.value: start_time = millisecond_to_date(millisecond=Environment.benchmark_index[0], format="%Y-%m-%d %H:%M:%S") end_time = millisecond_to_date(millisecond=Environment.benchmark_index[-1], format="%Y-%m-%d %H:%M:%S") benchmark_close = data_class.get_market_data(Environment.daily_data, stock_code=[benchmark], field=["close"], start=start_time, end=end_time) benchmark_close = list(benchmark_close) benchmark_net_asset_value = [current_close / benchmark_close[0] for current_close in benchmark_close] return benchmark_net_asset_value
def show_backtesting_indicator(cls, event): period = event.event_data_dict['strategy'].period benchmark = event.event_data_dict['strategy'].benchmark indicator_dict = {} # (1)基准净值 benchmark_net_asset_value = cls().get_benchmark_net_asset_value( period, benchmark) print('benchmark_net_asset_value', benchmark_net_asset_value) # (2)策略净值 strategy_net_asset_value = cls().get_strategy_net_asset_value() print('strategy_net_asset_value', strategy_net_asset_value) # (3)基准年化收益率 benchmark_year_yield = cls().get_year_yield(benchmark_net_asset_value) print('benchmark_year_yield', benchmark_year_yield) # (4)策略年化收益率 strategy_year_yield = cls().get_year_yield(strategy_net_asset_value) print('strategy_year_yield', strategy_year_yield) # (5)beta beta = cls().get_beta(benchmark_net_asset_value, strategy_net_asset_value) print('beta', beta) indicator_dict['beta'] = beta # (6)alpha alpha = cls().get_alpha(benchmark_year_yield, strategy_year_yield, beta) print('alpha', alpha) indicator_dict['alpha'] = alpha # (7)volatility volatility = cls().get_volatility(strategy_net_asset_value) print('volatility', volatility) indicator_dict['volatility'] = volatility # (8)sharpe sharpe = cls().get_sharp(strategy_year_yield, volatility) print('sharpe', sharpe) indicator_dict['sharpe'] = sharpe # (9)downside_risk downside_risk = cls().get_downside_risk(strategy_year_yield) print('downside_risk', downside_risk) indicator_dict['downside_risk'] = downside_risk # (10)sortino_ratio sortino_ratio = cls().get_sortino_ratio(strategy_year_yield, downside_risk) print('sortino_ratio', sortino_ratio) indicator_dict['sortino_ratio'] = sortino_ratio # (11)tracking_error tracking_error = cls().get_tracking_error(benchmark_net_asset_value, strategy_net_asset_value) print('tracking_error', tracking_error) indicator_dict['tracking_error'] = tracking_error # (12)information_ratio information_ratio = cls().get_information_ratio( benchmark_year_yield, strategy_year_yield, tracking_error) print('information_ratio', information_ratio) indicator_dict['information_ratio'] = information_ratio # (13)max_drawdown max_drawdown = cls().get_max_drawdown(strategy_net_asset_value) print('max_drawdown', max_drawdown) indicator_dict['max_drawdown'] = max_drawdown # 展示到html period = event.event_data_dict['strategy'].period if period == Period.DAILY.value: time_tag_date = Environment.benchmark_index else: time_tag_date = [ millisecond_to_date(millisecond=i, format='%Y-%m-%d %H:%M:%S') for i in Environment.benchmark_index ]
def show_backtesting_indicator(cls, event): indicator_dict = {} indicator_dict = collections.OrderedDict() # (1)基准净值 benchmark_net_asset_value = cls().get_benchmark_net_asset_value(event) # print(benchmark_net_asset_value, "benchmark_net_asset_value" * 3) # (2)策略净值 strategy_net_asset_value = cls().get_strategy_net_asset_value() # print(strategy_net_asset_value, "strategy_net_asset_value") # (3)基准年化收益率 benchmark_year_yield = cls().get_year_yield(benchmark_net_asset_value) # (4)策略年化收益率 strategy_year_yield = cls().get_year_yield(strategy_net_asset_value) # print(benchmark_year_yield, strategy_year_yield) # (5)beta beta = cls().get_beta(benchmark_net_asset_value, strategy_net_asset_value) # print(beta) indicator_dict["beta"] = beta # (6)alpha alpha = cls().get_alpha(benchmark_year_yield, strategy_year_yield, beta) # print(alpha) indicator_dict["alpha"] = alpha # (7)volatility volatility = cls().get_volatility(strategy_net_asset_value) # print(volatility) indicator_dict["volatility"] = volatility # (8)sharpe sharpe = cls().get_sharp(strategy_year_yield, volatility) # print(sharpe) indicator_dict["sharpe"] = sharpe # (9)downside_risk downside_risk = cls().get_downside_risk(strategy_year_yield) # print(downside_risk) indicator_dict["downside_risk"] = downside_risk # (10)sortino_ratio sortino_ratio = cls().get_sortino_ratio(strategy_year_yield, downside_risk) # print(sortino_ratio) indicator_dict["sortino_ratio"] = sortino_ratio # (11)tracking_error tracking_error = cls().get_tracking_error(benchmark_net_asset_value, strategy_net_asset_value) # print(tracking_error) indicator_dict["tracking_error"] = tracking_error # (12)information_ratio information_ratio = cls().get_information_ratio(benchmark_year_yield, strategy_year_yield, tracking_error) # print(information_ratio) indicator_dict["information_ratio"] = information_ratio # (13)max_drawdown max_drawdown = cls().get_max_drawdown(strategy_net_asset_value) # print(max_drawdown) indicator_dict["max_drawdown"] = max_drawdown # 展示到html period = event.event_data_dict["strategy"].period if period == Period.DAILY.value: timetag_date = [millisecond_to_date(millisecond=i, format="%Y-%m-%d") for i in Environment.benchmark_index] else: timetag_date = [millisecond_to_date(millisecond=i, format="%Y-%m-%d %H:%M:%S") for i in Environment.benchmark_index] page = Page("strategy backtesting indicator") line_net_asset_value = Line("net_asset_value", width=1300, height=400, title_pos="8%") line_net_asset_value.add("benchmark_net_asset_value", timetag_date, [round(i, 4) for i in benchmark_net_asset_value], tooltip_tragger="axis", legend_top="3%", is_datazoom_show=True) line_net_asset_value.add("strategy_net_asset_value", timetag_date, [round(i, 4) for i in strategy_net_asset_value], tooltip_tragger="axis", legend_top="3%", is_datazoom_show=True) page.add(line_net_asset_value) line_year_yield = Line("year_yield", width=1300, height=400, title_pos="8%") line_year_yield.add("benchmark_year_yield", timetag_date, [round(i, 4) for i in benchmark_year_yield], tooltip_tragger="axis", legend_top="3%", is_datazoom_show=True) line_year_yield.add("strategy_year_yield", timetag_date, [round(i, 4) for i in strategy_year_yield], tooltip_tragger="axis", legend_top="3%", is_datazoom_show=True) page.add(line_year_yield) for indicator_name, indicator in indicator_dict.items(): cls().add_to_page(page, indicator, indicator_name, timetag_date) # print(indicator_name) millisecond_timetag = str(int(time.time()) * 1000) page.render(path=sys.argv[0][sys.argv[0].rfind(os.sep) + 1:][ :-3] + "_" + "strategy backtesting indicator" + millisecond_timetag + ".html") # 生成本地 HTML 文件
def run(self, save_trade_record=False): self.initialize() # 初始化 account_data if self.account: for account in self.account: Environment.current_account_data = AccountData() Environment.current_account_data.account_id = generate_random_id.generate_random_id( account) Environment.current_account_data.total_balance = self.capital[ account] Environment.current_account_data.available = self.capital[ account] Environment.bar_account_data_list.append( Environment.current_account_data) if self.run_mode == RunMode.TRADE.value: self.end = self._get_data.get_end_timetag( benchmark=self.benchmark, period=Period.DAILY.value) # 缓存数据开关,和bar_index的计算 if self.period == Period.DAILY.value: self.daily_data_cache = True elif self.period == Period.ONE_MIN.value: self.one_min_data_cache = True stock_list = copy.copy(self.universe) stock_list.append(self.benchmark) stock_list = list(set(stock_list)) if self._daily_data_cache: Environment.daily_data = self._get_data.get_all_market_data( stock_code=stock_list, field=["open", "high", "low", "close", "volumn", "amount"], end=self.end, period=Period.DAILY.value) if self.one_min_data_cache: Environment.one_min_data = self._get_data.get_all_market_data( stock_code=stock_list, field=["open", "high", "low", "close", "volumn", "amount"], end=self.end, period=Period.ONE_MIN.value) if self.period == Period.DAILY.value: Environment.benchmark_index = [ data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i in Environment.daily_data["open"].ix[self.benchmark].index if i >= data_transfer.date_str_to_int(self.start) ] elif self.period == Period.ONE_MIN.value: Environment.benchmark_index = [ data_transfer.date_to_millisecond(str(int(i)), '%Y%m%d') for i in Environment.one_min_data["open"].ix[self.benchmark].index if i >= data_transfer.date_str_to_int(self.start) ] # print(self.benchmark, self.start, self.end, self.period, self.rights_adjustment, self.run_mode) self.bar_index = 0 while True: try: self.timetag = Environment.benchmark_index[self.bar_index] except IndexError: if self.run_mode == RunMode.BACKTESTING.value: if save_trade_record: run_backtesting_analysis_engine(self) break elif self.run_mode == RunMode.TRADE.value: '''读取最新tick, 更新最新的分钟或者日线 if 读取最新tick, 更新最新的分钟或者日线 == done: daily_data.append(new_day_data) self.bar_index += 1 benchmark_index.append(new_day_timetag) ''' pass else: date = int( data_transfer.millisecond_to_date(millisecond=self.timetag, format="%Y%m%d")) run_bar_engine(self) @abstractmethod def initialize(self): pass @abstractmethod def handle_bar(self, event): pass