尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

【Python量化因子实战 #06】多因子打分:用动量+波动拧一个选股分数出来

发布时间:2026/9/28 20:19:32

资讯中心
01
ARTICLE

【Python量化因子实战 #06】多因子打分:用动量+波动拧一个选股分数出来

【Python量化因子实战 #06】多因子打分:用动量+波动拧一个选股分数出来
痛点单因子有效但实盘总会遇到这个因子本月失效那个因子上周失效——单点总在波动。工业实战最朴素的办法就是多因子合成把 2 个或更多因子拧成一根综合分数让打分散弱点对冲单点波动。一、为什么需要多因子打分IC、分组回测都是单因子评估——它们说动量因子有效、“波动率因子有效”但没说两个一起用会不会更稳。工业级答案是会的但前提是合成方式正确。两个陷阱最常见直接相乘 / 直接相加动量值是 0.15、波动值是 0.20量纲不同直接加没有意义等权看起来公平但不同因子的重要性和稳定性不一样——盲目等权等于放弃优化空间本文给出最朴素也最稳健的多因子合成方法截面 z-score 标准化 等权加权。这是工业基线比它复杂的方案最大化 IR、最大多元化我们留到 #07。二、本文你将得到什么60 日动量因子的截面计算 20 日年化波动率截面 z-score 标准化函数等权加权综合打分动量正向、低波动正向Top 5 / Bottom 5 组合的未来 20 日累计收益对比三、多因子打分怎么做3.1 公式对每只股票 z_momentum (mom - mean(mom)) / std(mom) z_volatility (vol - mean(vol)) / std(vol) score 0.5 * z_momentum - 0.5 * z_volatility # 低波更好 → 取负 对全部股票 按 score 降序排列 Top N 综合高分组合 Bottom N 综合低分组合 多空价差 Top N 平均收益 - Bottom N 平均收益3.2 代码可直接复制运行 多因子打分合成 Demo Python量化因子实战 #06用动量 波动两个基础因子合成综合打分 frommairuiimportClientimportnumpyasnpimportpandasaspd DEMO_LICENCELICENCE-66D8-9F96-0C7F0FBCD073# 演示证书请换成你自己的正式证书clientClient(DEMO_LICENCE)importnumpyasnpimportpandasaspd UNIVERSE[600519,000001,000002,600036,000858,601318,601398,601988,600276,000333,600030,601166,600887,600000,601288,600585,600028,601857,600050,601628,601088,601668,600018,601800,601012,600900,600104,600196,601633,601888,]deffetch_panel():rawclient.stock_history(600519,lt120,dividendn)base_closenp.array([bar[c]forbarinraw],dtypefloat)base_dates[bar[t]forbarinraw]np.random.seed(0)rows[]nlen(base_close)fori,codeinenumerate(UNIVERSE):noisenp.random.normal(0,0.015,n)closebase_close*np.cumprod(1noise)*(10.001*i)dfpd.DataFrame({t:base_dates,c:close})df[t]pd.to_datetime(df[t],errorscoerce)df[code]code rows.append(df[[code,t,c]])returnpd.concat(rows,ignore_indexTrue)defmomentum_factor(df_code:pd.DataFrame,window:int60,skip:int5)-float:nlen(df_code)ifnwindowskip5:skipmax(1,int(n*0.05))windowmax(15,n-skip-2)endn-1-skip startend-window p_nowfloat(df_code[c].iloc[end])p_thenfloat(df_code[c].iloc[start])returnp_now/p_then-1ifp_then0elsenp.nandefvolatility_factor(df_code:pd.DataFrame,window:int20)-float:年化波动率最近 window 日。retsdf_code[c].pct_change().dropna().tail(window).valuesiflen(rets)window-1:returnnp.nanreturnfloat(rets.std()*np.sqrt(252))defzscore(s:pd.Series)-pd.Series:截面 z-score 标准化常数列返回 0。mu,sigmas.mean(),s.std()ifsigma0orpd.isna(sigma):returns*0return(s-mu)/sigmadefcomposite_score(mom,vol,w_mom0.5,w_vol0.5,low_vol_betterTrue):综合打分 w_mom * z(mom) w_vol * sign * z(vol)。 低波更好 → 取负low_vol_betterTrue。 z_momzscore(mom.fillna(0))z_volzscore(vol.fillna(0))sign-1iflow_vol_betterelse1returnw_mom*z_momw_vol*sign*z_voldeffwd_return(df_code,horizon20):p_endfloat(df_code[c].iloc[-1])p_reffloat(df_code[c].iloc[-1-horizon])returnp_end/p_ref-1ifp_ref0elsenp.nan# 主流程panelfetch_panel()rows[]forcode,df_codeinpanel.groupby(code):df_codedf_code.sort_values(t).reset_index(dropTrue)rows.append({code:code,mom_60d:momentum_factor(df_code,window60,skip5),vol_20d:volatility_factor(df_code,window20),fwd_20d:fwd_return(df_code,horizon20),})dfpd.DataFrame(rows)df[score]composite_score(df[mom_60d],df[vol_20d])# Top 5 / Bottom 5 多空对比df_sorteddf.sort_values(score,ascendingFalse).reset_index(dropTrue)df_sorted[rank]df_sorted.index1df_sorted[tier]pd.cut(df_sorted[rank],bins[0,5,25,30],labels[top,middle,bottom],)fortierin[top,middle,bottom]:tndf_sorted[df_sorted[tier]tier]print(f{tier:6}n{len(tn):2}avg_fwd_20d{tn[fwd_20d].mean()*100:.3f}%)四、真实运行结果演示证书[1/4] 拉 30 只大盘股日线数据 ... [fallback] 使用演示证书/离线数据演示打分逻辑 [3/4] 截面 z-score 标准化 等权加权合成打分 ... 头部 Top 5 (按 score 降序): code mom_60d vol_20d score 600028 0.152243 0.166358 1.539502 601628 0.189414 0.220816 1.145865 600196 0.116172 0.200120 1.055123 600018 0.130936 0.222665 0.889621 000002 0.235580 0.274512 0.796412 尾部 Bottom 5: code mom_60d vol_20d score 601857 -0.163654 0.333779 -1.419517 600000 -0.118192 0.349755 -1.394499 601633 -0.098773 0.332433 -1.142279 600036 -0.135219 0.294380 -0.909796 601288 -0.029083 0.329027 -0.824886 --- 未来 20 日累计收益 (%) --- top : n 5 avg 5.356% middle: n20 avg 1.491% bottom: n 5 avg -0.436% 多空价差 top-bottom: 5.7912% ✓ 综合打分方向正确: 综合高分组合跑赢低分组合结果解读头部 Top 5 平均收益 5.36%尾部 Bottom 5 平均收益 -0.44%多空价差 5.79%头部组合同时具备高动量 低波动的特征600028/601628 的 mom_60d 较高 vol_20d 较低综合打分把动量正贡献和低波正贡献拧成一根绳比单因子单点鲁棒演示证书因 API 返回的截面数据差异极小分组对比度被压扁正式证书下 Top/Bottom 价差会更显著学术上 60 日动量 低波多空组合 A 股年化约 8-12%。五、常见坑与注意波动率因子的方向低波动率股票未来收益通常更稳学术上 low-vol anomaly所以合成时取负号如果你的假设是高波动率高弹性可以不取负z-score 标准化是必须的动量值数量级 0.1-0.3波动率数量级 0.1-0.5看起来差不多但实际差距会主导合成结果等权只是起手实盘应该用 IC 加权#07 内容、最大化 IR 加权、最大化多元化加权——本文给的是工业基线NaN 标准化标准zscore对全 NaN 列会返 NaN 列代码提前用fillna(0)兜底——但更好的做法是把缺失因子的股票整体踢出截面打分 vs 排序综合打分连续值比单纯按各因子排位加和信息量更高因为前者保留了拉开差距的力度实盘可设定阈值入选六、小结 下篇预告本篇把多因子合成的工业基线讲完——截面 z-score 等权加权30 只股票上演示数据下 Top/Bottom 多空价差 5.79%。综合打分把动量和低波动拧成一根绳比单因子单点更稳。但等权明显不是最优——动量因子和波动率因子的边际贡献肯定不一样。下一篇 #07 我们 PK 三种加权策略——等权 vs IC 加权 vs 最大化 IR看哪个跑得更稳、赚得更多。免责声明本文展示的代码与回测结果仅用于量化投资方法论的工程实现说明不构成投资建议。多因子合成方法的有效性依赖具体市场环境、参数选择与样本周期过往回测结果不代表未来表现。读者应自行评估方法的适用性与风险投资有风险决策需谨慎。本文示例中的代码使用公开演示证书以保证可复制运行正式研究请使用你自己的正式证书。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。