因子研究(1)——基本面因子分析
由bqu1vdra创建,最终由bqu1vdra 被浏览 9 用户
研究区间:2015-01-01 ~ 2024-12-31(共 10 年,覆盖完整牛熊周期)
股票池:全 A 股(剔除 ST、停牌、上市不足 1 年、PE≤0 的股票)
研究因子:市盈率TTM、市净率、市销率TTM、ROE TTM、ROA TTM、毛利率TTM、净利润增长率(七个基本面因子,仅作示例)
估值类因子(衡量股票是否便宜)
1. 市盈率 TTM(PE-TTM)
- 公式:股价 ÷ 过去12个月每股收益
- 含义:反映投资者愿意为每1元利润支付的价格,也代表“回本年限”
- 解读:市盈率越低,通常意味着股票越便宜;但极低的市盈率也可能隐含市场对公司未来的悲观预期(即“价值陷阱”)
2. 市净率(PB)
- 公式:股价 ÷ 每股净资产
- 含义:反映股价相对于公司账面净资产的溢价倍数
- 解读:市净率越低,安全边际通常越高。常用于银行、钢铁等重资产行业的估值
3. 市销率 TTM(PS-TTM)
- 公式:总市值 ÷ 过去12个月营业收入
- 含义:反映股价相对于公司收入规模的定价
- 解读:对于亏损或微利的企业(如初创期科技公司),市盈率失效,此时市销率是更常用的估值指标
盈利类因子(衡量公司赚钱能力)
4. ROE TTM(净资产收益率)
- 公式:过去12个月净利润 ÷ 平均净资产
- 含义:公司用股东投入的资本,一年能创造多少利润。
- 解读:ROE越高,说明公司盈利能力越强。长期稳定在15%以上的公司通常被认为是优质企业
5. ROA TTM(总资产收益率)
- 公式:过去12个月净利润 ÷ 平均总资产
- 含义:公司用所有资产(包括借来的钱),能创造多少利润
- 解读:ROA衡量的是资产的“使用效率”。与ROE不同,它不受财务杠杆(负债率)的影响。如果ROE很高但ROA一般,说明公司主要靠高负债来放大收益,风险相对更高
6. 毛利率 TTM
- 公式:(营业收入 - 营业成本)÷ 营业收入
- 含义:每1元收入中,扣除直接成本后剩下多少
- 解读:毛利率反映产品的竞争力和定价权。高毛利率通常意味着品牌护城河、技术壁垒或规模效应。毛利率的变动趋势往往比数值本身更重要
成长类因子(衡量公司增长潜力)
7. 净利润同比增长率
- 公式:(本期净利润 - 上年同期净利润)÷ 上年同期净利润
- 含义:公司盈利能力的增长速度
- 解读:高增长是市场给予高估值的主要理由。但需要注意的是,增速波动往往较大,而且市场交易的是“预期差”——如果增速很高但低于分析师预期,股价仍可能下跌
一、什么是因子分析?
1.1 核心思想
因子分析,是量化研究的基本工作单元。其核心思想是:寻找某一个可量化的股票特征(因子),使得该特征能够稳定地预测股票未来的截面收益差异。
1.2 两大检验方法
本报告使用两种互补的方法对因子有效性进行检验:
1.2.1 分层回测(Quintile Backtest)
做法:每个月末,将全市场股票按因子值从小到大排序,均分为 5 组(Q1~Q5),分别跟踪各组下个月的等权平均收益,持续累计,形成净值曲线。
判断标准:
- Q1~Q5 的净值曲线呈现单调递增(或递减),说明因子具有截面区分能力
- 多空组合(Q5−Q1)净值持续向上,说明因子可以转化为实际超额收益
代码实现:
def quintile_backtest(df, factor_col, n_groups=5):
records = []
direction = FACTOR_CONFIG[factor_col][0] # 取因子方向:-1表示越低越好
for date, group in df.groupby('date'): # ① 按月度截面循环
sub = group[[factor_col, 'cum_ret_next']].dropna()
factor_adj = sub[factor_col] * direction # ② 方向调整,使Q5始终为"最好"组
sub['group'] = pd.qcut(factor_adj, n_groups, # ③ 等频分组(每组股票数量相等)
labels=['Q1','Q2','Q3','Q4','Q5'])
for g, gdf in sub.groupby('group'):
records.append({'date': date, 'group': g,
'ret': gdf['cum_ret_next'].mean()}) # ④ 组内等权平均收益
group_ret = pd.DataFrame(records).pivot( # ⑤ 整理为宽表
index='date', columns='group', values='ret')
group_ret['Q5-Q1'] = group_ret['Q5'] - group_ret['Q1'] # ⑥ 多空收益差
nav = (1 + group_ret.fillna(0)).cumprod() # ⑦ 累积净值
return group_ret, nav
PS:①按每个月末截面遍历 → ②调整因子方向(确保 Q5=最优组)→ ③用 pd.qcut 等频切分5档 → ④计算每组等权平均收益 → ⑤转为宽表格式 → ⑥构建多空组合 → ⑦累乘得净值曲线
#预设因子方向
FACTOR_CONFIG = {
'pe_ttm': (-1, '市盈率TTM(越低越好)'),
'pb': (-1, '市净率(越低越好)'),
'ps_ttm': (-1, '市销率TTM(越低越好)'),
'roe_avg_ttm': ( 1, 'ROE TTM(越高越好)'),
'roa_avg_ttm': ( 1, 'ROA TTM(越高越好)'),
'gross_profit_rate_ttm':( 1, '毛利率TTM(越高越好)'),
'net_profit_growth': ( 1, '净利润增长率(越高越好)'),
}
这个 FACTOR_CONFIG 字典是人工预设的,并且基于金融逻辑和长期的市场经验。
1. 估值类因子:取负号(越低越好)
配置中 pe_ttm、pb、ps_ttm 的方向是 -1。这背后是经典的价值投资逻辑:
- 逻辑:估值指标(市盈率、市净率)衡量的是你为获得一单位盈利(或资产)所支付的价格。价格越低,意味着安全边际越高,未来的潜在回报率通常越高。
- 经验证据:在全球大部分市场(包括A股)的长期历史回测中,低估值组合(低PE、低PB)的长期收益通常跑赢高估值组合。这就是所谓的价值因子。
- 处理方式:因为原始逻辑是“数值越小,未来收益越高”(即 IC 为负),为了在后续建模中统一处理(比如直接加权求和时希望“值越大越好”),这里用
-1进行了方向转换。
2. 质量类因子:取正号(越高越好)
配置中 roe_avg_ttm、roa_avg_ttm、gross_profit_rate_ttm 的方向是 1。
- 逻辑:ROE(净资产收益率)、ROA(总资产收益率)、毛利率代表了公司的盈利能力和护城河。护城河越宽、赚钱能力越强的公司,理论上应享有更高的股价表现。
- 经验证据:虽然单纯看ROE有时会陷入“估值陷阱”(高ROE可能对应高估值),但在多因子模型中,质量因子是长期有效的正向因子,能够筛选出基本面扎实的公司。
3. 成长类因子:取正号(越高越好)
配置中 net_profit_growth 的方向是 1。
- 逻辑:净利润增长率是典型的成长因子。市场通常给予高增长公司更高的估值溢价。
- 经验证据:在A股市场,成长因子(尤其是净利润同比增速)是过去十几年非常有效的选股维度之一。
★这个字典,是研究员基于经典金融理论和过往实证经验建立的一个“因子候选池”。它代表了对每个因子“预期有效方向”的假设。在后续的分析中,会通过计算 Rank IC 和 ICIR 来验证这些预设是否符合实际数据。如果验证通过,这些因子就会被放入最终的选股模型;如果通不过,就会被剔除或修正。
1.2.2 IC 时序分析(Rank IC / ICIR)
做法:每个月末,计算当期全市场截面上因子值排名与下月收益排名的 Spearman 相关系数,得到一个时间序列,称为 ==Rank IC 序列==
(关于相关系数:皮尔逊相关系数衡量变量之间的线性关系强弱,斯皮尔曼相关系数其实就是变量秩次的皮尔逊相关系数,主要衡量变量之间的单调关系)
核心指标:
| 指标 | 含义 | 参考标准 |
|---|---|---|
| IC 均值 | 因子预测能力的平均水平 | |IC| > 0.03 认为有意义 |
| ICIR | IC均值 ÷ IC标准差,衡量因子稳定性 | |ICIR| > 0.3 认为较好 |
| IC > 0 占比 | 因子方向正确的月份比例 | > 55% 认为稳定 |
| t 统计量 | 检验 IC 均值是否==显著不为零== | |t| > 2 认为统计显著 |
代码实现:
def calc_rank_ic(df, factor_col):
records = []
direction = FACTOR_CONFIG[factor_col][0] # 取因子方向
for date, group in df.groupby('date'): # ① 按月度截面循环
sub = group[[factor_col, 'cum_ret_next']].dropna()
factor_vals = sub[factor_col] * direction # ② 方向调整
ic, _ = spearmanr(factor_vals, sub['cum_ret_next']) # ③ 计算Spearman相关系数
records.append({'date': date, 'IC': ic})
ic_series = pd.DataFrame(records).set_index('date')['IC']
# ④ 计算汇总统计:IC均值、ICIR、t统计量
t_stat = ic_series.mean() / (ic_series.std() / np.sqrt(len(ic_series)))
summary = {
'IC均值': ic_series.mean(),
'ICIR': ic_series.mean() / ic_series.std(), # 信息比率
'IC>0占比': (ic_series > 0).mean(),
't统计量': t_stat,
}
return ic_series, summary
①按月遍历截面 → ②方向统一(PE越低越好,所以乘以-1翻转,让"低PE"对应"高因子值")→ ③spearmanr 计算因子排名与收益排名的相关系数(不受极端值影响)→ ④汇总成统计指标,t统计量用于假设检验
1.3 ★数据获取
数据准备的关键在于防止未来函数——财务数据必须按实际披露日而非报告期日期对齐:
sql = """
SELECT
date,
instrument,
daily_return, -- 日收益率(用于计算未来持仓收益)
total_market_cap, -- 总市值(用于后续中性化)
sw2021_level1, -- 申万一级行业代码
pe_ttm, -- 市盈率TTM:已按实际披露日对齐,无未来函数风险
pb, -- 市净率
ps_ttm, -- 市销率TTM
roe_avg_ttm, -- ROE(TTM,净资产收益率)
roa_avg_ttm, -- ROA(TTM,总资产收益率)
gross_profit_rate_ttm, -- 毛利率TTM
net_profit_ttm_yoy -- 净利润同比增长率
FROM cn_stock_prefactors
WHERE st_status = 0 -- 排除ST股
AND suspended = 0 -- 排除停牌股
AND list_days > 365 -- 排除上市不足1年的新股(避免新股效应干扰)
AND pe_ttm > 0 -- 排除亏损股(PE为负无比较意义)
AND pb > 0
"""
注:在Bigquant平台,cn_stock_prefactors 表的财务字段已内置披露日对齐逻辑,调用时自动使用截至当日已公布的最新财报数据,无需额外处理
cn_stock_prefactors表本就已经有net_profit_ttm_yoy字段(净利润ttm同比增长),因此直接选用该字段数据即可,还无需向前取252个交易日的数据来计算,更方便
前五行结果展示:
完成数据查询后,将日度数据压缩为月度截面(取每月最后一个交易日),并向前滚动计算下月累计收益作为因子预测的标签:
# ---- 月度截面 ----
df_raw['year_month'] = df_raw['date'].dt.to_period('M')
monthly_dates = df_raw.groupby('year_month')['date'].max().values
df_monthly = df_raw[df_raw['date'].isin(monthly_dates)].copy()
DECAY_HORIZONS = [1, 5, 10, 21, 42, 63] # 因子衰减分析持仓天数
df_raw_sorted = df_raw.sort_values(['instrument', 'date']).copy()
df_raw_sorted['log_ret'] = np.log1p(df_raw_sorted['daily_return'].clip(-0.99))
for h in DECAY_HORIZONS:
log_fwd = (df_raw_sorted
.groupby('instrument')['log_ret']
.transform(lambda x, hh=h: x.rolling(hh).sum().shift(-hh)))
df_raw_sorted[f'ret_next_{h}d'] = np.expm1(log_fwd)
# ---- 合并所有期收益到月度截面 ----
ret_cols = [f'ret_next_{h}d' for h in DECAY_HORIZONS]
df_monthly = df_monthly.merge(
df_raw_sorted[['date', 'instrument'] + ret_cols].drop_duplicates(),
on=['date', 'instrument'],
how='left'
)
# 21日收益作为主分析收益
df_monthly['cum_ret_next'] = df_monthly['ret_next_21d']
原本默认的 21 天(约一个月)是主分析周期,用于评估因子在中周期上的预测能力。\n而增加 DECAY_HORIZONS(例如 5 天、63 天等) 是为了研究因子的衰减特性:
- 短期(如 5 天):看因子能否快速捕捉短期定价偏差。
- 中期(21 天):作为基准,模拟月频调仓的效果。
- 长期(如 63 天):观察预测力是否衰减、消失甚至反转
注:
前三行结果展示:
1.4 ★★★数据预处理:去极值 + 行业、市值中性化 + Z-score 标准化
| 步骤 | 方法 | 目的 |
|---|---|---|
| Step 1:去极值 | MAD法(截断 median ± 3×MAD 外的值) | 消除财务数据极端值对 IC 的干扰 |
| Step 2:行业 + 市值中性化 | OLS 同时回归行业哑变量 + log(市值),取残差 | 同时剥离行业效应与市值效应,测试因子的纯截面预测力 |
| Step 3:Z-score 标准化 | 截面标准化为均值0、标准差1 | 使不同因子量纲可比 |
def winsorize_mad(series, n=3):
# MAD 去极值:截断超出 median ± n*MAD 的异常值
valid = series.dropna()
if len(valid) < 10:
return series
median = valid.median()
mad = (valid - median).abs().median()
if mad == 0:
mad = valid.std() * 0.6745 # 退化到正态分布下的 MAD 估计
upper = median + n * mad
lower = median - n * mad
return series.clip(lower, upper)
def zscore_normalize(series):
# 截面 Z-score 标准化:均值0,标准差1
valid = series.dropna()
if len(valid) < 10:
return series
mu, sigma = valid.mean(), valid.std()
if sigma == 0:
return series - mu
return (series - mu) / sigma
def neutralize_factor(factor_series, industry_series, log_mktcap_series):
# 行业 + 市值双重中性化
# OLS 回归:factor = β_ind * 行业哑变量 + β_mktcap * log(市值) + ε
# 残差 ε = 剔除行业效应和市值效应后的纯因子信号
df_tmp = pd.DataFrame({
'factor': factor_series.values,
'industry': industry_series.values,
'log_mktcap': log_mktcap_series.values,
}, index=factor_series.index).dropna()
if len(df_tmp) < 10 or df_tmp['industry'].nunique() < 2:
return factor_series
# 构建设计矩阵:行业哑变量 + log市值(连续变量)
dummies = pd.get_dummies(df_tmp['industry'], prefix='ind').astype(float)
log_mc = df_tmp[['log_mktcap']].values
X = np.hstack([dummies.values, log_mc])
y = df_tmp['factor'].values
try:
beta, _, _, _ = np.linalg.lstsq(X, y, rcond=None)
residuals = y - X @ beta
except Exception:
return factor_series
result = factor_series.copy()
result.loc[df_tmp.index] = residuals
return result
去极值和标准化的原理很简单,此处不再细讲,下面主要讲一下“行业、市值中性化”的处理方式及原理:
中性化是因子预处理中的核心步骤,其目的是剥离因子中由行业属性、市值影响带来的系统性差异,从而获得更纯净的、反映个股自身特征的信号。
数学模型如下:
二、七大因子逐一分析
因子一:市盈率 TTM(PE)
定义:股票价格 ÷ 过去 12 个月每股盈利,反映市场对公司盈利的定价水平。PE 越低,代表股票相对于盈利水平越便宜(价值低估),理论上预期收益越高。
检验结果
中性化后指标: IC 均值 = 0.0529 | ICIR = 0.6995 | IC>0 = 78.1% | t = 7.63
PE 是中性化后 ICIR 提升最显著的因子(0.29 → 0.70),显示原始 IC 中存在大量市值噪声被行业+市值回归有效剔除。
78.1% 的 IC>0 占比意味着每 5 期中有近 4 期方向正确,信号高度稳定。最佳持仓期为 63 天,说明低估值信号需要更长时间被市场定价。
因子二:市净率(PB)
定义:股票价格 ÷ 每股净资产,衡量股票相对于账面价值的定价。PB 越低,股票越接近或低于资产清算价值,安全边际越高。
中性化后指标: IC 均值 = 0.0557 | ICIR = 0.4888 | IC>0 = 61.3% | t = 5.33
PB 是 IC 均值最高的因子(0.0557),在熊市环境中防御性尤为突出(2015 熊市 IC = 0.089,2022-2023 熊市 IC = 0.070)。与 PS 存在一定相关性(r = 0.591),多因子合成时需降低 PS 权重。
因子三:市销率 TTM(PS)
定义:股票价格 ÷ 过去 12 个月每股营业收入,适用于盈利不稳定但营收持续增长的公司(如早期成长股、周期底部公司)。PS 越低代表估值越低廉。
中性化后指标: IC 均值 = 0.0394 | ICIR = 0.4275 | IC>0 = 63.9% | t = 4.66
PS 与 PB 趋势高度一致,且与毛利率 TTM 存在较强相关性(r = 0.598)。在多因子框架中可作为价值因子的补充,但权重应低于 PE 和 PB。
因子四:ROE TTM(净资产收益率)
定义:净利润 ÷ 净资产,衡量公司利用股东权益创造利润的效率。ROE 越高,代表公司盈利能力越强,理论上股票更具吸引力。
中性化后指标: IC 均值 = 0.0172 | ICIR = 0.2277 | IC>0 = 56.3% | t = 2.48
尽管 ICIR = 0.23 低于 0.3 的强效标准,但 t 统计量显著,建议作为弱效因子纳入多因子体系,与价值因子配合使用而非单独使用
因子五:ROA TTM(总资产收益率)
定义:净利润 ÷ 总资产,衡量公司利用所有资产(含债务融资)创造利润的能力,比 ROE 更反映资产使用效率(剔除了财务杠杆的影响)。
中性化后指标: IC 均值 = 0.0132 | ICIR = 0.1721 | IC>0 = 50.4% | t = 1.88
ROA 与 ROE 高度共线(r = 0.861),中性化后 t = 1.88,接近但未达到显著性阈值。IC>0 占比仅 50.4%(接近随机)。与 ROE 保留一个即可,推荐 ROE(信号更强,t = 2.48 vs 1.88)。
因子六:毛利率 TTM
定义:(营业收入 − 营业成本)÷ 营业收入,衡量公司的定价权和产品竞争壁垒。毛利率越高,说明公司拥有更强的品牌溢价或成本控制能力(如消费品、医药)。
中性化后指标: IC 均值 = 0.0044 | ICIR = 0.0771 | IC>0 = 52.1% | t = 0.84
值得注意的是,中性化后毛利率的 IC 从原始的 -0.0034 修正为 +0.0044,方向从反向变为正向,说明原始的"反向效应"确实是市值噪声导致的假象。但 t = 0.84 仍远不显著,衰减分析显示 5 天持仓期时 IC 甚至为负(-0.006),稳定性极差。
因子七:净利润增长率
定义:(本期 TTM 净利润 − 上期 TTM 净利润)÷ 上期 TTM 净利润,衡量公司盈利成长速度。理论上增长越快,未来估值扩张空间越大。
中性化后指标: IC 均值 = 0.0053 | ICIR = 0.0841 | IC>0 = 53.8% | t = 0.92
t = 0.92 仍不显著。净利润增长率的信号稳定性差,最佳持仓期 42 天时 IC 也仅 0.007,对选股贡献非常有限。
三、IC滚动时序分析
目的:分析每个因子的 IC 信号是否稳定,还是具有明显的==时变性和周期性==
图表说明:
- 蓝色柱:月度 Rank IC(正绿负红)
- 橙色线:滚动 6 期 IC 均值
- 紫色线:滚动 12 期 IC 均值
- 绿色虚线(右轴):滚动 12 期 ICIR(±0.3 为参考线)
\
四、因子衰减分析
目的:检验因子预测能力随持仓期延长的衰减规律。
- 若 IC 在短期(1-5天)最高,随持仓期增长快速衰减 → 因子适合高频换仓策略
- 若 IC 在中长期(21-63天)依然稳健 → 因子适合月度调仓策略
- 质量因子往往在长周期表现更好,价值因子在短期可能有反转效应
4.1 各因子不同持仓期 IC 均值
| 因子 | 1 天 | 5 天 | 10 天 | 21 天* | 42 天 | 63 天 | 趋势 |
|---|---|---|---|---|---|---|---|
| 市盈率 TTM | 0.026 | 0.035 | 0.037 | 0.053 | 0.066 | 0.075 | ↗ 持续增强 |
| 市净率 | 0.028 | 0.046 | 0.043 | 0.056 | 0.069 | 0.079 | ↗ 持续增强 |
| 市销率 TTM | 0.020 | 0.030 | 0.027 | 0.039 | 0.049 | 0.058 | ↗ 持续增强 |
| ROE TTM | 0.005 | 0.003 | 0.009 | 0.017 | 0.022 | 0.023 | ↗ 缓慢增强 |
| ROA TTM | 0.003 | -0.002 | 0.005 | 0.013 | 0.017 | 0.019 | 短期波动后增强 |
| 净利润增长率 | 0.004 | -0.001 | 0.003 | 0.005 | 0.007 | 0.006 | 极弱,42天最优 |
| 毛利率 TTM | -0.002 | -0.006 | 0.004 | 0.004 | 0.005 | 0.005 | 短期负向,长期微弱正向 |
4.2 核心发现
- 所有有效因子均呈"随持仓期延长而增强"的特征,三个价值因子(PE/PB/PS)在 63 天持仓期时 IC 均值分别达到 0.075/0.079/0.058,显著高于 21 天(月度调仓)的水平
- 价值因子不适合高频交易:1 天持仓期 IC 仅约 0.02-0.03,信号在短期极弱,说明价值效应需要时间积累和市场消化
- ROE TTM 是典型的"慢因子":1 天 IC 仅 0.005,63 天才到 0.023,适合季度甚至半年度调仓的中低频策略
- 毛利率在短期(1-5天)存在反转:1 天 IC = -0.002,5 天 IC = -0.006,说明短期高毛利率公司反而倾向于回调(可能的题材炒作后的均值回归)
- 最优调仓频率建议:月度(21天)→ 季度(63天)均适合,尤以季度调仓信号更强
五、牛熊市分段稳定性分析
检验因子在不同市场环境下的表现,是判断其是否真正可用的关键步骤。
- 价值因子跨周期稳定性显著强于质量因子 ,PE/PB/PS 在全部 6 个市场阶段均保持正 IC,未出现方向反转,是真正意义上的跨周期稳健因子。
- PE 在熊市中信号最强(IC = 0.123) 2015 熊市期间 PE 的 IC 高达 0.123,为全样本最高单期记录。在市场下行时,低估值股票获得显著相对保护,价值因子的防御性充分展现。
- ROE TTM 存在明显的周期依赖性 中性化后 ROE 在多数阶段有效(牛市 IC = 0.010,震荡市 IC = 0.031),但在 2022-2023 熊市中出现方向反转(IC = -0.029)。这是 ROE 的核心风险:熊市中高盈利能力公司往往估值更高,下跌幅度反而更大。
- 质量因子在 2015 熊市"意外有效" 中性化后 ROE/ROA 在 2015 熊市 IC 分别为 0.075/0.069,超过不少阶段的价值因子表现,说明危机后修复期市场对盈利质量的重视度提升。
- 毛利率全样本最弱 毛利率在 2015 牛市(-0.012)、2022-2023 熊市(-0.007)和 2024 年(-0.000)均表现极弱或为负,是 7 个因子中稳定性最差者。
六、因子相关性矩阵
在将因子合成为多因子模型时,必须先了解因子间的重叠程度,避免引入冗余信息。
高相关因子对
| 因子对 | 相关系数 | 影响 |
|---|---|---|
| ROE TTM ↔ ROA TTM | r = 0.861 | 高度冗余,二选一(推荐 ROE) |
| 市净率 ↔ 市销率 TTM | r = 0.591 | 存在重叠,合成时 PS 降权 |
| 市销率 TTM ↔ 毛利率 TTM | r = 0.598 | 毛利率信息部分已被 PS 捕捉 |
| 市盈率 TTM ↔ ROE TTM | r = -0.597 | 价值与质量天然对立,互补性强 |
| 市盈率 TTM ↔ ROA TTM | r = -0.509 | 同上 |
七、综合排名与结论
7.1 七因子综合评分排名
评分机制:ICIR × 10 + IC>0占比 × 5
| 因子 | IC 均值 | ICIR | IC>0 占比 | t 统计量 | 综合评分 | 最佳持仓期 | 判定 |
|---|---|---|---|---|---|---|---|
| 市盈率 TTM | 0.0529 | 0.6995 | 78.1% | 7.63 | 10.90 | 63 天 | ✅ 有效 |
| 市净率 | 0.0557 | 0.4888 | 61.3% | 5.33 | 7.96 | 63 天 | ✅ 有效 |
| 市销率 TTM | 0.0394 | 0.4275 | 63.9% | 4.66 | 7.47 | 63 天 | ✅ 有效 |
| ROE TTM | 0.0172 | 0.2277 | 56.3% | 2.48 | 5.09 | 63 天 | ✅ 有效 |
| ROA TTM | 0.0132 | 0.1721 | 50.4% | 1.88 | 4.24 | 63 天 | ❌ 无效 |
| 净利润增长率 | 0.0053 | 0.0841 | 53.8% | 0.92 | 3.53 | 42 天 | ❌ 无效 |
| 毛利率 TTM | 0.0044 | 0.0771 | 52.1% | 0.84 | 3.38 | 5 天 | ❌ 无效 |
7.2 核心结论
有效因子(4个)
市盈率 TTM(PE):中性化后最强信号,ICIR = 0.70,78% 的月度方向准确率,跨周期表现最稳健,推荐作为核心因子,最佳配合季度调仓。
市净率(PB):IC 均值最高,熊市防御性突出,熊市 IC 可达 0.07-0.09。与 PE 互为补充,共同构成价值因子体系的核心。
市销率 TTM(PS):有效但与 PB 存在冗余,建议降权使用,主要贡献在于覆盖无法计算 PB 的特殊行业。
ROE TTM:市值中性化后通过显著性检验(t = 2.48)。ICIR = 0.23,属于弱效因子,建议与价值因子配合使用,充分利用 PE↔ROE 的负相关性(r = -0.597)实现因子互补。
无效因子(3个)
ROA TTM:与 ROE 高度冗余(r = 0.861),且信号更弱(t = 1.88),建议舍弃。
毛利率 TTM:短期存在反转效应,全样本信号极弱(ICIR = 0.077),不建议直接使用。若后续研究可考虑改用毛利率同比变化量(Δ毛利率)。
净利润增长率:全样本无显著预测能力(t = 0.92),A 股市场的均值回归效应和"业绩透支"现象削弱了增长率的有效性。建议改用盈利预测修正方向(分析师上调/下调预期)替代。
八、特别提醒
"因子无效" ≠ "因子毫无作用"
报告用 IC、ICIR、t 统计量判定这四个因子无效,这个标准是针对"单因子线性选股能力"的评估。但无效≠没用,原因有以下几点:
8.1 单因子有效 ≠ 多因子组合有效(最重要)
ROA、毛利率、净利润增长率这四个因子的 IC 单独很低,但在多因子模型中可能有增量贡献。
原因是:
- 报告里因子相关性矩阵已经说明这些因子与 PE/PB/PS 存在一定的相关性
- 在多因子正交化/中性化后,质量因子可能会补充价值因子覆盖不到的信息
- 实践中 Barra 类风险模型里 ROE、毛利率是必要的风险因子,不是选股因子
8.2 线性无效,不代表非线性无效
IC 本质是线性相关系数(Spearman/Pearson),衡量的是因子与未来收益的单调线性关系。如果某因子与收益的关系是:
- 分段有效(极高有效,中等无效)
- 非线性(U 型、阈值效应)
IC 就会被平均掉趋近于 0,但因子本身并非无用。
8.3 在特定市场环境下有效
报告做了牛熊市分段检验,会发现质量因子(ROE/ROA)往往在:
- 熊市/震荡市中防御性更强
- 价值风格占优期表现更好
全样本 IC 均值低,可能掩盖了它在特定市场阶段的贡献。
8.4 作为"排除因子"有用(反向过滤)
净利润增长率 IC 为负、方向与预期相反,这本身就是有价值的发现:
- 可以用它做负向筛选:剔除净利润高增长的"伪成长股"(业绩爆雷预期、高估值透支等)
- 毛利率因子 IC 为负,可能在 A 股反映了"高毛利行业估值透支"的特征
\