6.1 加权方法:等权、IC加权、风险平价
6.1 加权方法:等权、IC加权、风险平价
一、引言:从“因子打分”到“真金白银”
经过前五章的奋战,你已经拥有了若干个经过检验、纯化后的优质因子。现在面临最后的临门一脚:如何将这些因子信号转化为具体的股票权重?
同一个因子信号,采用不同的加权方式,最终的策略收益、风险和换手率会有天壤之别。本节将深入对比三种主流的加权方法论:朴素稳健的等权、追求效率的IC加权、以及控制风险的风险平价,帮助你在A股的复杂环境中做出最优选择。
二、基础设定:横截面打分与权重映射
在讨论具体加权方法前,我们先建立统一的输入输出标准。假设在每个月末调仓时,你已拥有:
候选股票池UtU_tUt(如:剔除ST、上市不足一年、停牌股后的全A股)。
纯净因子得分si,ts_{i,t}si,t(经过行业中性化、风格正交化后的Z-Score,值越大越好)。
我们的目标是找到一个映射函数fff,将得分转化为权重:
wi,t=f(si,t,Ωt) w_{i,t} = f(s_{i,t}, \Omega_t)wi,t=f(si,t,Ωt)
其中Ωt\Omega_tΩt包含市值、流动性等其他约束信息。
三、方法一:等权加权 (Equal Weight)
1. 核心逻辑与实现
等权是最直观的方法,它假设所有入选股票的预期收益和风险相同,给予同等关注。
操作:选取因子得分最高的 TopNNN只股票,每只分配1/N1/N1/N的权重。
importpandasaspdimportnumpyasnpdefequal_weight_top_n(factor_scores,top_n=50,min_score=None):""" 等权加权:选取Top N高分股票,等权分配 """# 1. 分数筛选 (可选)ifmin_scoreisnotNone:candidates=factor_scores[factor_scores>=min_score].dropna()else:candidates=factor_scores.dropna()iflen(candidates)==0:returnpd.Series()# 2. 排序并取Top Ntop_stocks=candidates.nlargest(top_n)# 3. 等权分配weights=pd.Series(1.0/len(top_stocks),index=top_stocks.index)returnweights## 进阶变种:分层等权 (缓解头部股票过度集中)defstratified_equal_weight(factor_scores,n_groups=5,top_group_weight=0.5):""" 分层等权:按因子分位数分组,高分组权重更大,组内等权 """# 按因子值分组factor_scores=factor_scores.dropna()groups=pd.qcut(factor_scores,q=n_groups,labels=False,duplicates='drop')weights=pd.Series(0.0,index=factor_scores.index)# 分配组间权重 (如: 最高组占50%,其余组平分剩下50%)group_weights={}group_weights[n_groups-1]=top_group_weight# 最高分组remaining_weight=1.0-top_group_weightforiinrange(n_groups-1):group_weights[i]=remaining_weight/(n_groups-1)# 组内等权forgroup_id,group_weightingroup_weights.items():stocks_in_group=groups[groups==group_id].indexiflen(stocks_in_group)>0:weights.loc[stocks_in_group]=group_weight/len(stocks_in_group)returnweights2. 优缺点与A股适用性
| 维度 | 评价 | 原因分析 |
|---|---|---|
| 收益潜力 | ⭐⭐⭐ | 无法充分利用因子信号的强弱差异,尾部低分股稀释收益 |
| 风险控制 | ⭐⭐⭐⭐ | 极度分散,单股暴雷影响小,但可能包含低流动性小票风险 |
| 换手率 | ⭐⭐⭐ | 中等,取决于因子得分的稳定性 |
| A股适配 | 极高 | 简单粗暴有效,在小市值因子或初创策略验证期首选 |
| 致命弱点 | 容量限制 | 持仓50-100只时还好,大资金无法等权配置微盘股 |
四、方法二:IC加权 (Signal Strength Weighting)
1. 核心逻辑与实现
IC加权认为因子得分的高低直接对应预期收益的大小。它不再“平均主义”,而是让高置信度的信号承载更多仓位,追求收益最大化。
操作:将因子得分(Z-Score)通过Softmax或线性缩放转化为权重。
defsignal_strength_weighting(factor_scores,method='softmax',temperature=0.3,long_only=True):""" IC加权:根据因子得分强度分配权重 """scores_clean=factor_scores.dropna()iflen(scores_clean)==0:returnpd.Series()ifmethod=='linear':# 线性缩放:w_i = (s_i - min(s)) / sum(...)min_score=scores_clean.min()shifted=scores_clean-min_score+1e-8# 避免负数和除零weights=shifted/shifted.sum()elifmethod=='softmax':# Softmax: w_i = exp(s_i / T) / sum(exp(s_i / T))# 温度参数T控制分布的陡峭程度:T越小,高分股票权重越集中scaled=scores_clean/temperature exp_scores=np.exp(scaled-scaled.max())# 数值稳定性处理weights=exp_scores/exp_scores.sum()elifmethod=='rank_power':# 幂次加权:按排名赋予非线性权重ranks=scores_clean.rank(ascending=False)# 第一名 rank=1power=2.0# 幂次越大,头部集中度越高weights=(1.0/ranks)**power weights=weights/weights.sum()# 长仓约束iflong_only:weights=weights.clip(lower=0)weights=weights/weights.sum()returnweights2. 温度参数 (TTT) 的调节艺术
在Softmax中,温度参数TTT是控制持仓集中度的关键旋钮:
T→0T \to 0T→0(低温):权重集中在得分最高的几只股票上。收益爆发力强,但波动大,换手极高。
T→∞T \to \inftyT→∞(高温):权重趋于均匀分布。逼近等权,稳健但平庸。
A股实战建议:TTT取值在 0.2−0.5之间较为适宜,既能发挥因子选股能力,又不会过度集中导致流动性危机。
3. 优缺点对比
| 维度 | 评价 | 原因分析 |
|---|---|---|
| 收益潜力 | ⭐⭐⭐⭐⭐ | 充分利用信息,让“好信号”下重注,多空收益最高 |
| 风险控制 | ⭐⭐ | 持仓集中,易受单只股票业绩变脸或流动性冲击影响 |
| 换手率 | ⭐ | 极高!因子得分微小波动会导致权重剧烈调整 |
| A股适配 | 中 | 适合高流动性股票池(如沪深300),不适合小盘股 |
| 致命弱点 | 换手与冲击 | 若不控制,交易成本会吞噬大部分理论收益 |
五、方法三:风险平价 (Risk Parity / Volatility Targeting)
1. 核心逻辑与实现
前两种方法关注“收益”,风险平价关注**“风险贡献”**。它的目标不是收益最大化,而是让组合中每只股票(或每份风险源)对总风险的贡献相等。这在A股这种高波动市场尤为重要。
操作:根据历史波动率或预测风险,反比分配权重。
defrisk_parity_naive(volatility_estimates,factor_scores=None,target_vol=0.15):""" 朴素风险平价:权重 ∝ 1 / 波动率 目标:让每只股票对组合波动的贡献大致相等 """# 如果未提供波动率,使用因子得分的横截面波动作为代理ifvolatility_estimatesisNone:# 假设因子得分已经包含了风险信息(如高分对应低风险)# 或者简单使用统一值volatility_estimates=pd.Series(1.0,index=factor_scores.index)# 核心公式:波动率越高的股票,给的权重越低risk_weights=1.0/volatility_estimates# 归一化weights=risk_weights/risk_weights.sum()# 可选:叠加因子信号 (Blended Approach)# 既考虑风险平衡,又兼顾因子方向iffactor_scoresisnotNone:signal_weights=signal_strength_weighting(factor_scores,method='linear')blended_weights=weights*signal_weights weights=blended_weights/blended_weights.sum()returnweightsdefheuristic_volatility_targeting(factor_scores,market_caps,vol_window=20):""" 启发式波动率目标:小市值高波动股票降权,大市值低波动股票提权 """# 假设已有历史波动率数据# 计算调整系数:波动率越高,调整系数越小# adj_coeff = 1 / (volatility ^ k)# 简化为使用市值作为波动率的代理(A股经验:市值越小,波动越大)# 对大市值给予更高权重置信度,对小市值降权cap_weights=np.sqrt(market_caps)# 平方根作为平滑cap_weights=cap_weights/cap_weights.sum()# 结合因子得分signal_w=signal_strength_weighting(factor_scores)final_w=signal_w*cap_weights final_w=final_w/final_w.sum()returnfinal_w2. 优缺点对比
| 维度 | 评价 | 原因分析 |
|---|---|---|
| 收益潜力 | ⭐⭐⭐ | 牺牲部分进攻性,换取更优的防守 |
| 风险控制 | ⭐⭐⭐⭐⭐ | 极佳。自动避开高波动妖股,组合回撤大幅降低 |
| 换手率 | ⭐⭐⭐⭐ | 较低,因为波动率估计相对稳定,权重变化平滑 |
| A股适配 | 极高 | 完美契合A股“牛短熊长、波动剧烈”的特征,生存能力最强 |
| 致命弱点 | 过度保守 | 可能过度压制高弹性成长股,在牛市初期跑输等权策略 |
六、综合对比与实战决策矩阵
1. 量化指标对比表 (基于A股历史回测假设)
| 方法 | 年化收益 | 年化波动 | 夏普比率 | 最大回撤 | 月度换手率 |
|---|---|---|---|---|---|
| 等权 (Top 50) | 18.5% | 26.2% | 0.71 | -42.1% | 45% |
| IC加权 (Softmax) | 21.3% | 29.8% | 0.73 | -47.5% | 85% |
| 风险平价 | 16.2% | 20.1% | 0.81 | -31.6% | 35% |
(注:风险平价在风险调整后收益上胜出)
2. 什么时候选哪种?(A股实战指南)
| 你的情况 | 推荐方法 | 配置建议 |
|---|---|---|
| 资金量 < 5000万 | 等权 或 IC加权 | 享受小资金的高弹性,无需过度担心流动性 |
| 资金量 > 1亿 | 风险平价 | 必须考虑冲击成本,安全第一 |
| 因子质量高 (IC>0.05) | IC加权 (T=0.3) | 相信你的Alpha,让强者恒强 |
| 因子质量一般 | 等权 | 分散风险,避免押注错误 |
| 风控要求严 (如资管产品) | 风险平价为主 | 配合少量IC加权增强收益 |
| 牛市/进攻期 | IC加权 | 加足马力 |
| 熊市/震荡期 | 风险平价 | 活着比赚钱重要 |
七、代码实战:组合加权流水线
最后,我们将三者串联成一个完整的Pipeline,供你直接调用。
classWeightingPipeline:"""加权策略流水线"""def__init__(self,config):self.config=configdefexecute(self,date,factor_scores,market_data=None):""" 执行加权逻辑 """method=self.config.get('weight_method','equal_weight')ifmethod=='equal_weight':top_n=self.config.get('top_n',50)weights=equal_weight_top_n(factor_scores,top_n=top_n)elifmethod=='ic_weighted':temp=self.config.get('temperature',0.3)mode=self.config.get('ic_mode','softmax')weights=signal_strength_weighting(factor_scores,method=mode,temperature=temp)elifmethod=='risk_parity':# 需要传入波动率或市值数据ifmarket_dataisNone:# 回退到等权weights=equal_weight_top_n(factor_scores,top_n=50)else:vols=market_data.get('volatility_20d',None)weights=risk_parity_naive(vols,factor_scores)elifmethod=='blended':# 混合策略:IC加权 + 风险预算ic_w=signal_strength_weighting(factor_scores)rp_w=risk_parity_naive(None,factor_scores)ifmarket_dataisNoneelserisk_parity_naive(market_data['volatility_20d'])alpha=self.config.get('blend_alpha',0.7)# IC权重占比weights=alpha*ic_w+(1-alpha)*rp_w weights=weights/weights.sum()# 后处理:市值过滤与归一化ifmarket_dataisnotNone:# 剔除微盘股 (市值 < 20亿)large_cap_mask=market_data['market_cap']>2e9weights=weights[large_cap_mask]weights=weights/weights.sum()returnweights本节总结:
等权是你的起跑线,简单可靠。
IC加权是你的加速器,放大收益但也放大风险。
风险平价是你的安全带,在A股的颠簸路况中保护你不被甩下车。
下一步:确定了权重后,我们还需要解决如何在真实市场中买卖。下一节《6.2 组合优化:考虑换手、成本、约束下的均值-方差优化》将引入交易成本和实际约束,让你的策略从“纸上谈兵”走向“沙场实战”。
