小盘价值质量复合因子策略分享(行业中性+动量过滤)
市场观察和机会发现
很多"纯小盘"或"纯价值"策略容易遇到两类问题:
- 价值陷阱:估值便宜但基本面变差,股价继续下跌
- 行业偏置:长期收益其实来自行业押注(例如价值偏金融/周期),一旦行业风格切换,策略波动放大
因此更实用的思路是:
- 用质量因子(ROE)减少价值陷阱
- 用行业内排名实现行业中性,避免行业押注
- 用动量过滤避开短期下跌趋势中的"接飞刀"
假设提出
本策略建立在以下假设上:
- 小盘溢价存在,但需要"筛选":小盘整体更分化,必须叠加基本面与估值约束才能提高胜率。
- 价值 + 质量更稳健:便宜且盈利质量较好(ROE 更高)的股票,在震荡与下行周期通常更抗跌。
- 行业中性让因子收益更"纯":将因子暴露放到行业内部比较,减少行业结构变化带来的扰动。
- 动量过滤降低下行风险:当短期价格趋势显著走弱时,即使估值很便宜,也可能继续下跌。
策略逻辑编写
策略思想
策略由三层组成:股票池过滤 → 因子打分(行业内)→ 动量过滤 → 组合持仓
股票池过滤
使用基础信息与可交易性约束构建股票池:
- 市场:上交所 + 深交所
- 板块:主板 + 创业板
- ST:仅"正常"
- 剔除停牌(
drop_suspended=True)
进一步在因子模块里加入更严格过滤:
- 交易可得:
suspended=0 AND st_status=0 - 小盘约束:
float_market_cap <= 1750000000 - 成长/基本面过滤:
net_profit_yoy_ttm > 0.3 AND operating_revenue_yoy_ttm > 0.3 - 估值范围:
0 < pe_ttm < 50 AND 0 < pb < 5 - 上市时间:
list_days > 90 - 动量过滤:
mom_20 > -0.15
因子构建与行业中性
构建了一个综合打分,并且在申万2021二级行业内做分位排名,从而实现行业内相对比较(行业中性实现方式)。
表达式核心为:
- Size(小盘):
1 - c_group_pct_rank(sw2021_level2, float_market_cap)(行业内越小越高分) - Value(价值):
- EP:
c_group_pct_rank(sw2021_level2, 1/pe_ttm) - BP:
c_group_pct_rank(sw2021_level2, 1/pb)
- EP:
- Quality(质量):
c_group_pct_rank(sw2021_level2, roe_avg_ttm) - Momentum(动量过滤项):
mom_20 = close / m_lag(close, 20) - 1
综合打分(当前权重):
- 小盘:50%
- EP:5%
- BP:5%
- ROE:40%
也就是:
score = 0.50*Size_rank + 0.05*EP_rank + 0.05*BP_rank + 0.40*ROE_rank
mom_20 = close / lag(close, 20) - 1
持仓数量与仓位生成
- 按 score 降序排序
- 取前 60 支股票持仓
- 等权:
position_expr="1 AS position"且total_position=1。优点是稳健、解释性强;缺点是对波动与流动性敏感,后续可以加:单票上限、流动性约束、换手约束等。
回测配置
- 回测区间:2022-05-01 至 2025-07-31
- 初始资金:1,000,000
- 交易频率:日频调仓
- 成交价格:开盘价
- 手续费模型:买 0.03%,卖 0.13%,最低 5 元
- 基准:沪深300指数
交易逻辑:
- 每个调仓日读取当日目标持仓列表
- 不在目标池的持仓卖出到 0
- 在目标池的股票按 position 下单到目标仓位
历史数据回测
风险提示
- 财务数据滞后:ROE/利润增速等务必考虑披露延迟(否则有前视偏差风险)
- 流动性与冲击成本:小盘策略对成交额和滑点敏感,建议加入成交额/换手限制
- 涨跌停/停牌可交易性:回测与实盘可能偏差