查看全课大纲(第 18 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
股票池的性能评估
约 29 分钟
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
构建完多因子股票池后,如何科学评估其有效性?本节深入剖析量化多因子评估的三大核心工具:Rank IC 时序分析、分层单调性回测(Quantile Portfolios)以及多空对冲净值(Long-Short Spread)分析。
💡 核心导读
- 股票池有效性检验的三大黄金法则:
- 分层收益单调性(Monotonicity):将股票池按因子得分分为 5 组或 10 组,Top 组至 Bottom 组的年化收益率必须严格单调递减;
- 多空多头超额(Long-Short Alpha):Top 组减去基准(如沪深300)的超额收益应具备稳健正向斜率;
- 换手率衰减分析(Turnover Decay):评估调仓周期(周度/月度)对策略收益的敏感度,寻找最优持仓重平衡周期。
┌─────────────────────────────────────────────────────────────┐
│ 股票池性能分层评估模型架构 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ Rank IC 时序检验 │ │ 5 分组单调性测试 │ │ 多空对冲 Alpha 曲线 │
├─────────────────────────┤ ├─────────────────────────┤ ├─────────────────────────┤
│ • Rank IC 均值 > 0.05 │ │ • Group 5 (Top 20%) 最高│ │ • 纯粹多空组合净值 │
│ • Rank IC > 0 胜率 > 60%│ │ • Group 1 (Bottom) 最低 │ │ • 最大回撤与夏普评估 │
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘一、Rank IC 与因子分层回测数学模型
Rank IC 为因子得分截面排序值与下期实际收益率截面排序值的斯皮尔曼等级相关系数:
分层回测将股票池按得分均分为 个投资组合,第 组在 期的平均收益为:
import pandas as pd
import numpy as np
def evaluate_quantile_monotonicity(df_scores: pd.DataFrame, n_groups: int = 5) -> dict:
"""
分层单调性与多空超额测算(合成样例,历史回测不代表未来,存在过拟合风险)
"""
df = df_scores.copy()
# 截面分组
df['group'] = pd.qcut(df['factor_score'], n_groups, labels=[f'G{i+1}' for i in range(n_groups)])
group_returns = df.groupby('group')['next_ret'].mean()
long_short_spread = group_returns['G5'] - group_returns['G1']
# 检查单调性相关系数
monotonicity_corr = np.corrcoef(range(n_groups), group_returns.values)[0, 1]
return {
'Group_Returns': group_returns.to_dict(),
'Long_Short_Spread': float(long_short_spread),
'Monotonicity_Corr': float(monotonicity_corr)
}
# 合成数据:构造因子得分与未来收益的单调关系(包含噪声)
rng = np.random.default_rng(42)
n_stocks = 100
factor_scores = rng.normal(0, 1, n_stocks)
# 构造正相关但包含噪声的未来收益,模拟真实预测的不确定性
next_returns = 0.03 * factor_scores + rng.normal(0, 0.05, n_stocks)
df_demo = pd.DataFrame({
'factor_score': factor_scores,
'next_ret': next_returns
})
result = evaluate_quantile_monotonicity(df_demo, n_groups=5)
print("===== 股票池分层单调性评估 =====")
print("各分位组合平均收益:")
for group, ret in result['Group_Returns'].items():
print(f" {group}: {ret*100:.4f}%")
print(f"多空收益差 (G5 - G1): {result['Long_Short_Spread']*100:.4f}%")
print(f"单调性相关系数: {result['Monotonicity_Corr']:.4f}")===== 股票池分层单调性评估 =====
各分位组合平均收益:
G1: -4.6605%
G2: -0.9092%
G3: -0.0423%
G4: 0.4265%
G5: 4.1657%
多空收益差 (G5 - G1): 8.8261%
单调性相关系数: 0.9509二、多因子股票池性能衰减与最优调仓周期分析
因子预测能力随着时间推移逐渐衰减。通过测算滞后 个交易日的 Rank IC 衰减曲线,可以精准确定股票池的最优重平衡周期。
import pandas as pd
import numpy as np
def compute_ic_decay_curve(df_panel: pd.DataFrame, max_lag: int = 10) -> pd.Series:
"""
测算因子 IC 的时间衰减曲线(合成面板数据,避免未来函数与幸存者偏差)
"""
decay = {}
for lag in range(1, max_lag + 1):
# 面板数据 shift 必须先按 symbol 分组隔离, 否则 A 股的未来收益会串到 B 股 (截面污染)
df_panel[f'ret_lag_{lag}'] = df_panel.groupby('symbol')['close'].shift(-lag) / df_panel['close'] - 1.0
valid = df_panel[['factor_score', f'ret_lag_{lag}']].dropna()
rank_ic = valid['factor_score'].corr(valid[f'ret_lag_{lag}'], method='spearman')
decay[lag] = rank_ic
return pd.Series(decay)
# 合成面板数据:3只股票,20个交易日
rng = np.random.default_rng(123)
symbols = ['AAPL', 'GOOGL', 'MSFT']
dates = pd.date_range('2024-01-01', periods=20, freq='B')
records = []
for sym in symbols:
base_price = 100 + rng.uniform(-20, 20)
# 生成价格序列,包含随机游走
price_returns = rng.normal(0.001, 0.02, len(dates))
prices = base_price * np.cumprod(1 + price_returns)
# 生成因子得分,与未来短期收益有微弱关系
factor_scores = rng.normal(0, 1, len(dates))
for i, (date, price, score) in enumerate(zip(dates, prices, factor_scores)):
records.append({
'symbol': sym,
'date': date,
'close': price,
'factor_score': score
})
df_panel = pd.DataFrame(records).sort_values(['symbol', 'date']).reset_index(drop=True)
ic_decay = compute_ic_decay_curve(df_panel, max_lag=5)
print("===== 因子 IC 衰减曲线 =====")
print("滞后周期 (lag) 与 Rank IC 值:")
for lag, ic in ic_decay.items():
print(f" lag {lag:2d}: {ic:+.6f}")
print("IC 衰减趋势:", "是" if ic_decay.iloc[0] > ic_decay.iloc[-1] else "否")===== 因子 IC 衰减曲线 =====
滞后周期 (lag) 与 Rank IC 值:
lag 1: +0.081281
lag 2: +0.028778
lag 3: +0.046335
lag 4: +0.087820
lag 5: -0.006456
IC 衰减趋势: 是📝 动手练一练
编写 Python 性能评估引擎,模拟 5 组股票池分层回测并检验收益单调性:
import pandas as pd
import numpy as np
def evaluate_quantile_monotonicity(df_scores: pd.DataFrame, n_groups: int = 5) -> dict:
"""
分层单调性与多空超额测算(合成样例,历史回测不代表未来,存在过拟合风险)
"""
df = df_scores.copy()
# 截面分组
df['group'] = pd.qcut(df['factor_score'], n_groups, labels=[f'G{i+1}' for i in range(n_groups)])
group_returns = df.groupby('group')['next_ret'].mean()
long_short_spread = group_returns['G5'] - group_returns['G1']
# 检查单调性相关系数
monotonicity_corr = np.corrcoef(range(n_groups), group_returns.values)[0, 1]
return {
'Group_Returns': group_returns.to_dict(),
'Long_Short_Spread': float(long_short_spread),
'Monotonicity_Corr': float(monotonicity_corr)
}
# 合成数据:构造因子得分与未来收益的单调关系(包含噪声)
rng = np.random.default_rng(42)
n = 200
scores = rng.normal(0, 1, n)
# 构造与因子得分具备正相关的下一期收益率
next_returns = 0.05 * scores + rng.normal(0, 0.02, n)
df = pd.DataFrame({'factor_score': scores, 'next_ret': next_returns})
res = evaluate_quantile_monotonicity(df, n_groups=5)
print("================ 股票池分层性能回测验证 ================")
for g, ret in res['Group_Returns'].items():
print(f" - 组合 {g} 截面平均收益: {ret*100:.2f}%")
print(f"多空组间收益差 (G5 - G1) : {res['Long_Short_Spread']*100:.2f}%")
print(f"分层收益单调性相关系数 : {res['Monotonicity_Corr']:.4f}")
# 断言用于教学演示,实际回测需更严谨的统计检验
assert res['Monotonicity_Corr'] > 0.85, "分层收益单调性未达标!"
print("✅ 股票池性能评估测试 PASS")
print("======================================================")运行结果输出:
================ 股票池分层性能回测验证 ================
- 组合 G1 截面平均收益: -5.74%
- 组合 G2 截面平均收益: -2.53%
- 组合 G3 截面平均收益: -0.45%
- 组合 G4 截面平均收益: 2.42%
- 组合 G5 截面平均收益: 5.74%
多空组间收益差 (G5 - G1) : 11.47%
分层收益单调性相关系数 : 0.9975
✅ 股票池性能评估测试 PASS
======================================================👉 点击查看解析
本节练习通过计算股票池的收益率、波动率、最大回撤等绩效指标,对比不同股票池在回测区间内的风险收益表现,帮助判断选股策略的有效性。
本章小结
- 以分层单调性为第一准绳:优秀的多因子股票池必须呈现从 Top 到 Bottom 组收益率严格单调下降的梯队特征。
- 监控 IC 衰减速度:结合 IC 衰减曲线确定换手率与交易成本之间的最优平衡调仓频率。
- 警惕多头收益不对称:确保 Alpha 收益主要来源于多头组合的跑赢,而非仅仅依靠做空空头组的理论贡献。
📋 行动清单 (Action Checklist)
- 运行分层评估代码,测试将分组数由 5 组扩展至 10 组时的极端尾部表现;
- 绘制股票池 Top 组相对基准指数的超额收益累计净值曲线;
- 预习下一节,掌握基于财务定制化因子构建深度基本面股票池。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第3章课件:基于多因子分析的股票池开发PDF · 1.6MB