回测 - 指标与选股
回测完成后自动计算 11 项绩效指标。此外提供因子选股器,基于 Fama-MacBeth 回归权重进行股票筛选。
绩效指标
| 指标 | 列名 | 说明 |
|---|---|---|
| 累积收益率 | 累积收益率 | 整个回测期的累计收益 |
| 最大回撤 | 最大回撤 | 收益曲线从峰顶到谷底的最大跌幅 |
| 胜率 | 胜率 | 盈利交易日占总交易日的比例 |
| 夏普比率 | 夏普比率 | 年化超额收益 / 年化波动率 |
| 卡玛比率 | 卡玛比率 | 年化收益率 / 最大回撤绝对值 |
| 索提诺比率 | 索提诺比率 | 类似夏普,但只惩罚下行波动率 |
| VaR | VaR | 95% 置信度的 Value at Risk |
| CVaR | CVaR | 95% 置信度的 Conditional VaR |
| 盈亏比 | 盈亏比 | 平均盈利 / 平均亏损(绝对值比) |
| 欧米伽比率 | 欧米伽比率 | 盈利概率加权和 / 亏损概率加权和 |
指标计算底层使用 quantstats 库。
查看结果
# 查看全部指标print(backtest_perf)
# 筛选关注的指标cols = ["symbol", "strategy", "累积收益率", "夏普比率", "最大回撤", "胜率"]print(backtest_perf[cols])
# 按策略汇总summary = backtest_perf.groupby("strategy")[[ "累积收益率", "夏普比率", "最大回撤", "胜率"]].mean()
# 找出每只股票的最优策略best = backtest_perf.loc[ backtest_perf.groupby("symbol")["夏普比率"].idxmax()]指标精度
# 默认 2 位小数_, perf = backtest(strategies, stock_price)
# 4 位小数_, perf = backtest(strategies, stock_price, metric_decimal=4)FactorSelector 因子选股
FactorSelector 使用 Fama-MacBeth 回归得到的因子权重对股票打分,选出得分最高的 N 只股票。
原理
- 对每只股票计算其在各因子上的暴露度(Beta)
- 使用 Fama-MacBeth 第二步得到的因子风险溢价(lambda)作为权重
- 股票得分 =
sum(beta_k * lambda_k) - 选取得分最高的 top N 只股票
基本用法
from jh_quant.backtest import FactorSelectorfrom jh_quant.factors import FactorEngine, FactorTypefrom jh_quant.factors.validators import FamaMacBethValidator
# 1. 计算因子收益率engine = FactorEngine()ff3 = engine.calculate_factor_returns( factor_type=FactorType.FF3, period='M', start_date='2020-01-01', end_date='2024-12-31',)
# 2. 计算暴露度exposures = engine.calculate_stock_exposures( stock_returns=stock_returns, factor_returns=ff3,)
# 3. Fama-MacBeth 得到因子权重validator = FamaMacBethValidator()fm_result = validator.validate( stock_returns=stock_returns, factor_returns=ff3, exposures=exposures,)
# 4. 创建选股器selector = FactorSelector( exposures=exposures, fm_result=fm_result,)
# 5. 选股selected = selector.select(top_n=10)# {"2023-01-31": ["000001", "600519", ...], "2023-02-28": [...]}构造参数
| 参数 | 类型 | 说明 |
|---|---|---|
exposures | DataFrame | 个股因子暴露度 |
fm_result | FamaMacBethValidationResult | Fama-MacBeth 验证结果 |
factor_alpha_threshold | float | 因子显著性阈值,默认 0.05 |
weight_normalize | bool | 是否对得分权重做归一化,默认 True |
use_significant_only | bool | 是否只使用显著的因子,默认 True |