← 返回博客列表

【Python量化实战全攻略 #14】多因子打分与排序手册:Zscore、分位标准化(附代码)

2026年10月16日 08:40 · 智兔数服 · Python量化实战全攻略

摘要:【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. 坑与注意事项

  1. 量纲问题:因子单位不同,必须先标准化再加权。
  2. 极端值:Zscore 对异常值敏感,标准化前先 winsorize。
  3. 因子相关性:估值与质量常高度相关,合成前先看相关系数。
  4. 权重拍脑袋:等权最稳,调权重要有逻辑(如回测 IC)。

7. 小结与下一篇预告

多因子打分闭环——从五个维度合成一个可排序的股票池。下一篇讲股票池日更与行业中性:如何在横截面里做申万行业中性化。

下一篇预告:《【Python量化实战全攻略 #15】股票池日更与行业中性手册:申万行业中性化(附代码)》

8. 免责声明

本文为因子合成方法示例,演示数据为虚构,不构成投资建议。


关于数据来源:本文多因子合成所需的各子因子来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #09–#13),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲行业中性。

想亲自试一下?免费获取证书