Exemple #1
0
 def simplereport_excel(self):
     report = SimpleReport(self.portfolio)
     simple_report = report.run()
     output(simple_report)
     # 回测报告以excel表格形式输出
     workbook=xlwt.Workbook(encoding='utf-8')
     sheet1=workbook.add_sheet('sheet1',cell_overwrite_ok=True)
     c=0
     for key,value in simple_report.items():
         sheet1.write(0,c,key)
         if isinstance(value,list):
            s1=len(value)
            for s2 in range(0,s1):
                temp=value[s2]
                sheet1.write(s2+1,c,temp)  
         else:
              sheet1.write(1,c,value)         
         c+=1
     root1=os.getcwd()    #获得当前目录路径,用来存放回测报告
     adress1=root1+'/'+'simple_report.xls' #保存报告的地址
     print(adress1)
     workbook.save(adress1)     
     #净值图形输出
     plt.plot(simple_report["cumulative_returns"])
     plt.title("Cumulative_returns",fontsize='large')
     plt.show()
Exemple #2
0
    def _initialize(self, strategy=None, start=None, end=None, timezone=None, commission=None):
        self.start = start
        self.end = end
        self.commission = commission
        self.timezone=timezone
        self.portfolio = Portfolio(strategy, start, end, commission,
                                   self.frequency, self.refresh_rate, self.trigger_time)
        self.context = self.portfolio.context

        # 最小精度
        self.context.min_order = {}
        for univ in self.universe:
            exchange = univ.split('.')[1]
            self.context.min_order[exchange] = {}
        # print(self.context.min_order)
        for univ in self.universe:
            exchange = univ.split('.')[1]
            symbol = univ.split('.')[0].lower()
            min_order_qty, min_order_amount = get_min_order(exchange, symbol)
            self.context.min_order[exchange][symbol] = {'min_order_qty':min_order_qty,
                                                             'min_order_amount':min_order_amount}


        # 记录universe所有的asset
        self.universe_assets = list()
        for univ in self.universe:
            base_asset = univ.split('.')[0].split('/')[0].lower()
            quote_asset = univ.split('.')[0].split('/')[1].lower()
            if base_asset not in self.universe_assets:
                self.universe_assets.append(base_asset)
            if quote_asset not in self.universe_assets:
                self.universe_assets.append(quote_asset)
        self.all_assets = list(set(AccountManager().asset_varieties + self.universe_assets))
        # print(self.all_assets)

        # # 初始每个账户添加除初始化之外的universe的asset
        # for name,account in self.portfolio.accounts.items():
        #     for asset in universe_assets:
        #         if asset not in account.current_position.keys():
        #             account.current_position[asset] = SpotPosition('spot', asset, 0, 0, 0, 0)

        self.total_dates = get_total_dates(self.frequency, 1, self.trigger_time, self.start, self.end)
        self.strategy_dates = get_total_dates(self.frequency, self.refresh_rate, self.trigger_time, self.start, self.end)
        if self.frequency in ['d','1d','day','1day']:
           self.day_date=get_day_dates(self.start, self.end,self.refresh_rate)
        else:
           self.day_date=get_day_dates(self.start, self.end)
        # 先输出report的dates信息,画图用
        output({"display_type": "strategy",
              "dates":self.day_date})

        try:
            self.initialize(self.context)
        except Exception:
            output({"display_type": "error",
                    "error_msg": traceback.format_exc()})
            return 1
Exemple #3
0
    async def _handle_data(self):
        # print("******************************************************************")
        clock = self.context.clock
        current_date = clock.current_date
        logger.current_date = current_date
        current_timestamp = clock.current_timestamp
        # print(current_date)
        prebars=clock.pre_bar

        pre_start = str(str2datetime(self.start) - datetime.timedelta(days=prebars))
        try:
            if not self.cache_data:
                self.cache_data = self.context.prepare_data(self.universe, self.all_assets, self.benchmark,
                                                                  self.frequency, pre_start, self.end, self.timezone)
        except Exception:
            output({"display_type": "error",
                    "error_msg": traceback.format_exc()})
            return 1

        # 记录初始持仓
        start = self.start + ' ' + self.trigger_time[0] if self.trigger_time else self.start # 只支持一个trigger_time
        if current_timestamp == str2timestamp(start):
            for name, account in self.portfolio.accounts.items():
                for asset, position in account.current_position.items():
                    position.context = self.context
            init_portfolio_position = dict()
            for asset in self.context.asset_varieties:
                init_pp_detail = PortfolioPosition(self.context, asset, self.portfolio.accounts).detail()
                init_portfolio_position[asset] = init_pp_detail

            self.context.init_portfolio_position = init_portfolio_position
            self.context.init_position_total = sum([asset['total_amount'] for asset in init_portfolio_position.values()])

            self.context.init_total_account_position = {}
            for name in self.context.accounts_name:
                name_position = "{}_position".format(name)
                total_amount = 0
                for asset,value in self.context.init_portfolio_position.items():
                    if name in value['consist_of'].keys():
                        total_amount += value['consist_of'][name]['amount']
                self.context.init_total_account_position[name_position] = total_amount

            # logger.info('【记录初始持仓时间】:{} s'.format(str(time.time() - start2)[:5]))

        try:
            if str(current_date) in self.strategy_dates:
                self.handle_data(self.context)
        except Exception:
            output({"display_type": "error",
                    "error_msg": traceback.format_exc()})
            return 1

        self.portfolio.record_history()
Exemple #4
0
async def _handle(strategy):
    global error_complete
    try:
        while True:
            clock = strategy.portfolio.context.clock
            timenow = time.time()
            if (timenow - clock.datestart) > Config.heartbeat_timelength():
                clock.reset_datestart()
                output('heartbeating')
            if error_complete == 1:
                return
            if clock.current_timestamp > clock.end_timestamp:
                break
            error_complete = await strategy._handle_data()
            clock.next()
            await asyncio.sleep(0)
    except Exception as e:
        error_complete = 1
        raise e
Exemple #5
0
async def _report(strategy):
    global error_complete
    try:
        while True:
            await asyncio.sleep(1)
            if error_complete == 1:
                return
            clock = strategy.portfolio.context.clock
            if clock.current_timestamp > clock.end_timestamp:
                clock.run_end = time.time()
                strategy.portfolio.context.completed_time = round(
                    clock.run_end - clock.run_start, 4)
                # print('【handle总耗时】:{} s'.format(strategy.portfolio.context.completed_time))
                strategy.simple_report()
                strategy.complete_report()
                end_time = time.time()
                total_time = round(end_time - clock.run_start, 4)
                output('total_time:{}'.format(total_time))
                break

            if strategy.frequency in ['d', '1d', 'day', '1day']:
                if clock.bars > Config.bars_length():  #这个在分钟线里怎么解决出错的问题
                    clock.reset_bars()
                    strategy.simple_report()
            elif strategy.frequency in ['m', '1m', 'min', 'minute']:
                if clock.bars > Config.bars_length_1m():
                    clock.reset_bars()
                    strategy.simple_report()

            elif strategy.frequency in ['5m', '5mins', '5minutes']:
                if clock.bars > Config.bars_length_5m():
                    clock.reset_bars()
                    strategy.simple_report()

    except Exception as e:
        error_complete = 1
        raise e
Exemple #6
0
    def simple_report(self):
        report = SimpleReport(self.portfolio)
        simple_report = report.run()
        output(simple_report)

        # 回测报告以excel表格形式输出
        workbook = xlwt.Workbook(encoding='utf-8')
        sheet1 = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
        c = 0
        for key, value in simple_report.items():
            sheet1.write(0, c, key)
            if isinstance(value, list):
                s1 = len(value)
                for s2 in range(0, s1):
                    temp = value[s2]
                    sheet1.write(s2 + 1, c, temp)
            else:
                sheet1.write(1, c, value)
            c += 1
        workbook.save('D:/simple_report.xls')  #存储在D盘中
        #净值图形输出
        plt.plot(simple_report["cumulative_returns"])
        plt.title("Cumulative_returns", fontsize='large')
        plt.show()
Exemple #7
0
 def complete_report(self):
     report = CompleteReport(self.portfolio)
     complete_report = report.run()
     output(complete_report)
Exemple #8
0
 def simple_report(self):
     report = SimpleReport(self.portfolio)
     simple_report = report.run()
     output(simple_report)