Betalens新手系列 · 16 Analyst 报告解读:从 summary_df 到交互 HTML
阅读提示
这篇讲解如何解读 Analyst 生成的绩效报告——从 summary_df(指标表)到交互 HTML(plotly 图表)。学完之后,你能看懂任何一个回测报告里的每个数字是怎么算出来的,以及哪些指标最值得关注。
导言
Analyst 是 Betalens 的绩效评价模块,负责把 BacktestBase 的回测结果(净值、持仓、每日盈亏、调仓日志)转化成一组可读的指标表和交互图表。
核心用法只有两行:
1 2 3 4
| from betalens.analyst import Analyst
analyst = Analyst.from_backtest(engine, name="股息率策略", benchmark=hs300_nav) analyst.report(to_excel="report.xlsx", to_html="report.html")
|
跑完之后,你会得到一个 Excel 文件(详细数据表)和一个 HTML 文件(交互图表)。这篇讲解这些输出里的每一个数字代表什么。
Analyst 的基本用法
从回测实例创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from betalens.analyst import Analyst
analyst = Analyst.from_backtest(engine, name="股息率策略")
analyst = Analyst.from_backtest(engine, name="股息率策略", benchmark=hs300_bt)
analyst = Analyst.from_excel("backtest_dump.xlsx", name="历史策略")
|
生成报告
1 2 3 4 5 6 7 8 9 10 11
| analyst.report(to_excel="report.xlsx", to_html="report.html")
analyst.to_html("report.html")
analyst.to_excel("report.xlsx")
analyst.print_report()
|
核心指标逐个解读
summary_df:核心指标汇总表
1 2
| summary = analyst.summary_df() print(summary)
|
典型的 summary 包含以下指标:
收益类
风险类
风险调整收益类
交易类
top_holdings_df:持仓明细
1 2
| holdings = analyst.top_holdings_df() print(holdings)
|
显示最新一期(或任意一期)的 Top 10 持仓明细:代码、名称、权重、所属行业。证券名称从 daily_market 表自动查询,降级为原代码。
contribution_df:收益归因
1 2
| contrib = analyst.contribution_df() print(contrib)
|
把策略收益拆解到行业或因子维度,看哪个行业/因子贡献最大。
trade_pnl_df:交易盈亏明细
1 2
| trade_pnl = analyst.trade_pnl_df() print(trade_pnl)
|
每次调仓的盈亏明细,包含交易成本。可以用来分析”哪笔交易亏损最多”、”手续费占比多少”。
monthly_table:月度收益热力表
1 2
| monthly = analyst.monthly_table() print(monthly)
|
每个月的策略收益 vs 基准收益,格式为:
交互图表
1 2 3 4
| figs = analyst.interactive_plots() print(figs.keys())
|
每个图表都是 plotly 对象,可以在 Jupyter Notebook 里直接 fig.show(),也可以保存为 HTML 嵌入报告。
净值曲线
1 2
| fig_nav = figs["净值曲线"] fig_nav.show()
|
策略净值 vs 基准净值的叠加图,会标注最大回撤区间。
回撤曲线
从净值高点画到低点的阴影区间,颜色越深表示回撤越深。
月度收益
1
| fig_monthly = figs["月度收益"]
|
热力图:横轴是月份,纵轴是策略/基准/超额,单元格颜色深浅代表收益大小。
从 Excel 报告深度分析
1 2 3 4 5 6 7 8 9 10
| analyst = Analyst.from_excel("report.xlsx", name="分析报告")
summary = analyst.summary_df() monthly = analyst.monthly_table() figs = analyst.interactive_plots()
analyst.to_html("my_style_report.html")
|
开发者侧:指标的计算方式
如果需要自定义指标,可以直接用底层函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from betalens.analyst.metrics import ( sharpe_ratio, max_drawdown, calmar_ratio, information_ratio, )
nav = engine.nav returns = nav.pct_change().dropna()
sr = sharpe_ratio(returns, rf=0.03) mdd = max_drawdown(nav) cmr = calmar_ratio(returns, rf=0.03) ir = information_ratio(returns, benchmark_returns)
print(f"夏普比率:{sr:.3f}") print(f"最大回撤:{mdd:.2%}") print(f"卡尔玛比率:{cmr:.3f}") print(f"信息比率:{ir:.3f}")
|
底层函数都在 betalens.analyst.metrics 里,是纯函数,没有副作用,适合集成到自己的报告生成流水线里。
常见问题
1. 中文名称显示为证券代码
1 2 3 4
|
analyst.names["000001.SZ"] = "平安银行" analyst.report(to_excel="report.xlsx", ...)
|
2. 基准净值曲线缺失
1 2 3 4 5 6 7
| analyst = Analyst.from_backtest(engine, name="策略")
analyst_with_benchmark = Analyst.from_backtest( engine, name="策略", benchmark="000906.SH" )
|
3. to_excel 报错文件被占用
1 2
| analyst.to_excel("report.xlsx", index=False)
|
延伸阅读