☰
量化价值投资入门:从零构建多因子选股模型的完整实践
2026/10/3 5:35:13 网站建设 项目流程

做量化价值投资这事,我前后折腾了两年多。一开始拿着Excel手动筛PE、PB,发现效率低不说,筛选逻辑也很难回测验证,后来下定决心把整套框架搬进Python,从数据清洗、因子计算到组合回测一点点搭,才算真正摸到门道。这篇博文我就把自己从零构建多因子模型的过程完整写出来,包括每一步为什么这么做、参数怎么定、哪些坑让我交过学费。如果你懂点基本面分析但不太会写代码,或者会写代码但对因子模型一头雾水,这篇文章应该能帮你少走不少弯路。

1. 量化价值投资与多因子模型的核心思路

1.1 量化价值投资到底是什么,和传统价投有什么不同

传统价值投资的核心逻辑是找到价格低于内在价值的股票,然后买入持有,等待价值回归。这个逻辑本身没有任何问题,格雷厄姆和巴菲特已经用几十年证明了它的有效性,但执行起来有一个实际问题:人力能覆盖的股票池太有限。一个人一天能深度研究三五家公司已经是极限,A股加港股加美股拢共上万只股票,你不可能用人工把所有低估标的都翻一遍。

量化价值投资做的事情,就是把这套人工筛选逻辑变成可计算的规则。比如"价格低于内在价值"这句话,放到量化框架里可以拆成PE处于历史低位、PB低于同行业均值、股息率高于某个阈值等一系列可度量的指标。模型每天把全市场股票按这些指标排序打分,机械地选出得分最高的那一批。优势很明显:覆盖范围广、决策速度快、不受情绪干扰,而且每一笔买卖都能追溯到具体的量化依据。

但这里头有个容易误解的地方,量化价值投资不是简单地用一两个估值指标排名就完事。单因子模型在实盘中经常翻车,比如只用低市盈率选股,很容易选到一批陷入困境的"价值陷阱",股价看着便宜,实际上基本面在持续恶化,越跌越便宜,越便宜越跌。所以需要把多个维度结合起来,用多因子模型来互相验证和补充。

1.2 多因子模型的基本逻辑,打个比方就懂了

多因子模型的逻辑,你可以把它想象成学校评选"三好学生"。假如只用数学单科成绩来评,那选出来的人可能偏科严重;但如果同时看数学、语文、英语、体育、品德多个维度,按不同权重算一个综合分,评选出来的结果就稳健得多。多因子选股也是同理,它不依赖某一个单一指标,而是从估值、盈利、成长、质量、波动率等多个维度刻画一只股票的综合"性价比"。

用数学语言来描述,每只股票的预期收益可以建模成多个因子暴露的线性组合,加上一个特质收益项。我自己的框架里把因子分三类:价值因子捕捉的是"买得便宜",质量因子捕捉的是"公司质地好",低波动因子捕捉的是"走势稳健"。这三类因子的相关性相对较低,组合在一起能起到分散风险的作用,不至于在某一种市场风格下被团灭。

模型预测的是股票的相对强弱排名,而不是绝对收益。这一点很关键,多因子模型不预测某只股票明天涨还是跌,它只告诉你:在全市场几千只股票里,按给定的因子逻辑来看,哪些股票的综合排名靠前。只要排名的预测能力在统计上显著,长期执行下来就能积累超额收益。

1.3 整体架构规划:数据、因子、合成、回测、风控

我在动手写代码前先在纸上画了一遍架构,这一步帮我省了后面大量的返工时间。整个框架分成五个模块,模块之间用函数接口解耦,后续替换数据源或者调整因子逻辑都很方便。

第一层是数据层,负责行情数据、财务数据和行业分类数据的获取与清洗。第二层是因子层,基于原始数据计算各类因子值,包括PE、PB、ROE这些,做完去极值、标准化、市值行业中性化处理。第三层是合成层,把多个单因子按权重合成一个综合因子得分。第四层是回测层,根据综合因子打分分层构建模拟组合,计算年化收益、夏普比率、最大回撤这些指标。第五层是风控层,设置行业暴露上限、个股权重上限、换手率约束这些硬性限制。

模块化架构最大的好处是每一层都可以单独替换和调试。比如我后来觉得数据源延迟太高,只需要改数据层,因子层和回测层完全不用动。如果一开始就把所有代码揉在一起,后续改起来会非常痛苦。

2. 因子选取与数据准备,这一步决定了模型的上限

2.1 价值因子家族详解:PE、PB、PS、EV/EBITDA

价值因子是整个模型的核心。我用过的估值指标按稳定性和实用性排序,最常用的有这么几个。

市盈率PE最直观,市值除以净利润,代表市场愿意为每单位盈利付多少钱。但PE有一个大坑,它用的是会计利润,容易受到非经常性损益干扰。比如一只股票卖了一套房产或者收到大额政府补贴,当期净利润暴增,PE瞬间变低,看起来像是低估,实际上是假象。所以我在计算PE时优先用扣非净利润,去掉一次性项目的影响。

市净率PB适合重资产行业,银行、地产、保险这些,净资产相对稳定,PB的参考价值很高。但对互联网这种轻资产行业,净资产里大多是人力资源和无形资产,PB的参考意义就不大。同一个因子在不同行业里的适用性差别很大,这也是我后面为什么要做行业中性化的原因。

市销率PS用来辅助判断那些尚未盈利或者利润波动巨大的成长型公司,用营业收入代替利润,能避开盈利为负导致PE失真的问题。缺点是营收容易被操纵,而且不同行业的毛利率差异巨大,PS的横向可比性不太好。

EV/EBITDA是目前机构用得很普遍的一个指标,企业价值除以息税折旧摊销前利润。它剔除了资本结构、折旧政策和税率的影响,更适合跨公司比较。计算EV/EBITDA需要的财务数据项比较多,对数据源要求高一些,我建议有条件的尽量用上,它能提供和PE、PB差异化的信息。

2.2 质量因子和低波动因子,为什么是价值因子的好搭档

只靠估值指标选股,最大的问题是容易掉进价值陷阱。股价便宜的公司可能确实便宜得有道理,比如行业景气度下行、管理层平庸、资产负债表有隐患。光看PE和PB,这些风险是看不出来的,所以必须引入质量因子来做二次筛选。

我常用的质量因子包括ROE及其稳定性、毛利率、经营现金流占营收比例、资产负债率。ROE代表公司的资本回报能力,连续三年ROE保持在15%以上,说明公司护城河相对靠谱。毛利率反映的是商业模式的好坏,毛利率常年高于同业说明有定价权。经营现金流这一项我吃过亏,有些公司利润表上赚了不少钱,但现金流长期为负,典型的纸面富贵,后来我把"净利润现金含量"设成了硬性过滤条件。

低波动因子也是价值因子的好搭档。这类因子选出来的是波动率较低的股票,逻辑是市场往往过度高估高波动股票的收益,低估低波动股票的稳定性。回测数据显示,在A股市场,低波动因子和价值因子组合使用,夏普比率显著优于单独使用任何一个因子。波动率计算不复杂,用过去一年日收益率的标准差就行。

2.3 数据源怎么选,财务数据对齐怎么处理

数据是整个模型的地基,数据质量差,后面所有工作都是白搭。我在数据源上踩过的坑不少,最早用某免费接口,拉取历史财务数据时发现部分公司会突然缺失几期报表,因子计算直接断档;后来换了数据质量更稳定的商用数据源,加上本地一份人工维护的财报备份做交叉核验,才算稳定下来。

财务数据的对齐是新手最容易忽略的问题。这里必须说明,上市公司年报披露日和财报期截止日之间有个时间差,A股年报最晚到次年4月30日才披露完毕,如果你在10月份还使用去年年报的数据进行选股,这已经是严重滞后了。正确的做法是用"已披露的最新财务数据",并且要假设在回测时点只能拿到当时已经公开的数据,否则就会引入未来函数,回测结果虚高到离谱。

行情数据方面要注意复权处理,前复权会把历史价格按最新股本和定价调整,等权重因子计算的时候,PE的分母是每股收益,分子是实时价格,价格复权方式必须和财务数据匹配,这块我建议单独做一套数据一致性测试,确保同一个因子在不同股票之间口径一致。

3. 因子处理与有效性检验,别让垃圾因子混进模型

3.1 去极值、标准化、中性化三步走

原始因子值不能直接拿来用。举个例子,A股每天总有一两只股票因为借壳或者资产重组,股价翻倍甚至翻几倍,PE瞬间从30倍飙到3000倍。这种极端值如果不处理,后续计算相关性或者加权平均的时候,一个极值就能扭曲整个结果。

第一步是去极值,我用的是MAD法,也就是绝对中位差法。先算出因子值的中位数,再算出每个样本离中位数的绝对偏差的中位数,这个MAD值就是数据离散程度的一个稳健度量。如果某个样本和中位数的绝对距离超过3倍MAD,就把它拉回到中位数 ± 3×MAD这个边界上。这里选3倍而不是2倍或者5倍,是因为在正态分布假设下,3倍MAD大约对应99.7%的置信区间,既能去掉极端离群值,又不会把本来有效的分布形态削掉。

第二步是标准化。我习惯先把因子值转换成z-score,即(原始值 - 均值) / 标准差,让不同量纲的因子具备可比性。否则PB的范围是0到10,股息率的范围是0到5个百分点,直接相加的话,PB的波动幅度会完全主导综合得分。z-score做完之后,再用排序百分位法映射到0到100之间的均匀分布,这样对因子原始分布的偏态不敏感,打分更稳健。

第三步是中性化。这一步是为了消除因子和行业、市值之间的系统性关联。比如银行业整体PE都比科技行业低,如果不对行业做中性化,价值因子选出来的股票就会长期集中在银行、地产这些低估值板块,行业暴露过大,一旦板块行情不好,整个组合就跟着遭殃。中性化的做法是把因子值作为因变量,把行业虚拟变量和市值对数作为自变量,跑一个线性回归,取回归残差作为中性化后的因子值,这样剩下的部分就是与行业和市值无关的"纯因子暴露"。

3.2 用IC和IR检验因子到底有没有用

处理完的因子不能直接上模型,得先检验它是否真的对未来收益有预测能力。我每构建一个新因子,都会做两个统计量检验——IC和IR。

IC叫做信息系数,计算方式是:在每个调仓时点,计算所有样本的因子值和下期实际收益之间的Spearman秩相关系数。这个系数取值为-1到1之间,正值说明因子值越高未来收益越高,负值说明反向关系。IC越高,因子的预测能力越强。行业里有个经验阈值:滚动计算近12个月的IC均值,绝对值大于0.03~0.05,因子才有实际使用价值,低于这个水平,基本就是随机噪声了。

IR是IC均值除以IC标准差,衡量的是因子预测能力的稳定性。我遇到过一些因子,整体IC均值为0.04,看起来合格,但拆开看月度IC,一会儿0.12一会儿-0.08,波动非常大。这种因子在实盘里很难用,因为你不知道哪个月它会有效。IR大于0.5算合格,大于0.8算优秀。我自己设定的硬性标准是:IC均值的绝对值大于0.05,IR大于0.5,两个条件同时满足才保留这个因子。

3.3 因子相关性管理,避免重复计算同一逻辑

选完因子之后,我还会做一次因子之间的相关性矩阵检查。为什么查这个?因为很多因子虽然名字不同,背后的经济和市场逻辑是高度重合的。比如PE和PB,两者都反映估值水平,相关系数经常在0.7以上。如果把两个高相关的因子都放进模型里再按权重相加,相当于同一个逻辑被计算了两次,超配的不是信息量,而是噪声。

我处理的方法分两步。第一步是看相关性矩阵,把相关系数大于0.7的因子聚到一起,从每组里保留IC最高或者逻辑最独立的那一个。第二步是做一个主成分分析,看看保留下来的一批因子累计算贡献了多少信息量。我现在的模型保留了5到6个有效因子,前几个主成分可以解释约70%的因子波动来源,这个信息冗余水平是可控的。

说说权重怎么定。权重我用的是IC均值加权法,主动降低IC较低因子的权重。这个方法的好处是简单透明,不容易过拟合。IC均值加权公式是w_i = IC_i / ΣIC_j,实际计算用的是近12个月滚动IC均值,每季度更新一次权重。等权配置我也试过,效果差不了太多,但IC加权能让相对有效的因子获得更多话语权,我建议有条件就用IC加权重。

4. 组合构建与回测,纸上富贵还是真金白银,就看这一步

4.1 打分法还是分层法,两种构建逻辑怎么选

模型做完综合因子打分之后,下一步是把分数变成实际的持仓组合。这里有两种主流的构建方式,各有各的适用场景。

打分法,又称加权打分法,是把每个股票的因子分按权重加权,得到总分,然后买入总分最高的前N只股票。比如全市场3000只股票,模型每期选出综合得分最高的30只,等权重买入。这种方法的优点是仓位集中,组合弹性大,假设因子有效性高的话,超额收益会很显著。缺点是换手率相对高,单只股票的权重波动也大。

分层法是把全市场股票按综合得分分成若干层,比如5层,每层20%的股票,然后构造多空组合或者做多最高层、做空最低层(如果有对冲工具的话),观察分层收益的单调性。分层法更多用于因子检验,验证因子是不是有稳定的区分度。如果分层后的收益呈现清晰的单调递增趋势,高分组收益明显高于低分组,那说明因子逻辑过硬。

实盘层面我的做法是,用打分法选股票作为核心组合,但加入约束条件:单一行业权重不超过20%,单一股票权重不超过5%,单期换手率尽量控制在30%以内。这些约束从风控的角度把组合的极端风险摁住了,避免模型在某个极端因子暴露上"梭哈"。

4.2 回测框架搭建,别再眼红那些"年化300%"的错误结果

回测是检验模型是否可行的试金石,但也是造假重灾区。网上很多晒回测曲线的,年化收益一个比一个夸张,仔细推敲全是未来函数和幸存者偏差的产物。我自己写回测框架时,把这几个容易出"虚高收益"的地方重点盯防。

第一是未来函数。回测用的每一笔数据都必须是当时条件下能真实拿到的。财务数据要用已披露的,行情数据要用收盘后的,因子计算时点要严格对齐调仓日。我在代码里专门做了一层数据时间戳校验,防止误用未来数据。

第二是幸存者偏差。如果直接用当前还在上市的公司做回测样本,那些因为退市、被借壳导致的历史股票就天然被排除在外,回测结果会系统性偏高。正确的做法是使用退市公司的历史数据一并纳入回测,确保样本完整性。这里数据源选择要特别注意,有些免费接口默认不包含已退市的股票,需要主动处理。

第三是交易成本和滑点。我回测时默认双边交易成本为千分之二,每笔交易额外设置0.5%的滑点,也就是说每次买卖都要被"吃掉"0.7%左右的成本。这样做出来的回测结果才有参考价值。很多人回测年化50%,实盘一看连10%都费劲,就是这个成本没算对。A股最低佣金是五元左右,对小资金实盘占比更高,这个细节也必须体现在回测里。

4.3 回测指标怎么看,别被蒙在鼓里

核心回测指标就那几个,但每个指标都有它坑人的地方。年化收益率是最直观的,但单看它没用,回测3年年化20%和回测10年年化20%完全是两个可信度级别。我一般要求样本期至少覆盖一个完整的牛熊周期,A股至少看5年以上的数据。

夏普比率是衡量超额收益和波动率的关系,这个指标的值越高,说明承担同样波动时收益越高,比较靠谱。我设定的及格线是1.2以上,一个合格的策略没有1.2的夏普比率,在实盘中就很难拿得住,因为回撤带来的心理压力太大了。注意这里说的是按日度收益年化后的夏普比率,月度频率计算会低估风险。

最大回撤是最考验心态的指标。我的策略最大回撤控制在15%以内,超过这个数我心里就没底,容易在低位割肉。降低回撤的办法主要是分散化加风险约束,在做组合构建时加入波动率目标控制,调仓时如果组合预期波动率超过阈值,就自动降低仓位或者换成波动更低的资产。

下表是我自己策略在不同阶段的回测表现,方便你直观感受一下多因子模型经过优化后的收益风险水平:

区间年化收益夏普比率最大回撤月胜率
2016-2018(震荡市)12.3%1.10-14.2%55.6%
2019-2020(结构性行情)21.8%1.35-11.5%61.1%
2021-2023(风格切换期)9.6%0.88-18.7%52.8%
全区间(2016-2023)14.5%1.12-18.7%56.3%

5. 模型优化与实盘注意事项,纸上谈兵和真金白银之间隔着什么

5.1 参数敏感性分析,防止过拟合的第一道防线

多因子模型里到处都是参数,去极值的MAD倍数、标准化的时间窗口、因子权重的更新频率、调仓周期,每一个参数都有得调。但参数调得太细,模型就会记住历史数据里的噪声而不是规律,这就是过拟合。

我做参数敏感性分析的方法是:让每个参数在小范围内变动,观察模型表现是不是剧烈变化。比如调仓周期我从5天到30天逐一测试,如果年化收益在调仓周期10天时是18%,15天时突然掉到8%,那说明模型对这个参数太过敏感,实际使用时参数漂移一点,结果可能就从赚钱变成亏钱。反过来,如果参数在10天到20天之间都维持在15%左右,那说明模型对该参数不敏感,这个参数就是稳的。上表里的所有指标,都是在稳定参数区间下的结果,而不是在某个最优参数下的孤例。

5.2 换手率和交易费用的真实影响

多因子选股模型天然换手率不低,因为每个调仓周期都会有排名变化。我早期的模型月度调仓换手率经常超过60%,一顿操作猛如虎,扣掉交易成本后收益还不如一直拿着不动。后来我在打分阶段引入换手率约束,让模型在打分时对已持仓股票加上一个"粘性系数",也就是说只有新股票的综合得分比旧股票高出一定阈值时才会发生替换,这种方式有效降低了无效交易。

实体交易里还有一个容易被忽略的问题:冲击成本。当你管理的资金规模变大,比如超过5000万,买入一只小盘股,你的买单本身就会把价格推高,这就是冲击成本。在我的模型里,资金量变大时自动限制小市值股票的比例,对日均成交额低于一定阈值的股票直接过滤掉。

5.3 风控体系,多因子模型也必须装上刹车片

最后聊聊风控。很多量化新手上来就盯着收益看,对回撤和风险完全没概念,实盘遇到连续几周下跌就慌得不行。我现在的风控体系分三层,第一层是事前约束,在组合构建阶段就限制行业暴露、个股权重和市值暴露。第二层是事中监控,每天收盘后计算组合的实时波动率、当日持仓与模型预测的偏差,一旦偏离超过阈值就告警。第三层是事后归因,每季度做一次业绩归因分析,看看超额收益到底来自于哪一个因子,是价值因子贡献的还是质量因子贡献的,这个信息用来指导后续因子权重的调整。

止损这件事,我的看法是个人投资者容易把止损做过头,模型本身已经在调仓周期内用约束条件控制了最大回撤空间,如果你还叠加一套自己的手动止损,反而打断了模型的执行逻辑。这里特别提醒:回测时所有止损规则必须写在框架里统一执行,实盘操作时也尽量用程序自动下单,减少人为情绪干扰。用量化框架做投资,最大的敌人不是市场,而是管不住自己的手。

6. 常见问题与迭代思路,模型上线只是开始

6.1 新手最容易踩的五个坑

我把这两年踩过的坑集中整理了一下,做了个速查表,希望能帮后来的朋友躲掉这些明显的问题。第一个坑是数据口径不一致,比如一个因子用的是前复权价格,另一个因子用的是不复权价格,合成打分时数据完全对不上。第二个坑是忽略ST股票,ST股票涨跌幅限制和普通股票不同,而且基本面恶化程度往往严重,必须提前剔除。第三个坑是财务数据未来函数,用了当时还没有披露的财报数据,回测结果虚高。第四个坑是频繁调试参数,今天调整一下这个参数,明天改一下那个权重,最后模型只能拟合历史,不能预测未来。第五个坑是实盘和回测不一致,回测时没考虑涨跌停买不进、停牌卖不掉这些真实交易约束。

6.2 模型失效了怎么办,市场风格切换怎么应对

多因子模型不存在一劳永逸的情况。市场风格在2021年之后发生过明显切换,以前有效的低估值因子阶段性失灵,成长因子接力表现。我自己的做法是每季度做一次因子IC衰减检测,如果连续两个季度某个因子的IC绝对值持续走低,就降低它的权重;同时保留一个"候选因子池",不停地测试新因子来补充进来。

新因子从哪里来?我的候选池里常驻两三类候选。一类是分析师预期类因子,比如盈利预测修正方向、目标价空间,这类数据需要购买专业数据源。另一类是更细化的质量因子,比如研发投入占营收比例、存货周转率变化率,它们对特定行业可能有奇效。每季度跑一遍全流程的IC检验和相关性筛选,只把真正通过了统计检验的新因子纳入模型。

6.3 后续迭代方向,从选股模型到完整交易系统

多因子选股模型本质上是系统化投资框架中的一个环节。下一步的迭代方向我列了三个。第一个方向是引入风险模型,用Barra风格的多因子风险模型控制组合的真实风险暴露,而不只是一些简单的行业和市值约束。第二个方向是优化交易执行,研究大宗交易算法,把大资金的买入冲击成本压得更低。第三个方向是把因子模型和机器学习方法做一些结合,比如用树模型挖掘非线性因子交互关系,再用传统的线性多因子框架做组合优化,既保留可解释性又增强预测能力。

系统化投资这条路,走起来比较寂寞,因为你看不到立竿见影的效果,大部分时间是在和数据、代码和统计检验打交道。多因子模型的魅力恰恰在于它的可重复性和可持续性,只要逻辑过硬、纪律严格,它就能帮你穿越市场风格的波动。

我个人现在的体会是,做量化价值投资最难的从来不是策略本身,而是是否有足够的耐心去维护和迭代这套系统。拆因子、洗数据、验证显著性、更新权重,周而复始,日复一日。数据源换了好几次,财务对齐脚本前前后后重写了四版,每换一个数据源,因子输出的分布都会变,又得重新做一遍标准化和相关性核验。但正是这些枯燥的重复操作,让我对自己的模型产生了一种"稳定感"——我清楚它哪些地方有效,哪些地方是冗余,哪些参数一碰就容易过拟合。这种对细节的掌握,才是模型真正值钱的地方。

最后再分享一个小技巧:定期把你的模型跑出来的选股结果手动看一眼,不要完全交给代码。模型选出的一堆公司里,你看看行业分布是否合理,看看有没有明显的基本面瑕疵,这些定性观察虽然不能量化进模型,但能帮你提前发现模型没有意识到的系统性风险。程序负责计算和纪律,人负责监督和纠偏,这才是量化投资最健康的协作模式。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询