Agtime.Pro文档

小盘价值质量复合因子策略分享(行业中性+动量过滤)

市场观察和机会发现

很多"纯小盘"或"纯价值"策略容易遇到两类问题:

  • 价值陷阱:估值便宜但基本面变差,股价继续下跌
  • 行业偏置:长期收益其实来自行业押注(例如价值偏金融/周期),一旦行业风格切换,策略波动放大

因此更实用的思路是:

  • 质量因子(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)
  • 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/利润增速等务必考虑披露延迟(否则有前视偏差风险)
  • 流动性与冲击成本:小盘策略对成交额和滑点敏感,建议加入成交额/换手限制
  • 涨跌停/停牌可交易性:回测与实盘可能偏差