干货分享|新手量化入门|完整拆解多因子选股全策略,从零选因子到 AI 优化落地
由bqpveu9w创建,最终由bqpveu9w 被浏览 3 用户
一、前言
最开始做量化的时候我踩过无数大坑:网上扒几十号因子胡乱堆砌,回测曲线漂亮到离谱,一模拟盘直接大幅回撤;要么只顾埋头找 “黑马因子”,原始数据拿来直接相加选股,最后赚的钱全是蹭行业风口、赌小盘行情,压根没有真正的阿尔法收益。
打磨很久之后落地了这套 13 因子选股体系,整套逻辑通俗落地,核心逻辑:五大维度精选 13 个有效因子,每个交易日统一清洗数据、合成综合评分,买入打分前 100 只个股,每 5 个交易日做一轮调仓换股。
看着规则简单,但每一个参数、每一步处理逻辑,背后都是一次次回测试错换来的结论,下面掰开揉碎细说。
该策略可以在AI策略广场查看:https://bigquant.com/square/ai/2f465106-9f8e-1f9b-cd1b-34cdb630e8dd
二、因子挑选:摒弃堆因子陋习,用维度思维精选指标 ⚠️新手头号误区:因子越多胜率越高
很多新手入坑第一件事就是疯狂搜罗因子,盈利、估值、换手指标攒三四十个,殊不知大半指标描述的是同一种企业逻辑,重复因子只会干扰打分,造成虚假分散。 本策略精选 13 个因子,均匀拆分 5 大投资维度,各司其职互不冗余,表格通俗释义:
| 维度 | 因子数量 | 抓的是什么 |
|---|---|---|
| 盈利 | 2 | 公司赚不赚钱(归母净利润 vs 总净利润,两个口径交叉验证) |
| 现金流 | 2 | 赚的钱是不是真金白银(经营现金流看造血,投资现金流看扩张意愿) |
| 质量 | 3 | 股权结构好不好、研发投入够不够(流通比、研发强度×2数据源) |
| 规模 | 3 | 大公司还是小公司(总资产、流通市值×2数据源) |
| 换手率/技术 | 3 | 筹码稳不稳、资金在不在推(长期换手、换手波动、量价背离) |
筛选因子四条铁律,新手永久收藏
- 维度分散优先:五个赛道各负责一类选股逻辑,杜绝三四个因子全是 “盈利 / 市值” 变形,同类指标扎堆等于无效冗余;
- 同源数据交叉验证:同一个财务指标,从两张不同数据库表单取值再取平均值。不同数据表的缺失填充、数据清洗规则不一样,双数据源能对冲单一数据源异常脏数据的坑;
- 因子方向统一化:全部指标统一换算成「数值越大,个股基本面 / 筹码越优质」,换手率这类越低越好的数据直接取负数,避免合成打分时正负因子互相抵消;
- 逻辑可落地解释:拿不出经济学逻辑支撑的因子,哪怕历史 IC 数据再好看也直接舍弃。纯靠历史数据拟合的奇异因子,基本都是拟合历史噪音,实盘百分百失效。
三、因子预处理
真心话:一个经过精细化清洗的普通因子,实用性远超未经处理的顶级优质因子。绝大多数新手 80% 精力找因子,20% 随便处理数据,完全本末倒置。
整套预处理固定三步流程:缩尾去极值→标准化→行业 + 市值中性化,一步都不能省略。
3.1 去极值
实操规则:单日单因子剔除前后各 0.1% 极端数值 金融市场财报、换手、市值数据天生厚尾、偏态分布,完全不符合统计学正态分布,新手爱用的 3σ 标准差去极值在 A 股适用性极差:极端财报暴增暴减的个股要么删不掉异常值,要么误删合理尾部优质标的。 采用固定分位数截断,不用预设数据分布形态,每个交易日自适应适配数据;遇到部分波动极端的量价因子,可灵活调整为 0.5%/99.5% 截断。
3.2 Z-score标准化
实操规则:所有因子换算为均值 0、标准差 1 的标准化数据 举个很直观的例子:净利润单位是亿元,换手率是百分比,流通占比是 0~1 小数,原始数值体量天差地别,直接相加,净利润数据会完全垄断最终得分,小盘、换手类指标直接失去权重意义。 标准化之后,所有因子处在同一衡量尺度,后续等权加权才有数学意义,是低成本提升策略稳定性的关键步骤。
3.3 行业+市值中性化
这是整个策略最关键的一步。 它的目的是回答一个问题:这只股票因子值高,是因为它本身好,还是因为它恰好在一个好行业、或者恰好是小盘股?
举个例子:假设你用一个估值因子选股,在没有中性化的情况下,你会永远买到一堆银行股(行业整体估值低),而错过食品饮料里"相对便宜"的股票。你以为是因子Alpha,其实赚的是行业配置的钱。
同样,如果不剔除市值,小盘股在某些因子上天然偏高(比如研发/市值——分母小嘛),策略会不自觉地变成一个隐性的小盘股策略。行情好的时候小盘起飞,你以为因子牛逼;风格切换的时候被血洗,你才发现自己其实一直在赌小盘。
中性化之后,残差反映的是"同一行业、同等市值水平下,这只股票的因子相对强弱"——这才是你真正想买的Alpha。
但这里有一个重要的认知:中性化只是"在因子层面"剔除了行业和市值影响,并没有约束最终组合的行业和市值分布。组合构建用的是简单的"得分排序取前100",如果某个行业在某一天集体得分高,持仓还是会行业集中。这是一个简化,后面会讲怎么改进。
四、合成与选股
4.1 等权合成
13个因子处理完之后直接取平均,每个因子权重=1/13≈7.7%。
等权不是最优方案,但它是最诚实的基线。在你没有足够长的样本外数据来证明某个因子比另一个因子更可靠之前,不要轻易给权重。用历史ICIR加权看起来科学,实际上很容易过拟合——回测区间内ICIR高的因子,不一定在实盘中继续高。
先用等权跑通,确认基准收益来源清晰,再考虑加权。 这是量化研究的工程思维:先建基线,再迭代。
4.2 过滤条件
策略加了五层过滤:
- 非ST(排除退市风险股)
- 股价 > 1.2元(排除"仙股",流动性太差)
- 上市满365天(排除次新股的财务数据不稳定期)
- 剔除北交所(流动性差异太大)
- 剔除科创板(688开头,波动特性不同,且部分投资者没有交易权限)
这些过滤不是为了追求Alpha,而是为了避免策略在不可交易的标的上有持仓。回测里持有的票,实盘必须能买到。
4.3 调仓节奏
每5个交易日调一次仓,选得分前100只,等权重。
为什么是5天而不是每天?每天调仓交易成本太高(千一的双边成本,一年250个交易日就是25%的摩擦成本),而且Alpha信号的半衰期通常远大于1天,频繁换手不会多赚Alpha,只会多交手续费。
为什么是100只而不是50或200?这是一个取舍——
-
50只:更集中,单票2%权重,因子Alpha更充分暴露,但个别股票的异质风险(比如董事长突然出事)会对组合产生不可忽略的冲击
-
200只:更分散,异质风险几乎被完全分散,但排在第150-200名的票因子得分其实已经不高了,边际Alpha贡献很小
-
100只是折中选择:足够分散到忽略个股风险,又足够集中到因子Alpha不被打折扣
五、调仓优化的方向
当前策略的调仓有一个隐藏问题:第100名和第101名的因子得分可能差异极小(比如0.01),但一个满仓买入,一个直接剔除。这相当于在截断点附近制造了一个"悬崖"。
入门:得分权重梯度衰减(新手优先上手)
摒弃前 100 只统一等权重,按照综合打分高低分配持仓,得分越高配置仓位越高,权重随排名线性 / 指数缓慢下降至第 100 名。原本生硬的买卖断崖变成平滑缓坡,减少单次大额换仓带来的盘面冲击。
进阶:引入换手成本惩罚
调仓决策显性计入交易手续费成本,若备选新股票得分仅小幅优于原有持仓个股,新增的超额收益覆盖不了买卖佣金、滑点损耗,则放弃换仓。不再单纯以打分高低作为唯一买卖依据,贴合真实实盘交易环境。
高阶:量化专业玩法 —— 约束型组合优化器
跳出简单排序选股框架,用二次规划优化器构建持仓:
优化目标:最大化组合整体因子超额收益
硬性约束:
- 全仓运作,所有个股权重合计等于 100%;
- 单只个股上限 2% 仓位,严控黑天鹅风险;
- 组合行业相对基准偏离不超过 ±3%,杜绝单一行业重仓踩雷;
- 单次调仓换手率上限 30%,锁定交易成本;
- 整体市值风格贴合基准,规避大小盘单边押注。
简单概括:从 “无脑买入高分股票” 升级为「风控优先,在合规约束内择优配置」,也是机构量化主流的组合构建方式。
六、从规则驱动到数据驱动:机器学习的必然性
走到这里,你会发现这套框架里充满了"人做的选择":
- 13个因子是你挑的——为什么是这13个?
- 去极值的分位数是0.1%/99.9%——为什么不是0.5%?
- 因子权重是等权——为什么不加权?
- 合成方式是线性平均——为什么不是非线性的?
- 100只、5天——这些数字是谁定的?
每一个选择都可以争论,但本质上你在用一个固定规则去拟合一个非线性的、动态变化的市场。这个规则在某个历史区间可能表现不错,但市场结构一变,规则就需要改——而什么时候改、改成什么样,又是一堆主观判断。
机器学习的价值不在于"找到更神奇的因子",而在于把这些主观选择变成数据驱动的自适应过程:
6.1 因子选择:从人工到自动
不做"人挑13个因子",而是放入一个因子池(比如100个候选因子),让模型在每个调仓时点自动筛选当期最有效的因子。可以是滚动IC筛选,也可以是L1正则化(LASSO)自动做因子稀疏化——有效因子的权重自然非零,无效因子的权重自然归零。
6.2 因子合成:从线性到非线性
13个因子等权平均,隐含的假设是"每个因子对收益的贡献是独立的、线性的"。现实显然不是这样。比如"高盈利+低换手"的交互效应、"高研发+小市值"的非线性放大——这些用简单的线性平均捕捉不到。
树模型(XGBoost/LightGBM)天然能抓特征交互和非线性关系。把13个处理后的因子值作为特征,未来N日收益作为标签,训练一个排序模型(learning to rank),让模型自己学习"什么样的因子组合能带来高收益"。
6.3 组合构建:从排序到优化
用模型预测的"预期收益"替代等权合成得分,喂给组合优化器。优化器在风险约束下最大化预期收益,输出的就是可执行的持仓权重。
6.4 但不要让模型变成黑箱
机器学习了之后最大的风险是过拟合和不可解释。建议的做法是:
- 先用线性模型跑通基线(当前策略就是基线)
- 再用树模型做非线性增强——对比超额收益,确认非线性信息确实存在
- 保持因子层面的可解释性——不要让模型直接吃原始行情数据(那是一条通向深渊的路,噪声比远低于因子数据)
- 样本外验证要严格——滚动训练、 purge掉未来信息、考虑交易成本
七、总结
这个策略用一个最小的框架,覆盖了量化选股的核心环节:
因子选择(多维覆盖、交叉验证)
↓
因子处理(去极值→标准化→中性化——这一步比选因子更重要)
↓
因子合成(等权——最诚实的基线)
↓
排序选股(过滤+Top100——简单但有效)
↓
调仓执行(周频——在Alpha衰减和交易成本之间平衡)
从这个基线出发,每层都有明确的优化方向——权重方案、组合优化、机器学习合成。关键是先跑通基线,再逐层迭代,每次变动都要有样本外验证。不要一上来就上复杂模型,你不知道超额到底来自模型能力还是运气。