Qbot 内置 QuantStats 插件变更史解读:从 0.0.01 到 0.0.59 的量化绩效指标库演进全记录 Qbot 内置 QuantStats 插件变更史解读从 0.0.01 到 0.0.59 的量化绩效指标库演进全记录【免费下载链接】Qbot[updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/Qbot本文以 Qbot 仓库中随仓分发的 QuantStats 绩效分析库qbot/plugins/quantstats/的完整变更日志 CHANGELOG.rst 为主体逐版本解读 59 个变更条目背后的能力演进脉络并结合 stats.py、reports.py、utils.py 等源码印证 Treynor 比率、概率夏普比率、基准日期对齐match_dates等里程碑特性的落地实现同时梳理升级过程中唯一的破坏性变更trading_year_days重命名为periods_per_year与依赖迁移记录帮助读者快速判断本地版本的可用指标与正确用法。1. QuantStats 在 Qbot 中的定位QuantStats 是一个“面向量化人员的组合分析Portfolio analytics for quants”库用于对策略收益率序列做绩效剖析与风险度量。在 Qbot 仓库中它以插件形式内置在 qbot/plugins/quantstats/ 目录下目录结构如下quantstats/stats.py各类绩效/风险指标计算夏普、索提诺、最大回撤、VaR/cVaR、凯利公式等quantstats/plots.py 与 quantstats/_plotting/收益曲线、回撤图、月度热力图、滚动指标等可视化quantstats/reports.py指标报表、批量绘图与 HTML tear sheet 生成模板见 quantstats/report.htmlquantstats/utils.py收益率与价格序列互转、指数构建make_index、基准数据准备等工具函数quantstats/init.py对外暴露stats、plots、reports、utils四个模块并提供extend_pandas()扩展入口docs/内置示例产物如snapshot.jpg、tearsheet.html、quantstats-tearsheet.html与整页 tear sheet 截图report.jpgCHANGELOG.rst、README.rst、requirements.txt、setup.py 等工程文件。版本事实锚点quantstats/version.py 中声明version 0.0.59与 CHANGELOG 的最新条目0.0.59完全一致说明该插件源码快照对应变更日志的最后一个版本。quantstats/init.py 通过__version__ version.version将其透传给qs.__version__运行时可直接读取当前版本。对 Qbot 用户而言这个插件的典型用途是把回测/模拟盘得到的日收益率Series交给 QuantStats得到一套完整的绩效指标表和可存盘为 HTML 的 tear sheet 报告。仓库内也存在实际使用示例例如 pytrader/strategies/notebook/quantstats-rolling.ipynb 与 docs/notebook/quantstats-rolling.ipynb滚动指标分析 notebook同目录下的my_quant_stats.html即为其 HTML 报告产物。2. 版本发布机制与配套文件从源码结构看变更日志与版本号是“两处一致”的发布方式# qbot/plugins/quantstats/quantstats/version.py version 0.0.59CHANGELOG 采用 RST 格式按版本号降序排列从0.0.01Pre-release placeholder预发布占位到0.0.59Fixed EOY compounded return calculation修复年末复合收益计算。依赖清单 requirements.txt 当前内容为pandas0.24.0 numpy1.16.5 seaborn0.9.0 matplotlib3.0.0 scipy1.2.0 tabulate0.8.0 yfinance0.1.70 python-dateutil2.0其中yfinance依赖正是变更日志 0.0.10 条目迁移到yfinance与 0.0.54 条目“Fixed dependency name in requirements.txt”修复 requirements.txt 中依赖名的落地结果——数据下载qs.utils.download_returns见 utils.py#L235依赖它拉取基准股票日线。3. 完整变更史分阶段逐版本解读以下按时间从新到旧完整继承 CHANGELOG 全部条目并归纳出五个演进阶段。3.1 0.0.52 0.0.59报告体验收尾期版本变更条目含义0.0.59Fixed EOY compounded return calculation修复年末EOY复合收益计算0.0.58Runfillna(0)on plots beta (issue #193)对滚动 Beta 绘图中的空值做fillna(0)处理修复绘图断线问题0.0.57Fixedsigmacalculation instats.probabilistic_ratio()修复概率比率内部的标准差sigma计算0.0.56Added option to explicitly provide the benchmark title viabenchmark_title...允许显式指定基准标题0.0.55Fix for benchmark name in html report when supplied by the user修复用户传入基准时 HTML 报告中的基准名显示0.0.54Fixed dependency name in requirements.txt修复 requirements.txt 中的依赖名0.0.53Added information ratio to reports报告新增信息比率Information Ratio0.0.52Added Treynor ratio新增特雷诺比率Treynor Ratio这一阶段的主题是“让 HTML tear sheet 的基准呈现更准确、指标表更完整”。源码印证见第 4.2、4.3 节。3.2 0.0.43 0.0.51基准对齐与风险指标扩容期版本变更条目0.0.51完整报告新增最大连续盈利/亏损次数max consecutive wins/losses报告新增“与基准的相关性”correlation to benchmark清理报告中的 inf/nan统计列与 HTML 报告显示基准名称新增概率夏普/索提诺比率probabilistic sharpe/sortino ratios修复相对日期计算relative dates calculations0.0.50修复最大回撤max drawdown上报时的 bug0.0.49修复 HTML 报告存盘为文件的问题0.0.48修复无风险利率RF显示 bug0.0.47修复平均回撤average DD显示 bug0.0.46杂项 bug 修复与性能提升0.0.45修复stats.rolling_sharpe()参数不匹配问题0.0.44修正utils.make_index()的日期匹配逻辑0.0.43修复stats.rolling_sortino()计算报告新增match_dates标志用于同步策略与基准的日期与频率以保证可比utils._prepare_benchmark()新增prepare_returns标志杂项代码清理与提速0.0.42易用性改进0.0.41修复拼写错误这一阶段最重要的能力是0.0.43 的match_dates策略序列与基准序列如股票 vs ETF的交易日/频率不一致时指标beta、R²、信息比率等会失真该标志在报告入口统一对齐日期轴源码见 reports.py#L49 的_match_dates()。3.3 0.0.37 0.0.42滚动指标与“一年有多少交易日”参数化含唯一破坏性变更版本变更条目0.0.41修复拼写错误0.0.40utils.make_index()新增rebalance选项plots.snapshot()新增log_scaleTrue/False选项对数坐标0.0.39修复plots.rolling_volatility()基准显示问题该 bug 由 0.0.37 引入0.0.38新增stats.smart_sharpe()与stats.smart_sortino()0.0.37新增stats.rolling_sharpe()、stats.rolling_sortino()、stats.rolling_volatility()新增stats.distribution()新增 Omega 比率破坏性变更trading_year_days参数重命名为periods_per_year杂项清理与提速0.0.36reports.metrics()新增as_pct参数便于将指标以 DataFrame 形式展示0.0.37 是整份变更史中唯一的 BREAKING CHANGE。此前0.0.33引入trading_year_days参数允许交易频率不是每年 252 个交易日的场景例如 0.0.33 条目明确写道交易加密资产可传trading_year_days365国际市场可传其他数值0.0.37 将该参数统一更名为periods_per_year。因此跨 0.0.37 升级时所有以trading_year_days形式传参的调用包括qs.reports.html(...)、qs.reports.metrics(...)等报告入口都需要改为periods_per_year。0.0.37 新增的滚动三件套与smart_sharpe/smart_sortino在 stats.py 中均可对应rolling_volatilitystats.py#L239、smart_sharpestats.py#L304、rolling_sharpestats.py#L308、smart_sortinostats.py#L360、rolling_sortinostats.py#L364、omegastats.py#L480。3.4 0.0.31 0.0.36指数构建与年化精度改进版本变更条目0.0.35修正rolling_beta()传入的滚动窗口新增 Serenity Index将trading_year_days传入metrics方法修复 “day is out of range for month” 错误0.0.34修复stats.consecutive_wins()与stats.consecutive_losses()的 bug消除 seaborndistplot弃用告警通过传入trading_year_days改进年化计算0.0.33报告支持传入“每年天数”trading_year_days365适用于加密货币等场景0.0.32修复plot_histogram()bugissue 94/950.0.31支持为 adjusted sortino 设置周期新增utils.make_index()便于快速构建“ETF 式”指数收益序列0.0.30修复 PIP 安装器0.0.29小范围代码重构0.0.28gain_to_pain重命名为gain_to_pain_ratio代码重构0.0.26杂项 bug 修复与代码改进make_index()的当前签名印证了 0.0.31 与 0.0.40 两次增强utils.py#L326-L327 中为make_index(ticker_weights, rebalance1M, periodmax, returnsNone, match_datesFalse)rebalance接受 Pandas 重采样间隔或None永不调仓match_dates对应 0.0.44 的日期逻辑修正。3.5 0.0.24 0.0.30pandas 扩展方法与安装渠道版本变更条目0.0.30修复 PIP 安装器0.0.29小范围代码重构0.0.27报告新增 Sortino/√2 与 Gain/Pain 比率合并 PR 修复若干 bug0.0.26杂项 bug 修复与代码改进0.0.25修复conditional_value_at_risk()修复 notebook 中%matplotlib inline问题0.0.24为 pandas 增加 mtd/qtd/ytd 方法用法df.mtd()修复 Pandas 弃用告警修复 Matplotlib 弃用告警尝试在 notebook 中自动设置%matplotlib inline0.0.23修复利润因子profit factor公式0.0.22杂项 bug 修复0.0.21修复 EOY 图表在 10 年以上数据时的xticks修复日收益率 ≥100% 时的异常修复 Snapshot 绘图删除重复代码新增 conda 安装器重构与优化0.0.24 的df.mtd()/df.qtd()/df.ytd()月初至今/季初至今/年初至今收益在源码中对应 utils.py#L31-L43 的_mtd/_qtd/_ytd并通过init.py#L121-L123 挂到pandas.core.base.PandasObject上。0.0.25/0.0.24 提到的%matplotlib inline自动处理则由init.py#L30-L31 的utils._in_notebook(matplotlib_inlineTrue)实现。3.6 0.0.17 0.0.23核心指标公式校正期版本变更条目0.0.21修复 10 年以上数据时 EOY 图表 xticks修复日收益率 ≥100% 问题修复 Snapshot 绘图删除重复代码新增 conda 安装器0.0.20杂项 bug 修复0.0.19计算前清洗数据将 inf/-inf/-0 替换为 0移除对pandas.compound()的依赖以兼容未来 pandas 版本自动在价格序列与收益率序列之间按需转换0.0.18修复数据最后日期在历史时的问题issue #4修复回撤期不足 5 个时的问题issue #40.0.17提高 CAGR 计算精度实盘live trading模式下当前正处于回撤期时更好地处理回撤0.0.16更好地处理“无回撤”情形0.0.15改善报告格式代码清理0.0.14修复滚动夏普/索提诺图表计算改善 HTML 报告打印样式0.0.13修复compoundedFalse时报告中非复合图表的问题0.0.12报告新增compoundedTrue/False选项默认True0.0.11小范围 bug 修复0.0.19 的“价格/收益率自动转换”是 QuantStats 易用性的关键设计传入净值曲线价格序列也能直接算出正确的夏普等指标。源码中to_prices/to_returns被extend_pandas()一并挂载init.py#L110-L113utils侧的to_log_returns见 utils.py#L87。3.7 0.0.01 0.0.16奠基期版本变更条目0.0.16更好地处理“无回撤”情形0.0.15 0.0.11报告格式、滚动图修复、compounded选项、小范围修复见上表 0.0.15-0.0.11 条目0.0.10数据源由fix_yahoo_finance迁移到yfinance安装与使用0.0.09plots.earnings()与utils.make_portfolio()支持 3 种模式cumulative 累计 / compounded 复合 / fixed amount 固定金额新增 DataFrame 工具df.curr_month()与df.date(date)杂项修复与重构0.0.08改进 cagr、var、cvar、avg win/loss 与 payoff_ratio 计算移除to_plotly()无用参数log_returns()新增 risk free 参数并更名to_log_returns()0.0.07show为 False 时返回收益图对象0.0.06小范围 bug 修复0.0.05新增plots.to_plotly()方法指标报告新增 Ulcer Index溃疡指数改进收益率/价格序列的自动识别0.0.04stats新增pct_rank()utils新增multi_shift()0.0.03改进 VaR/cVaR 计算修复to_drawdown_series()VaR/cVaR 默认置信度改为 95%改进 Sortino 公式修复to_prices()收益率转价格0.0.02初始发布Initial release0.0.01预发布占位Pre-release placeholder其中multi_shiftutils.py#L59、to_drawdown_seriesstats.py#L778、pct_rankinit.py#L100均可在源码中一一对应。4. 里程碑特性的源码级印证4.1 基准日期对齐match_dates0.0.430.0.43 为报告入口新增match_datesFalse标志。源码中 reports.py#L49 定义了_match_dates(returns, benchmark)随后在metrics、plots、html等多个报告函数签名中透传该参数并在match_dates is True时先执行returns, benchmark _match_dates(returns, benchmark)见 reports.py#L68-L100 及后续多个函数处的同名分支如 L381-L389、L461-L469、L521-L555、L883-L915。其用途是把策略与基准的日期轴与频率同步保证 beta、R²、信息比率等“成对”指标的可比性——这是对比策略与指数基准例如 A 股策略对比沪深 300时的正确姿势。4.2 基准命名benchmark_title0.0.55/0.0.560.0.55 修复用户传入基准时 HTML 报告中基准名的显示0.0.56 进一步允许显式传benchmark_title...。实现位于 reports.py#L86-L99优先读取kwargs.get(benchmark_title)若未提供则依次回退到传入的字符串基准如SPY、Series 的.name、DataFrame 首列的.name最后兜底为Benchmark并替换模板中的{{benchmark_title}}占位符。该占位符在 HTML 模板 report.html#L23 的页眉中渲染。4.3 风险与效率指标扩容0.0.51 0.0.53Treynor 比率0.0.52stats.py#L462-L477实现为(comp(returns) - rf) / betabeta 由greeks(returns, benchmark)计算beta 为 0 时返回 0 以避免除零。概率比率0.0.510.0.57 修复probabilistic_sharpe_ratiostats.py#L433-L438、probabilistic_sortino_ratiostats.py#L441-L446与probabilistic_adjusted_sortino_ratiostats.py#L449-L459均委托内部probabilistic_ratio()smart参数可切换为“smart”基准0.0.57 修复的正是该内部函数中 sigma 的计算。信息比率0.0.53information_ratio见 stats.py#L906并经由extend_pandas()暴露为df.information_ratio(benchmark)init.py#L128。这些新增 API 全部登记在init.py#L102-L107 的extend_pandas()中说明 0.0.52/0.0.53 的新指标既能通过qs.stats.xxx(...)调用也能作为 pandas Series 方法使用。4.4 一行构建指数收益make_index()0.0.310.0.40 增强0.0.31 引入utils.make_index()用于快速构建“ETF 式”指数序列0.0.40 为其加入rebalance调仓选项0.0.44 修正其日期匹配逻辑。当前实现 utils.py#L326-L385 的核心逻辑传入ticker_weights各标的权重按rebalancePandas 重采样间隔默认1M月度调仓传None表示永不重新平衡在调仓日将权重乘入指数序列从而得到一个与策略收益序列可直接对比的合成基准。4.5 滚动指标与分布图0.0.37 / 0.0.380.0.37 一次引入rolling_sharpe()、rolling_sortino()、rolling_volatility()与distribution()0.0.38 补充smart_sharpe()/smart_sortino()。绘图侧由 quantstats/_plotting/wrappers.py 的rolling_volatilityL706、rolling_sharpeL749、rolling_sortinoL793等 wrapper 封装plots.*只是薄代理。这也解释了变更史中 0.0.45rolling_sharpe参数不匹配、0.0.39rolling_volatility基准显示、0.0.35rolling_beta滚动窗口等一系列修正——滚动三件套引入后经历了较长时间的参数校准。4.6 数据清洗与年化参数0.0.19 / 0.0.33 / 0.0.370.0.19 声明“计算前将 inf/-inf/-0 替换为 0”与 0.0.51 的“清理报告中的 inf/nan”形成从数据层到展示层的两级防御。年化口径方面0.0.33 引入“每年天数”参数加密场景trading_year_days3650.0.34 将其传入年化相关计算0.0.37 统一重命名为periods_per_year当前指标函数签名中普遍采用periods252这类参数形式如treynor_ratio(returns, benchmark, periods252.0, rf0.0)stats.py#L462与变更史描述一致。5. 在 Qbot 中的典型用法README.rst 给出的 Quick Start 是该插件的标准入口直接可用%matplotlib inline import quantstats as qs # 扩展 pandas让 df 可以直接调用 df.sharpe() 等方法 qs.extend_pandas() # 拉取某标的的日收益率依赖 yfinance见 requirements.txt stock qs.utils.download_returns(FB) # 计算夏普比率两种方式等价 qs.stats.sharpe(stock) # 或 stock.sharpe() # 绘制绩效快照对应仓库内 docs/snapshot.jpg 的产物形态 qs.plots.snapshot(stock, titleFacebook Performance) # 生成完整 HTML tear sheetbenchmark 可为 Series 或 ticker qs.reports.html(stock, SPY)报告入口支持qs.reports.metrics(modebasic|full)、qs.reports.plots(modebasic|full)、qs.reports.basic(...)、qs.reports.full(...)与qs.reports.html(...)五种组合。结合 0.0.43/0.0.56 之后的能力对比策略与基准时的完整写法可写成qs.reports.html( strategy_returns, benchmark, match_datesTrue, # 0.0.43对齐策略与基准日期/频率 benchmark_titleCSI300, # 0.0.56显式指定基准标题 )仓库内的 pytrader/strategies/notebook/quantstats-rolling.ipynb、pytrader/strategies/notebook/quantstats-rolling.ipynb 同目录的my_quant_stats.html即为上述 HTML 报告的产物示例可作为输出形态参照整页 tear sheet 效果可对照 qbot/plugins/quantstats/docs/report.jpg 与 qbot/plugins/quantstats/docs/tearsheet.html 查看。6. 升级与兼容性注意事项唯一的破坏性变更在 0.0.37trading_year_days重命名为periods_per_year。若从 0.0.36 及更早版本升级需检查所有报告/指标调用中的该参数名如加密场景的trading_year_days365需改为periods_per_year365。函数更名0.0.28 将gain_to_pain更名为gain_to_pain_ratio当前实现 stats.py#L5080.0.08 将log_returns更名为to_log_returns。数据源迁移0.0.10 起使用yfinance而非fix_yahoo_finance0.0.54 修正了依赖名本地使用时download_returns依赖网络与 yfinance 版本当前约束yfinance0.1.70见 requirements.txt。运行依赖Python 3.5README 声明pandas/numpy/seaborn/matplotlib/scipy/tabulate/python-dateutil版本约束见 requirements.txtplotly为可选项仅在使用plots.to_plotly()0.0.05 引入时需要。版本确认升级前后可用qs.__version__对照 version.py当前随仓版本为 0.0.59与 CHANGELOG 末条一致。7. 小结这份 CHANGELOG.rst 记录了 QuantStats 从 0.0.01 占位到 0.0.59 的 59 个版本迭代演进主线清晰可循奠基期0.0.01-0.0.10VaR/cVaR、回撤序列、价格/收益互转、yfinance 迁移→公式校正期0.0.11-0.0.25CAGR、利润因子、cVaR 等核心指标修复→能力扩容期0.0.26-0.0.40mtd/qtd/ytd、make_index、Serenity Index、滚动夏普/索提诺/波动率、Omega、periods_per_year重命名→基准可比期0.0.41-0.0.51match_dates、prepare_returns、连续胜负、基准相关性、概率比率→体验收尾期0.0.52-0.0.59Treynor、信息比率、benchmark_title、EOY 复合收益修复。对 Qbot 用户而言该插件源码快照停留在 0.0.59意味着match_dates、benchmark_title、Treynor/信息比率、概率夏普/索提诺等全部里程碑特性均可直接使用唯一需要警惕的历史迁移点是 0.0.37 的trading_year_days→periods_per_year重命名。【免费下载链接】Qbot[updating ...] AI 自动量化交易机器人(完全本地部署) AI-powered Quantitative Investment Research Platform. online docs: https://ufund-me.github.io/Qbot ✨ :news: qbot-mini: https://github.com/Charmve/iQuant项目地址: https://gitcode.com/GitHub_Trending/qbot/Qbot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考