风险提示 本站内容为个人研究整理,仅供学习参考,不构成任何投资建议,据此操作风险自担。本策略的规则取自公开资料,并非个人独创交易体系。
多因子选股
把若干个因子合成一个可比分数,从一池股票里筛出候选。
内容指纹(SKILL.md 的 sha256 前 16 位):9fc9b788330a2e9b —— 下载解压后可用 shasum -a 256 SKILL.md 自行核对。
策略说明
你想从全市场或某个指数成分里压缩出一个可人工复核的候选名单,而不是把选股完全交给感觉。适合做初筛——把几千只压到几十只,剩下的仍然要你自己看。
股票池 CSV(每行一只股票,含代码列与各因子列)+ 因子清单与方向 + 每个因子的权重 + 输出条数。**本脚本不联网**,财务与行情数据需要你自己取好、拼成 CSV 再喂进来。
一张按合成分数降序的候选表:每只股票的原始因子值、标准化后的 z 值、加权总分与排名。附因子相关性矩阵,用来发现权重是否被重复计算。
- 缺失值处理:按因子统计缺失,单只缺失比例超阈值时整只剔除并计数,不用均值填充。
- 去极值:按分位法截尾(默认两侧各 1%),避免单只异常值主导排名。
- 标准化:横截面 z-score,按因子方向取正,再截断到 ±3。
- 按权重合成总分并排序。
- 输出因子相关性矩阵——高正相关说明权重被重复计算,需要人工取舍。
Python >=3.9;数据:由使用者自备(本脚本只读 CSV,不联网);脚本只用 Python 标准库。因子数据需要你自己从公开数据源取好并拼成 CSV。
LICENSE2.2 KBSKILL.md7.1 KBreferences/sources.md2.8 KBscripts/multifactor_screen.py9.5 KB
风险与局限
因子有效性会衰减,也会阶段性失效——某个因子在你发现它之前有效,不代表之后还有效。回测出来的效果对参数极其敏感,换一个窗口、换一个去极值阈值就可能反转。本工具输出的是初筛名单,不是买入建议;把多因子结果当作最终决策,等于把风控交给了参数。
出处
共 7 条- Common risk factors in the returns on stocks and bondshttps://doi.org/10.1016/0304-405X(93)90023-5Fama & French, Journal of Financial Economics 33(1), 1993。三因子模型(市场、规模 SMB、价值 HML)的原始论文。
- A five-factor asset pricing modelhttps://doi.org/10.1016/j.jfineco.2014.10.010Fama & French, Journal of Financial Economics 116(1), 2015。在三因子上增加盈利 RMW 与投资 CMA。
- The Cross-Section of Expected Stock Returnshttps://doi.org/10.1111/j.1540-6261.1992.tb04398.xFama & French, The Journal of Finance 47(2), 1992。规模与账面市值比解释横截面收益的前置研究。
- The other side of value: The gross profitability premiumhttps://www.sciencedirect.com/science/article/pii/S0304405X13000044Robert Novy-Marx, Journal of Financial Economics 108(1), 2013。质量因子构造之一:毛利润/总资产。
- Quality Controlhttps://rpc.cfainstitute.org/research/cfa-magazine/2014/quality-controlCFA Institute Magazine, 2014。质量因子的常见度量:盈利波动、毛利率、ROE、利润边际、负债占总资产比例。
- Barra Global Equity Model (GEM3)https://msci.com/resources/factsheets/Barra_Global_Equity_Model_GEM3.pdfMSCI。34 个行业因子(基于 GICS)+ 11 个风格因子 + 特质风险的三层结构。
- Barra® Taiwan Equity Modelhttps://www.msci.com/documents/1296102/1636401/BARRA®+TAIWAN+EQUITY+MODEL.pdf/5ac50476-d6ba-4c09-a34e-b3a7481edbaaMSCI。风格因子清单:Beta、Size、Book-to-Price、Leverage、Earnings Quality、Momentum、Earnings Yield、Dividend Yield、Liquidity、Residual Volatility。
SKILL.md 全文
下面这段就是下载包里 SKILL.md 的完整内容,未做删减。指纹 9fc9b788330a2e9b。
多因子选股
回答一个问题:按我定的这几个因子和权重,这一池股票里排前面的是哪些。
它的定位是「把几千只压到几十只」,把人工复核的工作量降下来。剩下的功夫仍然要你自己花。
适用场景
- 你想从全市场或某个指数成分里压缩出一个候选池,而不是逐只翻。
- 你已经有一组因子想法,想知道它们合起来排序长什么样。
- 你发现自己的几个因子可能高度相关,想先看看相关性矩阵再定权重。
输入
| 输入 | 说明 |
|---|---|
| 股票池 CSV | 每行一只股票,含代码列与各因子列 |
| 因子清单与方向 | 如 roe:+,gross_margin:+,pe_ttm:-,mom_3m:+,vol_60d:-,+ 表示越大越好 |
| 权重 | 逗号分隔,不填则等权 |
输出
- 参数与口径:样本数、剔除数、去极值方式、标准化方式、每个因子的方向与权重
- 因子相关性矩阵——用来发现权重是否被重复计算
- 候选名单:排名、总分、逐因子的标准化值
- 可导出 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。
风险与局限
- 因子有效性会衰减。 一个因子在被广泛发现之后,超额收益通常会被套利掉。某个因子在你发现它之前有效,不代表之后还有效。
- 结果对参数极其敏感。 换一个去极值阈值、换一组权重、换一个再平衡窗口,排名都可能显著变化。
- 因子有效性阈值没有权威标准。 市面上流传的「IC > 0.05 算优秀」「ICIR > 0.5 视为有效」都是业界经验,没有任何监管或学术机构对此作出强制规定。
- 质量因子没有唯一定义。 ROE、毛利率、应计、盈利波动等口径并存,选哪个会显著影响结果。
- 本脚本不做中性化。 未做行业中性化与市值中性化,所以排在前面的可能只是某个行业的集中暴露。如果你需要,这要在取数阶段先处理。
- 这是初筛,不是决策。 把多因子结果当作最终买卖依据,等于把风控交给了参数。
常见问题
为什么相关性矩阵里两个因子 0.9 相关,脚本不自动处理? 因为「怎么处理」是个决策,不是计算:你可以删掉其中一个,可以各给一半权重,也可以保留但知悉它们其实是一个因子。脚本把它指出来,选择权留给你。
IC 和 IR 是什么? IC(信息系数)是因子值与未来收益的相关系数;IR 是 IC 的均值除以 IC 的标准差。二者来自 Grinold & Kahn 的主动管理基本法则(IR = IC × √BR)。本脚本不计算它们——那需要历史面板数据,属于回测范畴,超出「初筛」的定位。
能不能用全市场几千只跑? 可以,但要注意:样本越大,去极值的作用越明显,而且缺失值的处理策略会比因子本身更影响结果。建议先在几十到几百只的池子里把流程跑通,确认排序符合预期,再放到全市场。