经典多因子之外,文献与实务中还堆积了大量候选因子。本章把原先第18、21、19、22、20章收拢为一章:先讲异象挖掘与检验陷阱,再依次看基本面深化、另类数据、宏观因子与高频因子。
异象因子挖掘,旨在发现那些理论上不应持续存在的收益规律。
所谓不该存在,是指若市场有效,公开信息应已被价格充分反映;然而实践中仍可观测到持续跑赢的策略——此即异象。异象挖掘看似机会众多,但亦伴随大量虚假信号与过拟合风险。
学术上,异象指的是那些无法被主流定价模型解释的、统计显著的收益预测模式。比如经典的规模效应、价值效应、动量效应,都属于异象。
异象通常分为两类:
关键问题在于:如何判别所发现的规律是否真实?
常见情形是:回测曲线表现优异,实盘却大幅失效。原因往往在于所挖掘的并非真实异象,而是噪声。
数据挖掘偏差,亦称过拟合或数据窥探,指在大量候选因子中,总有若干因子因随机性而呈现统计显著。
原因在于金融数据信噪比极低:股票收益中随机波动占主导,真实信号占比极小。试验次数足够多时,必然出现若干统计显著的虚假规律。
极端示例:以 1000 条随机噪声序列回测,其中 47 个因子的夏普比率超过 1.5——纯属随机巧合。
常见错误为:在同一全样本上筛选因子并回测,表面年化收益 30% 实则源于前视偏差。筛选与验证须使用不同数据段。
数据挖掘偏差的常见来源:
试验次数增多将提高假阳性概率,因此须进行校正——此即多重假设检验的目的。
设独立测试 N 个因子,各因子显著性水平为 α(如 0.05),则至少出现一个假阳性的概率为:
当 N=20 时,该概率已超过 64%,即测试 20 个因子时,有六成以上概率发现虚假异象。
因此须进行校正。常用方法有两种:
Bonferroni 校正的思路为:将显著性阈值除以测试次数。
例如测试 100 个因子,原 p 值阈值为 0.05,校正后为 0.0005;仅 p 值低于 0.0005 的因子视为显著。
该方法严格但可能过于保守。Bonferroni 在因子数量较少时(如 10–20 个)尚可适用;超过 50 个时几乎无法识别显著因子。其假设各测试相互独立,而金融因子往往高度相关,该假设通常不成立。
FDR 控制的是被拒绝假设中错误拒绝的比例,即允许一定比例的假阳性,只要该比例可控。
最常用的方法是Benjamini-Hochberg过程:
例如测试 100 个因子,设 q=0.1。排序后第 5 小的 p 值为 0.008,阈值为 (5/100)×0.1=0.005,不满足;第 4 小的 p 值为 0.003,阈值为 (4/100)×0.1=0.004,满足。故拒绝前 4 个假设,认定这 4 个因子显著。
因子初筛宜采用 FDR(q=0.2),允许部分假阳性进入,在后续样本外验证中再淘汰。Bonferroni 过于严格,易误删真实因子。目标并非绝对真理,而是大概率可获利的规律。
以下给出实践中常用的流程:
| 步骤 | 操作 | 校正方法 | 说明 |
|---|---|---|---|
| 1 | 因子初筛(100-500个候选) | FDR (q=0.2) | 先放进来,别太严格 |
| 2 | 样本内验证 | Bonferroni | 对剩下的因子严格把关 |
| 3 | 样本外测试 | 不校正,看实际表现 | 真金不怕火炼 |
| 4 | 实盘跟踪 | 持续监控 | 异象会衰减甚至消失 |
异象因子挖掘的本质并非找到更多因子,而是找到真实有效的因子。数据挖掘偏差控制与多重假设检验校正,用于过滤表面显著的虚假规律。经严格校正的单个因子,价值高于一百个未经检验的因子。
不宜过度依赖 p 值——p 值仅为统计工具,而非绝对标准。将 p 值小于 0.05 视为充分条件可能导致重大损失。真实异象须经受样本外检验、逻辑论证与时间检验。
异象挖掘机会与风险并存,关键在于避免被数据中的虚假信号误导。
第18.2–18.3节已讨论数据挖掘偏差与 Bonferroni/FDR。需要进一步指出:即使不显式“挖掘”数百个因子,仅在排序细节上反复尝试,仍可能制造显著结果。
常见自由度包括:
因此,多重检验校正不仅针对“因子动物园”,也针对同一因子的设定搜索。稳健的报告方式包括:
与第6章的衔接:第6.5–6.6节给出规范的单维/双维排序与 Fama-MacBeth 模板;本节纪律用于约束这些模板参数的搜索空间。
基本面因子旨在评估公司底子是否扎实。不少量化从业者初期侧重价格与成交量,认为其更纯粹。然而长期实践表明,基本面因子才是组合中的压舱石。
本章围绕四个经反复验证的方向展开:财务质量、盈利增长、分析师预期,以及经典的盈余公告后漂移。各方向均有相应注意事项与有效应用场景。
财务质量因子的核心,在于判断公司利润是否为真金白银。
实践中常见情形:利润表显示数亿元盈利,经营活动现金流却大量体现为应收账款。此类公司往往属于纸面富贵。
核心指标组合: 应计利润比率 : (净利润 - 经营活动现金流) / 总资产。比率越高,利润质量越差。 毛利率稳定性 :过去5年毛利率的标准差。越稳定越好,说明有护城河。 资产周转率 :营业收入 / 总资产。反映公司利用资产的效率。
实践中通常将上述三个指标合成为 Z-score。具体做法如下:
# 伪代码示例
def financial_quality_score(df):
# 1. 应计利润比率(反向,越高越差)
accrual = (df['net_income'] - df['operating_cf']) / df['total_assets']
accrual_z = -1 * (accrual - accrual.mean) / accrual.std
# 2. 毛利率稳定性(反向,波动越大越差)
gross_margin_std = df.groupby('stock_id')['gross_margin'].rolling(20).std
stability_z = -1 * (gross_margin_std - gross_margin_std.mean) / gross_margin_std.std
# 3. 资产周转率(正向)
turnover = df['revenue'] / df['total_assets']
turnover_z = (turnover - turnover.mean) / turnover.std
# 等权合成
quality_score = (accrual_z + stability_z + turnover_z) / 3
return quality_score
注意事项:2018年曾出现仅依赖应计利润比率,筛选出大量现金流极好但成长性极差公用事业股的情况。加入毛利率稳定性与资产周转率后,效果方显著改善。单一指标易导致过拟合,宜组合使用。
盈利增长因子应用广泛,但仅看同比增长率往往过于粗糙。
例如,一家公司去年盈利 1 元、今年 2 元,增长率 100%,但能否持续需另行评估。
建议从以下三个维度考察增长:
| 维度 | 指标 | 说明 |
|---|---|---|
| 增长速度 | 过去3年EPS复合增长率 | 平滑短期波动,看长期趋势 |
| 增长稳定性 | 过去5年ROE的变异系数 | 越低越好,说明增长可预测 |
| 增长来源 | 营业收入增长率 vs 净利润增长率 | 如果利润增长远高于收入增长,要警惕财务调节 |
注意:增长因子在牛市中表现较好,熊市中易遭遇戴维斯双杀。通常宜与估值因子结合使用——高增长叠加低估值,方构成较优组合。
分析师预期因子反映市场对公司的看好程度。关键不在于预期本身,而在于预期差。
原因在于股价已反映已知预期,仅超预期的部分方能驱动股价上涨。
常用指标包括:
实战经验:回测显示分析师预测上调比率在 A 股的有效性显著高于美股,原因可能系 A 股散户占比较高,分析师报告影响力更大。需注意,该因子在财报季前后效果最佳,平时会有所衰减。
盈余公告后漂移,英文叫Post-Earnings Announcement Drift,简称PEAD。这是个经典异象,意思是:好业绩公告后,股价会持续上涨一段时间;差业绩公告后,股价会持续下跌。
其原因在于市场反应存在滞后。不少投资者公告后需时间消化信息,或因交易成本、注意力限制等原因,无法立即调仓。
PEAD 因子通常按以下步骤构建:
宜在公告后第 2 个交易日开盘买入,而非公告当日。公告当日可能出现跳空开盘,追入风险较大;等待一日待情绪稍稳,效果往往更佳。
上述四个因子单独使用均可产生 alpha,组合使用效果更佳。常见框架为:以财务质量与盈利增长因子筛选好公司,以分析师预期因子判断市场情绪,以 PEAD 因子确定入场时机。
该框架在 A 股与港股均经长期验证,效果相对稳定。需强调,不存在完美因子;关键在于理解各因子背后的逻辑,以及其在不同市场环境下的表现差异。
结语:因子投资并非一招鲜吃遍天。市场结构持续变化,因子亦会失效。保持学习与迭代,是长期生存之道。
谈及另类数据,行业早期曾围绕成交量是否为有效因子存在广泛争议。当前,外卖订单数据已被用于预测消费类股票走势,相关应用发展极为迅速。
另类数据的核心价值在于信息差。当多数参与者关注财报与K线时,若能提前掌握某工厂停车场空置等信息,本身即构成 alpha。需注意,另类数据并非越多越好,关键在于是否对路。
舆情因子将新闻、社交媒体、股吧帖子中的情绪量化为数值。通常可将其分为两类:情感极性与关注度。
核心逻辑 :正面情绪 → 买入信号;负面情绪 → 卖出信号;关注度骤升 → 波动加大。
具体实施方面,以下以一个实际项目为例。该项目需处理每日数百万条微博数据,流程大致如下:
此处需注意情感词典的时效性问题。2019年某策略仍沿用旧版词典,暴雷被标为负面;但当时不少股吧帖子以暴雷股自嘲调侃。后续改用动态词向量后,效果方显著改善。
新闻情绪和舆情因子很像,但更聚焦事件。比如公司发布财报、高管变动、产品召回——这些事件对股价的影响往往是脉冲式的。
常见的处理思路包括:
不宜仅依赖标题。相关回测显示,仅基于标题的情绪因子夏普比率约为 0.3;加入正文内容后提升至 0.8。原因系部分标题存在标题党现象,正文更能反映真实态度。
代码实现上,通常采用如下流程:
# 伪代码:新闻情绪因子构建
def news_sentiment_factor(news_df):
# news_df: 包含日期、股票代码、标题、正文
# 1. 情感打分
news_df['sentiment'] = model.predict(news_df['content'])
# 2. 时效性衰减
news_df['weight'] = np.exp(-0.1 * (today - news_df['date']).days)
# 3. 聚合到日频
factor = news_df.groupby(['date', 'stock']) \
.apply(lambda x: (x['sentiment'] * x['weight']).sum / x['weight'].sum)
return factor
卫星图像数据看似前沿,当前商用卫星数据成本已显著下降。2017年初次接触时,对其可靠性存疑——直至以该数据成功预测某零售商季度营收。
核心逻辑为:停车场车辆数 → 客流量 → 营收。实际操作中,需关注以下几个要点:
常见误区:以卫星数据预测农业股时,若忽略季节性,夏季植被茂盛导致图像绿色面积扩大,易被误判为作物产量增加。引入同比变化消除季节性后,效果方趋于稳定。
卫星数据的处理流程通常分为三步:
举个例子,某仓储物流公司的卫星数据:
| 日期 | 停车场车辆数 | 仓库屋顶反光面积 | 因子值 |
|---|---|---|---|
| 2024-01-05 | 342 | 1200 m² | 0.78 |
| 2024-01-06 | 287 | 980 m² | 0.62 |
| 2024-01-07 | 401 | 1350 m² | 0.91 |
由上表可见,车辆数与反光面积同步变化,表明仓库活动较为活跃。若连续三日下降,则需提高警惕。
供应链数据是近年重点研究方向之一。原因在于:一家公司的风险,往往隐含于其供应商与客户之中。
比如,某手机厂商的芯片供应商出了问题,那手机厂商的股价迟早会跌。但传统因子要到财报披露才知道,供应链数据可以提前几周预警。
常用数据源包括:
构建因子时,通常采用网络分析思路:
# 供应链网络因子
def supply_chain_factor(company, network):
# 找到公司的一级、二级供应商
suppliers = network.get_suppliers(company, depth=2)
# 计算供应商的平均风险得分
risk_score = np.mean([s.risk for s in suppliers])
# 如果供应商风险高,则公司因子为负
return -risk_score
关键洞察 :二级供应商往往比一级供应商更重要。因为一级供应商出了问题,公司会立刻换;但二级供应商的问题,传导到公司需要时间——这个时间差就是alpha。
相关回测表明,基于供应链数据构建的因子在制造业与科技股上表现较优,年化超额收益约 8%,信息比率 1.2。需注意,该因子在金融股上几乎无效——银行不存在传统意义上的供应链。
需强调,另类数据并非万能。实践中曾出现投入数百万购置卫星数据,策略收益仍不及简单动量因子的情况。关键在于理解数据背后的业务逻辑——用以验证何种假设?该假设在何种市场环境下有效?厘清上述问题后再着手实施为宜。
入门阶段不宜贪多。宜先选定最熟悉的行业,选取一种数据类型,跑通全流程。例如研究消费股,可从供应链数据入手;流程稳定后再逐步扩展。
谈及宏观因子,不少量化从业者初时的印象是过于抽象。早期亦曾侧重挖掘各类高频量价因子,认为宏观数据频率低、噪音大,不适合交易。
直至某多因子模型加入简单利率因子后,回测效果提升十余个百分点。此后,宏观因子的重要性得到充分重视。
宏观因子体系,即将对经济周期的判断转化为可量化的投资信号。本章围绕四个核心宏观因子展开:经济增长、通胀、利率、信用利差。
经济增长因子,是宏观因子体系里的老大哥。它反映的是整个经济体的扩张或收缩状态。
量化方法方面,常用指标包括:
实践中曾遇问题:直接以 GDP 增速作因子,信号过于滞后,数据发布时市场往往已充分反应。改用 PMI 与发电量的合成指标后,效果显著改善。
小技巧: 经济增长因子通常与股票市场正相关,与债券市场负相关。但要注意,不同行业对经济增长的敏感度不同——周期性行业(如钢铁、有色)的敏感度远高于防御性行业(如医药、食品)。
通胀因子,是宏观因子体系里的双刃剑。温和通胀有利于经济,恶性通胀则摧毁一切。
常用的通胀指标:
通胀因子的重要性在于:通胀上升时,央行可能加息,压制股票估值;同时侵蚀债券实际收益。因此该因子对股债均有显著影响。
实践中曾出现直接以 CPI 同比作通胀因子,指标过于平滑、难以捕捉拐点的情况。改用环比折年率并加入核心 CPI 后,敏感度方有所提升。
注意事项:通胀数据常受季节性因素干扰。例如春节前后食品价格上涨,未必代表真实通胀趋势。建议先作季节调整再使用。
利率因子反映资金的价格,是宏观因子体系中最活跃、最敏感的因子之一。
常用利率因子包括:
利率因子的影响是全方位的。利率上升,债券价格下跌,股票估值承压,房地产行业受冲击。但反过来,银行股往往受益于利率上升(净息差扩大)。
构建多因子模型时,曾发现利率因子与经济增长因子高度相关——因子间相关性过高会导致模型不稳定。经正交化处理后,方将二者有效拆分。
信用利差因子,是宏观因子体系里的风险温度计。它衡量的是投资者对信用风险的定价。
信用利差 = 企业债收益率 - 国债收益率
信用利差扩大,说明市场对经济前景悲观,风险偏好下降;信用利差收窄,说明市场情绪乐观,愿意承担更多风险。
经验表明,信用利差因子对高收益债、可转债及小盘股影响尤为显著。原因在于上述资产本身信用风险较高,对信用利差变化更为敏感。
实战要点: 信用利差因子可以作为市场情绪的代理变量。当信用利差快速扩大时,往往是避险信号;当信用利差持续收窄时,可以适当增加风险敞口。
上述四个因子并非孤立存在,其间存在复杂的传导关系。下图梳理相关逻辑:
宏观因子体系结构图 经济增长因子 通胀因子 利率因子 信用利差因子 需求拉动 央行加息 融资成本 传导路径与交互影响 经济增长 ↑ → 通胀 ↑ → 利率 ↑ → 信用利差 ↑(企业融资成本上升) 经济增长 ↓ → 通胀 ↓ → 利率 ↓ → 信用利差 ↑(违约风险上升) 利率 ↑ → 经济增长 ↓(抑制投资和消费)→ 通胀 ↓ 股票 债券 商品 外汇 注:实线箭头表示直接影响,虚线表示间接影响 因子之间相互影响,共同决定各类资产的定价
理论阐述之后,需关注如何将宏观因子应用于多因子模型。
常用构建方法包括:
举个例子,构建一个经济增长综合因子:
# 经济增长综合因子构建(伪代码)
def build_growth_factor:
# 1. 获取原始数据
pmi = get_data('PMI')
industrial = get_data('工业增加值')
electricity = get_data('发电量')
# 2. 标准化
pmi_z = (pmi - pmi.mean) / pmi.std
industrial_z = (industrial - industrial.mean) / industrial.std
electricity_z = (electricity - electricity.mean) / electricity.std
# 3. 等权合成
growth_factor = (pmi_z + industrial_z + electricity_z) / 3
# 4. 滞后一期(对齐到交易时间)
growth_factor = growth_factor.shift(1)
return growth_factor
实战建议:宏观因子在低频策略(周度、月度调仓)中效果更佳。若从事高频交易,宏观因子作用有限——宏观数据不会每日更新。
除宏观因子的优势外,亦需认识其局限。实践中常见问题包括:
2015年曾出现依据历史数据构建的宏观因子模型在股灾期间完全失效的情况。复盘发现,该阶段政策干预较强,市场已偏离正常状态。
因此建议:宏观因子宜与其他类型因子(量价、基本面、情绪等)结合使用,形成互补,而不宜过度依赖。
宏观因子体系介绍至此。经济增长、通胀、利率、信用利差四个因子构成宏观分析的基石。掌握它们,有助于从看个股升级到看全局,这一视角转变对投资至关重要。
在量化实践中,一个普遍认识是:低频因子侧重逻辑,高频因子侧重数据。日线级别因子如 PE、PB、动量反转等已为业界熟知,竞争最终落在逻辑严谨性与回测规范之上。高频因子则不同,其竞争焦点在于对市场微观结构的理解,以及处理海量 tick 数据的能力。
本节讨论高频因子:数据特征、微观结构、订单流不平衡与降频,以及常见误区。
高频数据主要指逐笔成交与逐笔委托。A 股市场每日产生的 tick 数据量可达数千万条,数据存储与处理对基础设施要求较高。
高频数据有几个核心特征:
核心观点 :高频数据不是用来直接做预测的,而是用来提取微观结构特征的。特征提取的质量,直接决定了高频因子的有效性。
实践中,取得原始 tick 数据后,第一步通常不是急于计算因子,而是进行数据清洗:剔除明显错误数据,如成交价为 0、成交量异常偏大等。该步骤虽繁琐,却至关重要。若清洗不充分,订单流因子可能在回测中表现优异,实盘却大幅偏离——常见原因之一是数据中混入了集合竞价的特殊记录。
微观结构因子,就是利用订单簿(Order Book)和成交数据构建的因子。它反映的是市场参与者的交易行为和供需关系。
常见的微观结构因子包括:
以下以买卖压力指标为例说明计算方法:
buy_volume = sum(买一至买五的挂单量)
sell_volume = sum(卖一至卖五的挂单量)
pressure = (buy_volume - sell_volume) / (buy_volume + sell_volume)
该指标取值范围为 -1 至 1。正值表示买方力量较强,负值表示卖方力量较强。相关项目经验表明,该因子在日内反转策略中效果较好——当压力指标处于极端值时,价格往往在短期内回归。
实战技巧:微观结构因子通常需做日内标准化。不同时间点、不同股票的盘口深度差异较大。常用做法是以过去 N 分钟的滚动均值和标准差进行 Z-score 标准化。
订单流不平衡(Order Flow Imbalance)是一类精细度较高的因子,因其考虑了每一笔成交的主动买卖方向,优于简单的买卖压力指标。
判断一笔成交为主动买还是主动卖,可依据成交价格:
订单流不平衡因子的计算:
# 计算订单流不平衡
def order_flow_imbalance(trades):
buy_volume = 0
sell_volume = 0
for trade in trades:
if trade['side'] == 'buy':
buy_volume += trade['volume']
else:
sell_volume += trade['volume']
imbalance = (buy_volume - sell_volume) / (buy_volume + sell_volume)
return imbalance
此处需注意:订单流不平衡因子对数据质量要求极高。若交易所数据源中买卖方向标记有误,因子信号可能完全反转。实践中可增加校验逻辑——依据成交价格与盘口数据重新判定买卖方向,以规避此类问题。
注意事项:不同数据商对买卖方向的标记规则可能不同,有的采用主动买/主动卖,有的采用买方发起/卖方发起。须明确数据源规则,否则因子逻辑易出现系统性偏差。
高频因子信号虽强,但交易频率过高时,实盘成本难以承受。若按 tick 级别信号交易,单日可能交易数百次,手续费足以侵蚀大部分收益。
因此,需对高频因子进行降频处理,即将高频信号转换为日频或小时频信号。
常见的降频方法:
举个例子,把分钟级的订单流不平衡因子降频到日频:
# 降频处理:将分钟级因子聚合为日频因子
def daily_factor(minute_imbalance):
# 方法1:简单平均
avg_imbalance = minute_imbalance.mean
# 方法2:加权平均(尾盘权重更高)
weights = np.linspace(0.5, 1.5, len(minute_imbalance))
weighted_avg = np.average(minute_imbalance, weights=weights)
# 方法3:极值信号
extreme_signal = 1 if minute_imbalance.max > 0.8 else 0
return avg_imbalance, weighted_avg, extreme_signal
经验法则:降频处理不宜仅采用单一方法。通常可同时计算多个降频版本,再进行因子合成。例如,将平均订单流不平衡与极值信号结合,往往比单一指标更稳定。
为什么会这样?因为不同的降频方法捕捉的是不同的信息。平均信号反映的是整体趋势,极值信号反映的是极端事件。两者结合,相当于既看了全局,又抓了重点。
自高频数据特征出发,经微观结构因子与订单流不平衡因子,最终通过降频处理将高频信号转化为可用的低频信号。各环节均有相应注意事项与实施技巧。
需强调:高频因子并非万能,但在多因子体系中具有重要补充价值。下一章将讨论如何将高频因子与传统低频因子结合,构建完整的多因子体系。