投投资策略平台
署名 老K
策略库/多因子选股

风险提示 本站内容为个人研究整理,仅供学习参考,不构成任何投资建议,据此操作风险自担。本策略的规则取自公开资料,并非个人独创交易体系。

多因子选股

把若干个因子合成一个可比分数,从一池股票里筛出候选。

引擎 + 取数自备通用规则适用:股票
全贯穿全链路1选标的主用2定买点3定仓位4定卖点5复盘
下载完整策略包 11.2 KB · 4 个文件 · 解压即用
下载 .zip

内容指纹(SKILL.md 的 sha256 前 16 位):9fc9b788330a2e9b —— 下载解压后可用 shasum -a 256 SKILL.md 自行核对。

策略说明

适用场景

你想从全市场或某个指数成分里压缩出一个可人工复核的候选名单,而不是把选股完全交给感觉。适合做初筛——把几千只压到几十只,剩下的仍然要你自己看。

输入

股票池 CSV(每行一只股票,含代码列与各因子列)+ 因子清单与方向 + 每个因子的权重 + 输出条数。**本脚本不联网**,财务与行情数据需要你自己取好、拼成 CSV 再喂进来。

输出

一张按合成分数降序的候选表:每只股票的原始因子值、标准化后的 z 值、加权总分与排名。附因子相关性矩阵,用来发现权重是否被重复计算。

核心逻辑
  1. 缺失值处理:按因子统计缺失,单只缺失比例超阈值时整只剔除并计数,不用均值填充。
  2. 去极值:按分位法截尾(默认两侧各 1%),避免单只异常值主导排名。
  3. 标准化:横截面 z-score,按因子方向取正,再截断到 ±3。
  4. 按权重合成总分并排序。
  5. 输出因子相关性矩阵——高正相关说明权重被重复计算,需要人工取舍。
依赖

Python >=3.9;数据:由使用者自备(本脚本只读 CSV,不联网);脚本只用 Python 标准库。因子数据需要你自己从公开数据源取好并拼成 CSV。

文件清单
  • LICENSE 2.2 KB
  • SKILL.md 7.1 KB
  • references/sources.md 2.8 KB
  • scripts/multifactor_screen.py 9.5 KB

风险与局限

因子有效性会衰减,也会阶段性失效——某个因子在你发现它之前有效,不代表之后还有效。回测出来的效果对参数极其敏感,换一个窗口、换一个去极值阈值就可能反转。本工具输出的是初筛名单,不是买入建议;把多因子结果当作最终决策,等于把风控交给了参数。

出处

共 7 条

SKILL.md 全文

下面这段就是下载包里 SKILL.md 的完整内容,未做删减。指纹 9fc9b788330a2e9b。

多因子选股

回答一个问题:按我定的这几个因子和权重,这一池股票里排前面的是哪些。

它的定位是「把几千只压到几十只」,把人工复核的工作量降下来。剩下的功夫仍然要你自己花。

适用场景

  • 你想从全市场或某个指数成分里压缩出一个候选池,而不是逐只翻。
  • 你已经有一组因子想法,想知道它们合起来排序长什么样。
  • 你发现自己的几个因子可能高度相关,想先看看相关性矩阵再定权重。

输入

输入 说明
股票池 CSV 每行一只股票,含代码列与各因子列
因子清单与方向 如 roe:+,gross_margin:+,pe_ttm:-,mom_3m:+,vol_60d:-,+ 表示越大越好
权重 逗号分隔,不填则等权

输出

  1. 参数与口径:样本数、剔除数、去极值方式、标准化方式、每个因子的方向与权重
  2. 因子相关性矩阵——用来发现权重是否被重复计算
  3. 候选名单:排名、总分、逐因子的标准化值
  4. 可导出 CSV 与 JSON

核心逻辑

第一步:缺失值处理

按因子逐个统计缺失。单只股票缺失比例超过阈值(默认 40%)时整只剔除并计数,不用均值填充。

原因:填出来的值会让这只股票在排序里得到一个凭空的分数。剔除会损失样本,但填入会污染排序——统计上宁可损失样本。

第二步:去极值(winsorize)

用分位法把两侧各 1% 的值截到分位点上。不做这一步,一个极端值(比如某项财务比率因为分母极小而爆表)会主导整张排名。

第三步:标准化(z-score)

横截面标准化:

z = (x − 均值) / 标准差

然后按因子方向取正(方向为 - 的因子先取负),使所有因子的「越大越好」一致。

最后截断到 ±3,防止标准化后的极端离群值再次主导。

第四步:加权合成

总分 = Σ (权重_i × z_i)

权重之和归一化到 1。

第五步:输出相关性矩阵——这一步不能省

如果两个因子的相关系数很高(比如 ROE 与毛利率),说明它们的权重被重复计算了:同一个信息被计了两遍。矩阵是发现这件事的最直接方式。

依赖与安装

无依赖。 脚本只用 Python 标准库(读 CSV、算统计),不需要 pip install 任何东西。

因子数据需要你自己准备好并拼成 CSV——本脚本不联网。这样设计有两个理由:一是财务数据的不同口径(单季/累计、是否调整)差异很大,交给你自己决定比脚本替你猜更安全;二是避免把「取数错误」伪装成「因子无效」。

用法

# 等权五因子
python3 scripts/multifactor_screen.py --csv universe.csv \
    --factors "roe:+,gross_margin:+,pe_ttm:-,mom_3m:+,vol_60d:-" --top 30

# 指定权重
python3 scripts/multifactor_screen.py --csv universe.csv \
    --factors "roe:+,pe_ttm:-" --weights 0.6,0.4 --out picks.csv --json full.json

CSV 需要一列股票标识(代码 / code / symbol / 名称),其余列为因子。

出处

  • Fama & French (1993). Common risk factors in the returns on stocks and bonds. Journal of Financial Economics 33(1) —— 三因子模型(市场、规模 SMB、价值 HML)的原始论文。原文摘要:「There are three stock-market factors: an overall market factor and factors related to firm size and book-to-market equity.」
  • Fama & French (2015). A five-factor asset pricing model. Journal of Financial Economics 116(1) —— 在三因子上增加盈利 RMW 与投资 CMA。
  • Fama & French (1992). The Cross-Section of Expected Stock Returns. Journal of Finance 47(2) —— 规模与账面市值比解释横截面收益的前置研究。
  • Novy-Marx (2013). The other side of value: The gross profitability premium. Journal of Financial Economics 108(1) —— 质量因子构造之一:毛利润 / 总资产。
  • CFA Institute Magazine (2014), Quality Control —— 质量因子的常见度量:盈利波动、毛利率、ROE、利润边际、负债占总资产比例。这组指标并存,没有唯一定义。
  • MSCI, Barra Global Equity Model (GEM3) —— 34 个行业因子(基于 GICS)+ 11 个风格因子 + 特质风险的三层结构。
  • MSCI, Barra Taiwan Equity Model —— 风格因子清单:Beta、Size、Book-to-Price、Leverage、Earnings Quality、Momentum、Earnings Yield、Dividend Yield、Liquidity、Residual Volatility。

完整清单与逐条说明见包内 references/sources.md。

风险与局限

  1. 因子有效性会衰减。 一个因子在被广泛发现之后,超额收益通常会被套利掉。某个因子在你发现它之前有效,不代表之后还有效。
  2. 结果对参数极其敏感。 换一个去极值阈值、换一组权重、换一个再平衡窗口,排名都可能显著变化。
  3. 因子有效性阈值没有权威标准。 市面上流传的「IC > 0.05 算优秀」「ICIR > 0.5 视为有效」都是业界经验,没有任何监管或学术机构对此作出强制规定。
  4. 质量因子没有唯一定义。 ROE、毛利率、应计、盈利波动等口径并存,选哪个会显著影响结果。
  5. 本脚本不做中性化。 未做行业中性化与市值中性化,所以排在前面的可能只是某个行业的集中暴露。如果你需要,这要在取数阶段先处理。
  6. 这是初筛,不是决策。 把多因子结果当作最终买卖依据,等于把风控交给了参数。

常见问题

为什么相关性矩阵里两个因子 0.9 相关,脚本不自动处理? 因为「怎么处理」是个决策,不是计算:你可以删掉其中一个,可以各给一半权重,也可以保留但知悉它们其实是一个因子。脚本把它指出来,选择权留给你。

IC 和 IR 是什么? IC(信息系数)是因子值与未来收益的相关系数;IR 是 IC 的均值除以 IC 的标准差。二者来自 Grinold & Kahn 的主动管理基本法则(IR = IC × √BR)。本脚本不计算它们——那需要历史面板数据,属于回测范畴,超出「初筛」的定位。

能不能用全市场几千只跑? 可以,但要注意:样本越大,去极值的作用越明显,而且缺失值的处理策略会比因子本身更影响结果。建议先在几十到几百只的池子里把流程跑通,确认排序符合预期,再放到全市场。