第四部分 · 量化研究从因子开始 · 第 9 章
量化的起点:因子和数据
实习时听到的“找因子”,不是什么玄学密码。最朴素地说,因子就是一列能描述资产特征、风险暴露或预测信息的数字,量化研究的第一步就是把一句投资判断写成可检验的数据列。这一章先讲因子是什么、从哪里来、怎么检验有没有用,再讲更容易被忽略却更致命的一环:数据从哪里来、标签怎么定义、样本又该怎么切分。
读完这一章,你会明白
- 因子是把投资判断变成一列有口径、可排序、可检验的数据。
- IC、RankIC 和分层回测用于检验因子是否对未来收益有排序信息。
- 量化数据必须恢复历史当时的信息状态,点时数据是防止未来函数的核心。
- 标签定义决定模型任务,预测绝对收益、相对收益、波动或回撤是不同问题。
本图从“因子不是魔法,是一列有口径的数据”走到“从数据表到训练样本”,用于先看第 9 章的关键路径,再回到正文补细节。
1. 因子不是魔法,是一列有口径的数据
在讲因子怎么做之前,先看一眼这条路能走到多远。有个叫詹姆斯·西蒙斯的数学家,年轻时是顶尖的几何学家、拿过数学大奖,还给美国政府破译过密码。40 多岁他离开学术界,创立了文艺复兴科技公司,招的不是交易员,而是一群数学家、物理学家和计算机科学家。他们做的事,本质上就是本章要讲的:把海量市场数据变成一列列数字,再用统计和模型从中找出微弱但稳定的规律。
结果是金融史上最夸张的业绩:他们的旗舰“大奖章”基金,从 1988 到 2018 年,扣掉高得离谱的费用之后年化收益仍约 39%,扣费前更是高达约 66%。更反直觉的是,据公开资料,他们的单笔交易胜率大概只有 50.75%——几乎就是抛硬币。秘诀不是每次都对,而是把一点点微弱的优势,靠海量次数和严格风控滚成惊人的复利。这正是量化的灵魂:不追求“算准明天”,而是追求“长期站在概率这一边”。而这一切,都从最朴素的一步开始——把一个投资想法,变成一列可以检验的数字,也就是因子。
假设你说“便宜的股票未来表现可能更好”。这句话听起来像投资观点,但量化系统不能直接理解“便宜”。你要把它变成数字,例如市盈率 PE、市净率 PB、企业价值倍数 EV/EBITDA,或者它们的倒数。每只股票每天都有一个数,这列数就可以成为估值因子。
再比如你说“最近涨得强的股票可能继续强”。这可以变成过去 20 个交易日收益率、过去 60 日收益率,或者剔除最近几天反转影响后的动量因子。你说“质量好的公司更稳”,可以用 ROE、毛利率、负债率、现金流质量等指标构造质量因子。
所以因子不是一个固定清单,而是一种把投资直觉数据化的方式。关键在于口径清楚: 用什么数据,在哪个时间点可见,怎么处理缺失值和极端值,每天如何更新,适用于哪些股票。
2. 因子、信号和特征有什么区别
在不同公司里,因子、信号、特征这几个词会混着用。为了入门,可以这样区分: 特征是模型输入的原始或加工变量;因子通常带有金融解释,能描述收益来源或风险暴露;信号更偏交易决策,表示当前应该买卖或给多少权重。
例如过去 20 日收益率可以是一个特征。如果你认为它代表动量效应,它就是动量因子。如果模型把它和其他变量合成一个股票预期收益分数,这个分数就是选股信号。
区别不是为了咬文嚼字,而是为了避免把所有数字都叫 Alpha。一个变量可能只是风险暴露,不一定有正收益预测能力;一个特征可能在模型里有用,但没有清晰经济解释;一个交易信号可能短期有效,但容量很小。
3. 常见因子家族
股票量化里常见因子大致有几类。估值因子看股票贵不贵,如 PB、PE、股息率。质量因子看公司经营质量,如 ROE、毛利率、现金流。成长因子看收入和利润增长。动量因子看过去价格趋势。反转因子看短期涨跌过度后的回摆。规模因子看市值大小。流动性因子看成交额、换手率和买卖价差。
这些因子不是永远都赚钱。价值因子可能多年跑输,动量因子可能在快速反转中大亏,小市值因子可能受监管和流动性影响,高股息因子可能集中在低成长行业。因子更像一组风险和行为模式,不是每天兑现的工资。
成熟量化不会只问“哪个因子收益最高”,还会问它和其他因子相关性高不高、换手高不高、容量大不大、在哪些行业暴露明显、是否来自未来数据、扣成本后还剩多少。
把股票按因子值排序、平均分成几组,再看每组之后的平均收益。如果从低到高单调递增(或递减),说明这个因子可能真的携带信息,而不是随机噪声。
4. 同一天把股票排队
很多股票因子是横截面使用的。横截面意思是在同一个日期,把所有可投资股票放在一起比较。比如今天有 4000 只股票,你按 PB 从低到高排序,低 PB 的排前面,高 PB 的排后面。
横截面排序和时间序列预测不同。它不一定预测市场明天涨还是跌,而是预测哪些股票相对更好。指数增强和市场中性策略经常关心相对收益: 在同一个市场环境里,买排名靠前的股票、少买或卖空排名靠后的股票。
这也解释了为什么量化实习里会经常处理矩阵: 行是日期,列是股票,每个格子是某个因子值。研究员每天都在问,这张矩阵里是否有稳定的横截面排序信息。
5. 因子排序和未来收益是否同向
IC 是 Information Coefficient,常见做法是计算因子值和未来收益之间的相关系数。如果一个因子今天给分高的股票,未来一段时间收益也更高,IC 就偏正;如果给分高的未来反而更差,IC 就偏负。
举个很小的例子。今天你按某因子给 5 只股票打分,明天高分股票普遍涨得更多,低分股票普遍涨得少甚至下跌,这一天的 IC 就会比较高。把很多天的 IC 连起来,看平均值、稳定性和波动,就能初步判断因子是否有预测信息。
实际研究常用 RankIC,也就是用排序相关而不是原始数值相关。因为因子值可能有极端值,排序更稳。IC 不需要很大才有价值。股票横截面噪声很强,一个长期平均 RankIC 只有 0.03 的因子,如果稳定、成本低、容量大,也可能有商业价值。
6. 高分组是不是真的更好
分层回测是把股票按因子分成几组,常见是五组或十组。第一组是因子最高的一批,最后一组是因子最低的一批。然后观察各组未来收益。如果因子有效,通常希望高分组长期表现好于低分组。
比如把股票按股息率从高到低分成五组,每个月调仓一次。如果最高股息组长期收益高于最低股息组,且不是由某几年极端行情撑起来,说明这个因子可能有信息。更进一步,还要看多空收益、回撤、换手、行业暴露和市值暴露。
分层回测比单看 IC 更直观。IC 告诉你排序相关性,分层收益告诉你如果真按它买,大概会得到什么路径。但分层回测也会被交易成本、涨跌停、停牌、容量和数据偏差影响。
7. 别把别人的风险当成自己的能力
一个因子看起来有效,可能只是因为它暴露在另一个更基础的风险上。比如你发现某个指标选出的股票收益很高,但仔细看全是小市值股票。那它赚的可能不是你这个指标的钱,而是小市值风格的钱。
中性化就是把不想要的暴露剥离掉。常见做法包括行业中性、市值中性、风格中性。比如在每个行业内部排序,避免因为行业涨跌影响因子;或者用回归把市值暴露去掉,看剩下的因子是否还有信息。
中性化不是越多越好。剥离太多可能把真实收益来源也剥掉。关键是清楚自己想赚什么钱。如果你说自己做的是选股 Alpha,就不能主要靠行业和市值押注;如果你本来就想做风格轮动,那风格暴露就是策略的一部分。
8. 因子为什么会失效
因子失效有很多原因。第一,原本就是噪声,只是历史上碰巧好。第二,市场结构变了,过去的机制不再成立。第三,太多人使用同一个因子,收益被交易挤掉。第四,交易成本上升或流动性变差,纸面收益无法落地。
还有一种常见情况是周期性失效。价值因子可能在成长股大行情里长期难受,动量因子可能在市场急转弯时崩,低波因子可能在风险偏好暴涨时落后。这不一定说明因子永久失效,但会考验资金和风控。
判断失效不能只看一个月亏损。你要看亏损是否超出历史分布,市场环境是否变化,因子拥挤度是否上升,交易成本是否变高,数据口径是否坏了,组合约束是否放大了某类风险。
9. 好因子需要同时过四关
第一关是经济解释。为什么这列数字可能和未来收益有关? 是风险补偿、行为偏差、信息滞后,还是制度约束? 没有解释也可以研究,但你要更谨慎。
第二关是统计检验。IC、分层收益、多空组合、样本外表现是否稳定? 第三关是交易可行。换手率、滑点、停牌、涨跌停、容量是否吃掉收益? 第四关是组合贡献。放进已有模型后,它是否提供新增信息,还是和老因子高度重复?
很多因子单独看很好,进组合后没用,因为它和已有因子重复。也有些因子单独不惊艳,但和其他因子相关性低,能改善组合稳定性。量化研究看的不是单因子炫技,而是整个策略系统的边际贡献。
10. 个人如何做第一个因子研究
个人入门可以从最简单的日频因子开始。选一个股票池,比如沪深 300 或中证 500 成分股;选一个再平衡频率,比如每月;选一个因子,比如过去 20 日收益率或 PB;然后做点时数据、排序、分组、调仓、扣成本。
不要一开始就上深度学习。先把最朴素的流程做对: 数据日期不能错,停牌不能随便成交,未来财报不能提前用,指数成分不能用现在回填,交易费用要扣,涨跌停要处理。这个流程比模型名字更重要。
完成第一个因子研究后,你应该能输出一份报告: 因子定义、数据来源、股票池、回测区间、调仓频率、IC、分层收益、换手、成本、最大回撤、失效阶段和可能解释。做到这一步,你才算真正开始量化研究。
11. 量化模型从哪里学
机器学习读者很容易把量化想成一个普通监督学习问题: 给模型很多特征和标签,训练,验证,上线。但金融数据最危险的地方在于,你经常不小心把未来塞进过去。财报发布日期、指数成分变化、复权价格、停牌、涨跌停、退市、交易成本,每一个细节都可能让模型在回测里看起来聪明,实盘里立刻失忆。
最基础的数据是行情数据,包括开盘价、最高价、最低价、收盘价、成交量、成交额、盘口和逐笔成交。再往上是基本面数据,包括财报里的收入、利润、资产负债、现金流、ROE、毛利率、负债率。还有公告、分析师预测、基金持仓、指数成分、融资融券、期货持仓、期权波动率、新闻文本和宏观数据。
不同数据的频率和发布时间不同。行情数据每天甚至每秒更新,财报按季度披露,宏观数据按月或按季发布,分析师报告和新闻是不规则到达。把这些数据放在一张训练表里,必须尊重它们在当时是否已经可见。
量化数据工程的核心不是把表拼起来,而是恢复历史当时的信息状态。模型在 2020 年 4 月 10 日做决定时,不能看到 2020 年 4 月 30 日才发布的年报修正,也不能看到后来才纳入指数的成分回填。
12. 在那个时点你到底知道什么
点时数据是量化里非常重要的概念。它要求每条数据都带着“何时生效、何时可见、何时被修正”的信息。财报期末是 12 月 31 日,不代表投资者 12 月 31 日就知道全年利润;真正可用时间通常是公告发布后。
举个例子。某公司 2025 年年报披露日是 2026 年 3 月 28 日。你在 2026 年 1 月做回测时,不能使用这份年报里的最终净利润。否则模型等于提前知道未来信息,这就是未来函数。
数据库里常见的陷阱是字段只有报告期,没有发布日期;或者供应商把历史数据修正成最终版本,却没有保留当时版本。这样的数据看起来干净,但会让回测过于乐观。专业数据服务会尽量提供公告日期、更新时间和历史版本。
13. 你让模型预测什么
标签就是模型要学习的目标。股票量化里常见标签是未来 1 日、5 日、20 日或 60 日收益率,也可以是未来相对行业或指数的超额收益,还可以是未来是否跑赢中位数、未来波动率、未来最大回撤或未来成交可行性。
标签定义会改变整个问题。预测明天收益和预测下个月收益不是同一个任务。明天收益噪声更大、交易频率更高、成本更敏感;下个月收益信号可能更慢,但持有期间风险更长。预测绝对收益会受市场涨跌影响,预测相对收益更像选股。
一个常见入门标签是: 从今天收盘到未来 20 个交易日后的复权收盘收益。这个标签适合月频选股研究,但不能直接代表真实可成交收益。因为你今天收盘后才知道完整收盘价,实际买入可能在明天开盘或盘中,还要扣成本和处理停牌涨跌停。
14. 特征和标签的时间对齐
监督学习里最基本的要求是 X 在 y 之前可见。量化里这句话尤其关键。特征日期、数据发布日期、交易决策时间、下单时间、成交时间、标签收益区间,都要排清楚。
比如你用今天收盘价计算特征,就不能假设自己今天收盘前已经用这个特征成交。如果策略在收盘后生成信号,下一次可执行成交通常要到之后的交易时点。若回测用今天收盘价做特征,又按今天收盘价买入,就偷看了收盘结果。
这类错误在代码里不一定显眼。一个 shift 写错,一个 merge_asof 方向错,一个财报公告日没处理,模型表现就会异常好。看到过于漂亮的结果时,第一反应应该是检查时间对齐,而不是庆祝发现圣杯。
15. 复权价格和真实成交价格要分开
前面讲过复权是为了让历史价格可比。做收益标签时,使用复权价格通常合理,因为要把分红送股调整进总回报。但做真实交易模拟时,订单成交发生在当时市场价格上,不是复权后的历史价格。
假设某股票分红除权,未复权价格从 10 元变成 9.5 元。用未复权价格计算收益会把分红当成亏损;用复权价格计算成交又会产生历史上不存在的交易价格。正确做法通常是: 收益和因子计算使用合适复权口径,撮合、涨跌停和成本使用当时真实价格口径。
很多回测框架会在内部处理这些转换,但你不能完全盲信框架。至少要知道数据字段含义: close 是未复权还是前复权? return 是否含分红? limit_up 和 limit_down 用哪个价格口径? 不清楚口径,结果就不可信。
16. 你允许模型在哪些资产上下注
股票池定义了策略可投资范围。你可以选择全 A 股,也可以选择沪深 300、中证 500、中证 1000、某个行业,或者剔除 ST、停牌、上市未满一定天数、流动性太差的股票。股票池不是随便选,它会影响收益、风险和可执行性。
如果用今天的股票池回测过去,会产生幸存者偏差。比如只拿现在还上市的股票回测十年,就把已经退市的失败公司删掉了。正确做法是每个历史日期都使用当时可投资的股票池。
股票池还会决定基准。你在沪深 300 成分里选股,就应主要和沪深 300 比;你在中证 1000 里选股,就应和中证 1000 比。股票池和基准不匹配,会把市场暴露和选股能力混在一起。
17. 缺失值不是小麻烦
金融数据大量缺失。新上市公司历史短,停牌日没有成交,财务字段可能尚未披露,某些行业指标不适用,新闻数据覆盖不均。缺失值不能一律填 0,因为 0 可能是一个真实数值,也可能是“没有数据”。
常见处理包括删除缺失样本、用行业中位数填充、用上期可见值延续、添加缺失标记,或者让模型处理缺失。选择哪种方法取决于字段含义。比如 PB 缺失可能来自净资产为负或数据未覆盖,两者含义完全不同。
缺失也可能带有信息。财报迟迟不发、分析师不覆盖、小公司数据质量差,本身可能和风险有关。如果简单删除所有缺失样本,你的股票池会偏向信息披露好、流动性好、规模大的公司,这又会引入偏差。
18. 训练集、验证集和测试集不能随机打乱
普通机器学习里常随机划分训练集和测试集,但金融时间序列不能随便随机打乱。因为未来样本可能和过去样本存在时间依赖,随机打乱会让模型间接接触未来市场状态。
更合理的做法是按时间切分。比如 2015-2019 年训练,2020-2021 年验证调参,2022-2024 年测试。这样测试集更接近真实未来。也可以做滚动训练和 walk-forward 验证: 用过去一段训练,向前预测一段,再滚动窗口。
时间切分也不能保证万无一失。如果训练期和测试期市场环境太像,结果仍可能过于乐观;如果测试期刚好是极端环境,也可能过于悲观。你需要多个市场阶段,并观察策略在牛市、熊市、震荡市、流动性冲击中的表现。
19. 样本外不是一句口号
样本外的意义是: 模型没有用这段数据参与训练、调参和选择。很多人声称有样本外,但实际上反复看测试集结果、根据测试集改特征,测试集就被污染了。
量化研究里还有一个更隐蔽的问题: 研究员的脑子也会过拟合。你试了 200 个因子,只留下表现最好的 5 个,即使每个因子都在测试集上跑过,最终报告也有数据挖掘偏差。因为你选择因子的过程已经看过测试结果。
解决办法包括保留真正未触碰的最终样本、记录所有实验、控制试错次数、做跨市场验证、做模拟盘和小规模实盘。样本外不是技术词,而是一种研究纪律。
20. 从数据表到训练样本
一个股票日频训练样本通常可以想成三维结构: 日期、股票、特征。每个日期有一批股票,每只股票有很多特征,标签是未来一段收益。为了喂给模型,你会把它展开成一张大表: 每行是某天某只股票,列是特征和标签。
这张表构造时要做很多过滤: 当天是否可交易,是否停牌,是否涨跌停无法买卖,上市天数是否足够,财务数据是否已披露,是否在股票池内。过滤规则必须在训练、回测和实盘保持一致。
如果训练时样本包含很多实盘不能买的股票,模型会学习到不可执行机会。如果回测时过滤严格、训练时过滤宽松,训练目标和交易目标就不一致。量化工程的细节最终都会反映在收益曲线里。
小结
这一章的正文不是让你记住几个孤立名词,而是要把它们放回同一条因果链里。读完后,先用自己的话复述下面几条判断,再顺着“小节回看”检查是否能解释每一步。
- 因子是把投资判断变成一列有口径、可排序、可检验的数据。
- IC、RankIC 和分层回测用于检验因子是否对未来收益有排序信息。
- 量化数据必须恢复历史当时的信息状态,点时数据是防止未来函数的核心。
- 标签定义决定模型任务,预测绝对收益、相对收益、波动或回撤是不同问题。
小节回看
- 1. 因子不是魔法,是一列有口径的数据
- 2. 因子、信号和特征有什么区别
- 3. 常见因子家族
- 4. 同一天把股票排队
- 5. 因子排序和未来收益是否同向
- 6. 高分组是不是真的更好
- 7. 别把别人的风险当成自己的能力
- 8. 因子为什么会失效
- 9. 好因子需要同时过四关
- 10. 个人如何做第一个因子研究
- 11. 量化模型从哪里学
- 12. 在那个时点你到底知道什么
- 13. 你让模型预测什么
- 14. 特征和标签的时间对齐
- 15. 复权价格和真实成交价格要分开
- 16. 你允许模型在哪些资产上下注
- 17. 缺失值不是小麻烦
- 18. 训练集、验证集和测试集不能随机打乱
- 19. 样本外不是一句口号
- 20. 从数据表到训练样本
自测
因子为什么不能只理解成“能赚钱的数字”?
因为因子也可能只是风险暴露、解释变量或噪声,必须检验预测能力、成本和风险。
RankIC 大致衡量什么?
它衡量因子排序和未来收益排序之间是否同向,比原始值相关更抗极端值。
为什么财报报告期不等于可用时间?
因为投资者通常要等公告发布后才知道数据,报告期只是财务覆盖区间。
未来 20 日收益标签有什么执行问题?
如果用今天收盘价生成信号又按今天收盘成交,就可能偷看收盘信息,还要处理成本和停牌涨跌停。