【Python量化实战全攻略 #14】多因子打分与排序手册:Zscore、分位标准化(附代码)
摘要:【Python量化实战全攻略 #14】多因子打分与排序手册:Zscore、分位标准化(附代码) 手册定位:模块二第 6 篇(收口篇)。前面 5 篇各有因子,本篇讲把它们 合成一个总分 ——Zscore 标准化 + 分
手册定位:模块二第 6 篇(收口篇)。前面 5 篇各有因子,本篇讲把它们合成一个总分——Zscore 标准化 + 分位标准化 + 加权求和,产出可下单的股票池排序。
数据来源复用 #09–#13 各因子(估值/成长/质量/资金流/动量)。
1. 你将得到什么
- Zscore 与分位(rank pct)两种标准化方法的代码与取舍;
- 给各因子设方向后加权合成总分;
- 产出「全市场打分排序」的股票池;
- 多因子合成的 4 个坑(量纲、极端值、相关性、权重拍脑袋)。
2. 取数约定(复用)
| 子因子 | 来源 | 见 |
|---|---|---|
| 估值/成长/质量/资金流/动量分数 | 各自因子表 | #09–#13 |
3. 数据来源(复用,不重复罗列)
本篇是合成层,不新增接口;各因子字段详见 #09–#13。
4. 核心模板函数(自包含可跑)
import pandas as pd
import numpy as np
_MOCK = True
def zscore(s):
return (s - s.mean()) / (s.std(ddof=0) + 1e-9)
def composite(df, factor_cols, weights=None, higher_better=None):
X = df[factor_cols].copy()
for i, col in enumerate(factor_cols):
z = zscore(X[col])
if higher_better and not higher_better[i]:
z = -z
X[col + "_z"] = z
if weights is None:
weights = [1.0 / len(factor_cols)] * len(factor_cols)
Z = X[[c + "_z" for c in factor_cols]]
return Z.mul(weights).sum(axis=1)
def run_check():
df = pd.DataFrame([
{"代码": "600519", "PE": 26.0, "营收增速": 15.0, "ROE": 0.20, "资金流分": 0.8, "动量_5": 0.10},
{"代码": "000001", "PE": 10.0, "营收增速": 5.0, "ROE": 0.10, "资金流分": 0.3, "动量_5": -0.05},
{"代码": "600036", "PE": 6.0, "营收增速": 8.0, "ROE": 0.16, "资金流分": 0.6, "动量_5": 0.02},
])
score = composite(df, ["PE", "营收增速", "ROE", "资金流分", "动量_5"],
weights=[0.2, 0.2, 0.2, 0.2, 0.2],
higher_better=[False, True, True, True, True])
assert score.notna().all()
ranked = df.assign(总分=score).sort_values("总分", ascending=False)
print("校验通过 | 排序:", ranked["代码"].tolist())
return ranked
if __name__ == "__main__":
run_check()
5. 跑通示例
ranked = run_check()
print(ranked[["代码", "总分"]].round(3))
6. 坑与注意事项
- 量纲问题:因子单位不同,必须先标准化再加权。
- 极端值:Zscore 对异常值敏感,标准化前先 winsorize。
- 因子相关性:估值与质量常高度相关,合成前先看相关系数。
- 权重拍脑袋:等权最稳,调权重要有逻辑(如回测 IC)。
7. 小结与下一篇预告
多因子打分闭环——从五个维度合成一个可排序的股票池。下一篇讲股票池日更与行业中性:如何在横截面里做申万行业中性化。
下一篇预告:《【Python量化实战全攻略 #15】股票池日更与行业中性手册:申万行业中性化(附代码)》
8. 免责声明
本文为因子合成方法示例,演示数据为虚构,不构成投资建议。
关于数据来源:本文多因子合成所需的各子因子来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #09–#13),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲行业中性。
想亲自试一下?免费获取证书