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
Exemple #2
0
    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
            ]
Exemple #4
0
    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 文件
Exemple #5
0
    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