def _test_use(is_plot): from ibats_common import module_root_path import os # 参数设置 run_mode = RunMode.Backtest strategy_params = {'unit': 100} md_agent_params_list = [{ 'md_period': PeriodType.Min1, 'instrument_id_list': ['RB'], 'datetime_key': 'trade_date', 'init_md_date_from': '1995-1-1', # 行情初始化加载历史数据,供策略分析预加载使用 'init_md_date_to': '2014-1-1', # 'C:\GitHub\IBATS_Common\ibats_common\example\ru_price2.csv' 'file_path': os.path.abspath( os.path.join(module_root_path, 'example', 'data', 'RB.csv')), 'symbol_key': 'instrument_type', }] if run_mode == RunMode.Realtime: trade_agent_params = {} strategy_handler_param = {} else: trade_agent_params = { 'trade_mode': BacktestTradeMode.Order_2_Deal, 'init_cash': 1000000, "calc_mode": CalcMode.Margin, } strategy_handler_param = { 'date_from': '2014-1-1', # 策略回测历史数据,回测指定时间段的历史行情 'date_to': '2018-10-18', } # 初始化策略处理器 stghandler = strategy_handler_factory( stg_class=AIStg, strategy_params=strategy_params, md_agent_params_list=md_agent_params_list, exchange_name=ExchangeName.LocalFile, run_mode=RunMode.Backtest, trade_agent_params=trade_agent_params, strategy_handler_param=strategy_handler_param, ) stghandler.start() time.sleep(10) stghandler.keep_running = False stghandler.join() stg_run_id = stghandler.stg_run_id logging.info("执行结束 stg_run_id = %d", stg_run_id) if is_plot: from ibats_common.analysis.plot_db import show_order, show_cash_and_margin, show_rr_with_md show_order(stg_run_id) show_cash_and_margin(stg_run_id) show_rr_with_md(stg_run_id) return stg_run_id
def summary_stg(stg_run_id=None): from ibats_common.analysis.plot_db import show_order, show_cash_and_margin, show_rr_with_md info = get_stg_run_info(stg_run_id) stg_run_id = info.stg_run_id data_dict, file_path = show_order(stg_run_id) df = show_cash_and_margin(stg_run_id) sum_df, symbol_rr_dic, save_file_path_dic = show_rr_with_md(stg_run_id) summary_rr(sum_df, figure_4_each_col=True, col_transfer_dic={'return': sum_df.columns})
def summary_stg_2_docx(stg_run_id=None, enable_save_plot=True, enable_show_plot=False, enable_clean_cache=True, doc_file_path=None): """ 生成策略分析报告 :param stg_run_id: :param enable_save_plot: :param enable_show_plot: :param enable_clean_cache: :param doc_file_path: 可以是目录 或 文件名路径 :return: """ info = get_stg_run_info(stg_run_id) stg_run_id = info.stg_run_id stg_name = info.stg_name run_mode = RunMode(info.run_mode) kwargs = { "enable_show_plot": enable_show_plot, "enable_save_plot": enable_save_plot, "run_mode": run_mode, "stg_run_id": stg_run_id } if run_mode == RunMode.Backtest_FixPercent: sum_df, symbol_rr_dic = get_rr_with_md(stg_run_id, compound_rr=True) else: sum_df, symbol_rr_dic = get_rr_with_md(stg_run_id, compound_rr=False) if sum_df is None or sum_df.shape[0] == 0: logger.warning('stg_run_id=%d 没有获取到 sum_df', stg_run_id) file_path = None return file_path ret_dic, each_col_dic, file_path_dic = summary_rr(sum_df, **kwargs) _, file_path = show_trade(**kwargs) file_path_dic['trade'] = file_path df, file_path = show_cash_and_margin(**kwargs) file_path_dic['cash_and_margin'] = file_path # 生成 docx 文档将所需变量 heading_title = f'策略分析报告[{stg_run_id} {stg_name}] ' \ f'{date_2_str(min(sum_df.index))} - {date_2_str(max(sum_df.index))} ({sum_df.shape[0]} days)' # 生成 docx 文件 document = docx.Document() # 设置默认字体 document.styles['Normal'].font.name = '微软雅黑' document.styles['Normal']._element.rPr.rFonts.set( docx.oxml.ns.qn('w:eastAsia'), '微软雅黑') # 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式) UserStyle1 = document.styles.add_style('UserStyle1', 1) # 设置字体尺寸 UserStyle1.font.size = docx.shared.Pt(40) # 设置字体颜色 UserStyle1.font.color.rgb = docx.shared.RGBColor(0xff, 0xde, 0x00) # 居中文本 UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 设置中文字体 UserStyle1.font.name = '微软雅黑' UserStyle1._element.rPr.rFonts.set(docx.oxml.ns.qn('w:eastAsia'), '微软雅黑') # 文件内容 document.add_heading(heading_title, 0).alignment = WD_ALIGN_PARAGRAPH.CENTER document.add_paragraph('') document.add_paragraph('') heading_count = 1 document.add_heading(f'{heading_count}、策略回测收益曲线', 1) # 增加图片(此处使用相对位置) document.add_picture( file_path_dic['rr']) # , width=docx.shared.Inches(1.25) heading_count += 1 # 添加分页符 document.add_page_break() document.add_heading(f'{heading_count}、策略回撤曲线', 1) document.add_picture(file_path_dic['drawdown']) heading_count += 1 document.add_page_break() if run_mode != RunMode.Backtest_FixPercent: document.add_heading(f'{heading_count}、现金与仓位堆叠图', 1) document.add_picture(file_path_dic['cash_and_margin']) heading_count += 1 document.add_page_break() document.add_heading(f'{heading_count}、散点图矩阵图(Scatter Matrix)', 1) document.add_picture(file_path_dic['scatter_matrix']) heading_count += 1 document.add_page_break() document.add_heading(f'{heading_count}、相关性矩阵图(Correlation)', 1) document.add_picture(file_path_dic['correlation']) heading_count += 1 document.add_page_break() document.add_heading(f'{heading_count}、绩效统计数据(Porformance stat)', 1) stats_df = ret_dic['stats'].stats stats_df_2_docx_table(stats_df, document) heading_count += 1 document.add_page_break() # 交易记录 document.add_heading(f'{heading_count}、买卖点记录', 1) document.add_picture(file_path_dic['trade']) heading_count += 1 document.add_page_break() # 保存文件 if doc_file_path is not None: if os.path.isdir(doc_file_path): folder_path, file_name = doc_file_path, '' else: folder_path, file_name = os.path.split(doc_file_path) else: folder_path, file_name = get_report_folder_path(stg_run_id), '' if folder_path != '' and not os.path.exists(folder_path): os.makedirs(folder_path) if file_name == '': try: calc_mode_str = CalcMode( json.loads( info.trade_agent_params_list)[0]['calc_mode']).name + " " except: calc_mode_str = " " # run_mode_str = run_mode.name + " " file_name = f"{stg_run_id} {stg_name} {calc_mode_str}" \ f"{date_2_str(min(sum_df.index))} - {date_2_str(max(sum_df.index))} ({sum_df.shape[0]} days) " \ f"{datetime_2_str(datetime.datetime.now(), STR_FORMAT_DATETIME_4_FILE_NAME)}.docx" file_path = os.path.join(folder_path, file_name) else: file_path = doc_file_path document.save(file_path) if enable_clean_cache: clean_cache() return file_path