在上一篇《个人量化选股(二):标的池怎么选,以及多路召回与双轨粗排》中,我们通过流动性客观门槛与全景行业 ETF 雷达,把全市场的数千只股票压缩到了单市场 100 只高信息密度的物理观察池(中国资产 100 只 + 美股 100 只,合计 200 只)。
这也是我最近在 QuantFull 整理的「个人量化选股实战体系」的第三篇。标的进入观察池之后,接下来的步骤不是直接去算排名。
很多人拿到观察池,习惯直接把动量指标套进去,从高到低排个序,挑前几名买入。
在实际交易中,纯动量排序很容易踩进两个极端坑里:一个是买到了大跌破位后的超跌反弹,上方全是一整年套牢盘的解套抛压;另一个是买到了短期暴拉后的加速赶顶,直接接在情绪最高点,随后遭遇均值回归的大幅回撤。
动量指标只衡量过去一段时间上涨的速度,它不负责判断标的当前所处的趋势位置和风险收益比。
为了防止系统在这些极端位置发出买入信号,我们在进入截面打分排序之前,设置了三道准入硬门槛(Buy Gates):

四态相空间与三道准入硬滤网架构
在设计过滤规则时,我们把价格与 200 日均线的关系,以及 12-1 动量的正负,交叉构建成一个四态决策矩阵(Regime Four States):
| 状态评级 | 价格与均线关系 | 12-1 动量状态 | 市场微观特征 | 系统的准入处理 |
|---|---|---|---|---|
| 状态①:顺势领涨 (Advancing) | $P > \text{MA200}$ | $\text{Mom}_{12-1} > 0$ | 站稳年线中长期成本线上方,中期动能充沛 | 唯一准许买入与顺势持有的健康区间(需再过防追高检查) |
| 状态②:高位滞涨 (Distribution) | $P > \text{MA200}$ | $\text{Mom}_{12-1} \le 0$ | 价格虽在年线上,但中期动量已经转负,震荡磨损 | 不予买入,已持仓者列入动量衰竭观察 |
| 状态③:超跌反弹 (Dead Cat Bounce) | $P \le \text{MA200}$ | $\text{Mom}_{12-1} > 0$ | 处于长期下行通道,短期反弹看似凶猛,上方压制沉重 | 一票否决,涨得再猛也归类为反弹观察,严禁接飞刀 |
| 状态④:持续阴跌 (Downtrend) | $P \le \text{MA200}$ | $\text{Mom}_{12-1} \le 0$ | 均线与动量双重压制,空头主跌通道 | 坚决回避,不参与任何左侧抄底 |
为了看清真实市场中这四类标的的分布情况,我们将上一篇双轨粗排产生的最新 200 只中外观察池(ah_batch_100 与 us_batch_100)全部拉取完整日 K 矩阵,计算每只标的的年线乖离率(Bias)与 12-1 相对动量。
左图展示连续相空间分布,右图展示三道硬门槛逐级淘汰的漏斗数据:

在最新 200 只中外全景观察池中:
- 门槛① 周期生命线:淘汰 111 只处于年线压制通道的标的(剔除率 55.5%),其中包含了 48 只看似反弹凶猛但上方全是套牢盘的超跌死猫标的(如中际旭创、新易盛、泛林半导体等),剩余 89 只;
- 门槛② 动量转正过滤:淘汰 13 只高位滞涨标的(剔除率 14.6%),包括短期突破年线但中期动量依然为负的比特币现货 ETF 等,剩余 76 只;
- 门槛③ 防追高警戒:拦截 13 只偏离年线超过 +30% 的过热标的(超威半导体 AMD、戴尔、联想、CrowdStrike、MRNA 等,拦截率 17.1%),过热跳过,名额顺延;
- 最终准入合格池:从 200 只中筛选出 63 只合格标的(整体通过率 31.5%),进入下一阶段的市场内截面精排。
门槛一:为什么动量股必须在 MA200 年线上方
动量指标衡量的是股票在过去一段时间里涨得有多快。它是一个关于速度的指标,但它不负责判断股票当前所处的位置。
这里最常见的陷阱,就是大跌之后的死猫反弹。
假设一只股票在过去一年从 100 块跌到了 20 块,然后在最近两个月从 20 块快速反弹到了 35 块。短期涨幅高达 75%,如果纯看相对速度,它会直接冲进全市场动量榜单的前三名。但从长期走势看,它依然被压制在 200 日线下方,上方堆积了过去一整年被套牢的巨量筹码。
买入这种股票,本质上是在长线下跌通道里接飞刀。每次反弹到阻力位,就会遇到解套盘涌出砸盘。
200 日均线反映的是场内过去大约 10 个月到 1 年交易者的加权平均持仓成本线。收盘价站上 200 日线,说明中长期持有者的平均筹码开始进入浮盈状态,抛压减弱,支撑有效。
我们在 200 只观察池的日 K 矩阵上提取了历史滑动窗口样本,对比了买入时处于状态①(站上年线)与状态③(年线下方反弹)在不同持有周期的真实表现:

实测数据呈现出清晰的持有期演变:
| 持有周期 | 状态①:顺势领涨 ($P > \text{MA200}$) 平均收益 | 状态① 胜率 | 状态③:超跌反弹 ($P \le \text{MA200}$) 平均收益 | 状态③ 胜率 | 表现差距 |
|---|---|---|---|---|---|
| 20 个交易日 (约 1 个月) | +2.79% | 56.9% | +2.86% | 56.7% | 短线收益几乎持平,反弹极具诱惑力 |
| 40 个交易日 (约 2 个月) | +5.47% | 58.3% | +5.00% | 58.3% | 顺势组开始反超,死猫反弹动能趋缓 |
| 60 个交易日 (约 1 个季度) | +8.62% | 62.3% | +5.20% | 57.1% | 顺势收益高出 65.8%,胜率拉开 5.2 个百分点 |
在 20 个交易日的短期窗口里,死猫反弹的平均收益(+2.86%)甚至微幅超过了顺势领涨(+2.79%)。这种短线脉冲非常容易给交易者造成底部反转的错觉。
但拉长到 60 个交易日(一个季度),差距彻底显现:站稳年线的顺势标的平均收益拉升到 +8.62%,胜率达到 62.3%,中位数收益为 +4.53%;而在年线下方买入反弹股票,平均收益停滞在 +5.20%,胜率掉到 57.1%,中位数收益只有 +2.61%。上方沉重的解套抛压会把绝大多数反弹死死压制。
在最新 200 只观察池截面上,有几只非常典型的股票:
- 中际旭创 (SZ.300308):12-1 动量高达 +124.3%,在动量榜单上位居前列。但最新收盘价距 MA200 年线偏离 -21.2%,深陷破位调整通道。如果纯看动量,系统会直接将其买入;但由于 MA200 硬门槛,系统一票否决。
- 新易盛 (SZ.300394):12-1 动量达 +112.3%,但价格距年线偏离 -13.3%,同样被 MA200 拦截。
- 泛林半导体 (US.LRCX):12-1 动量达 +103.1%,价格距年线偏离 -6.2%,一票否决。
- 科创50 ETF (SH.588000):12-1 动量转正为 +22.0%,但收盘在年线下方 -3.4%,属于左侧反弹,系统维持空仓观望,拒绝建仓。
门槛二:为什么偏离 200 日线超 30% 坚决不追
确认了股票在 200 日线上方之后,并不是说偏离均线越远越好。
当一只股票的价格距离它的 200 日线超过 +30%、甚至 +50% 时,说明短期内价格脱离了基本面的平稳积累,进入加速赶顶或过度炒作阶段。
价格偏离长期成本线过远时,均值回归的压力会非线性增大。在偏离 40% 的位置发出买入指令,极容易买在短期波段的最高点,随后遭遇大幅均值回归回踩。
为了量化这种风险,我们统计了观察池历史滑动窗口样本,按照买入时距 MA200 的乖离率($\text{Bias} = P / \text{MA200} - 1$)划分为五个区间,测算其在未来 60 个交易日内的最大回撤分布:

实测数据呈现出清晰的风险阶梯:
| 年线乖离率区间 | 样本数量 | 未来 60 天平均最大回撤 | 未来 60 天 P90 极端回撤(最差 10%) | 风险特征评估 |
|---|---|---|---|---|
| 偏离年线 ≤0% (空头/反弹) | 2,671 个 | -10.2% | -24.1% | 下行通道破位,缺乏支撑 |
| 偏离 0%~+15% (稳健起步) | 2,878 个 | -7.8% | -19.5% | 风险收益比最优的黄金建仓区间 |
| 偏离 +15%~+30% (温和主升) | 1,272 个 | -9.6% | -21.9% | 主升走势健康,回撤可控 |
| 偏离 +30%~+50% (过热加速) | 633 个 | -12.6% | -26.2% | 均值回归压力陡增,尾部风险激增 |
| 偏离 >+50% (极端亢奋) | 560 个 | -17.7% | -38.7% | 严重泡沫化,极易遭遇腰斩式暴跌 |
数据表明:当偏离度处于 0%~+15% 时,未来 60 天平均回撤仅 -7.8%,P90 极端回撤仅 -19.5%。
一旦偏离度跨过 +30%,平均最大回撤扩大到 -12.6%,P90 极端回撤直接跳跃到 -26.2%;若偏离超过 +50%,极端回撤深达 -38.7%。
基于这个客观分布,系统设定了一条防追高硬规则:
$$\text{Bias} = \frac{\text{最新收盘价}}{\text{MA200}} - 1 \le +30%$$
只要正向偏离度超过 30%,哪怕其他所有指标排第一,系统也会标明「超温过热,暂不追高」,强制跳过该标的,名额按顺序顺延给下一名(Graceful Skip)。
在最新 200 只池的实盘数据中:
- 超威半导体 (US.AMD):在美股候选池中位列前列,1 年卡玛比率达 4.52,12-1 动量达 +138.7%。但现价距 MA200 年线偏离达 +34.1%,超过 +30% 警戒线。系统判定「不买:距 200 日线 +34.1%,超过 +30%,不追高」,名额顺延给下一顺位优质标的。
- 联想集团 (HK.00992):在港股龙头中 12-1 动量高达 +182.7%,但距年线偏离高达 +49.5%,触发防追高拦截;
- 戴尔科技 (US.DELL):动量高达 +289.5%,距年线偏离 +44.5%,同样触发拦截。
这条规则放弃了一小段非理性的末端赶顶利润,换取了整个组合免于承受接近 30% 到 40% 的极端回撤。
案例实证:超威半导体与中际旭创走势复盘
为了把 MA200 一票否决与 +30% 防追高拦截的过程展示得更具体,我们把超威半导体与中际旭创的走势和指标提取出来:

在超威半导体(上图)的走势中,当股价在历史波段向上拉升、偏离 200 日线达到极值时,动量指标持续刷新高点。如果采用单纯的动量追踪,系统会在偏离最大的位置发出加仓买入指令。随后股价出现均值回归,回踩 200 日线,单波回撤达到 -35.4%。+30% 乖离率拦截机制在情绪亢奋点强制跳过,避免了在高位挂单接盘。在最新截面上,AMD 偏离年线依然达到 +34.1%,系统继续保持跳过状态,名额顺延。
在中际旭创(下图)的走势中,股价见顶跌破 200 日线后,12-1 动量指标依然保留着过去大半年累积的涨幅(+124.3%)。如果只看动量榜单,它依然排在市场前列。由于收盘价始终受制于 200 日线下方(偏离 -21.2%),系统识别其为状态③死猫反弹,全程保持一票否决,规避了随后深幅阴跌到 650 元的过程。
门槛三:为什么 12-1 动量要剔除最近 1 个月
在计算动量时,我们采用的不是过去一整年的总涨幅(12-0 动量),而是 12-1 动量:
$$\text{Mom}{12-1} = \frac{P{t-21}}{P_{t-252}} - 1$$
也就是用 21 个交易日(约 1 个月)前的收盘价,除以 252 个交易日(约 1 年)前的收盘价,把最近 21 天的数据剔除。
这样做背后的计量金融学依据,来自经典金融实证研究(Jegadeesh & Titman, 1993):
- 在 3 到 12 个月的时间跨度上,股票截面收益表现出显著的动量效应(Momentum Effect),即过去表现好的股票在未来一段时间继续跑赢;
- 在 1 个月以内的短期跨度上,股票截面收益表现出显著的短期反转效应(Short-Term Reversal),即短期暴涨的股票在未来 1 到 4 周往往伴随获利回吐与买卖价差回弹。
我们在 200 只观察池的历史月度截面上做了检验:近 1 个月收益率对未来 1 个月收益率的 Rank IC 为 -0.0757,表现出明确的负相关反转特征。
如果不剔除最近 21 天,直接算过去一整年的涨幅,最近一个月暴涨的标的会被赋予最高权重。在实际交易中,短线脉冲往往伴随着微观结构上的流动性耗竭和回调洗盘。
把最近 21 天剔除之后,指标衡量的是剥离了短线噪音之后的中期趋势强度。
在最新 200 只池的实盘数据中:
- 比特币现货 ETF (US.IBIT) 与 以太坊现货 ETF (US.ETHA):短期在场内情绪带动下快速反弹,价格站上了 200 日线上方(分别偏离 +10.4% 与 +8.0%)。如果只看短期突破,容易误判为主升浪启动。计算 12-1 动量时,扣除近 1 个月后,IBIT 的 12-1 动量为 -25.1%,ETHA 为 -31.9%,说明其中期依然处于下行修复阶段。系统准确判定为状态②高位滞涨,发出「12-1 动量为负,还在下跌」的拦截提示,避免了过早建仓。
核心实现代码
以下是生产环境中负责准入门槛检验的向量化 Python 实现:
from typing import Dict, Optional, List
import numpy as np
def calc_momentum_12_1(closes: List[float]) -> Optional[float]:
"""计算 12-1 相对动量: P(t-21) / P(t-252) - 1。
若历史不足 252 根日 K 但满 126 根(6个月),回退到近 6 个月收益率兜底。
"""
if len(closes) >= 252:
base = closes[-252]
if base > 0:
return float((closes[-21] / base - 1.0) * 100.0)
elif len(closes) >= 126:
base = closes[-126]
if base > 0:
return float((closes[-1] / base - 1.0) * 100.0)
return None
def buy_gate_reason(
p_last: float,
ma200: Optional[float],
mom_12_1: Optional[float],
max_gap_pct: float = 30.0
) -> str:
"""三道买入硬门槛过滤。满足条件返回空字符串,否则返回具体拦截原因。"""
if ma200 is None or mom_12_1 is None:
return "数据样本不足,不满足计算条件"
bias_pct = (p_last / ma200 - 1.0) * 100.0
# 门槛①:周期生命线
if bias_pct <= 0:
return f"收盘在 200 日线下方({bias_pct:+.1f}%),一票否决"
# 门槛②:动量转正
if mom_12_1 <= 0:
return f"12-1 动量为负({mom_12_1:+.1f}%),还在下跌"
# 门槛③:防追高警戒
if bias_pct > max_gap_pct:
return f"距 200 日线 {bias_pct:+.1f}%,超过 +{max_gap_pct:.0f}%,不追高"
return ""
阶段小结
这三道准入硬门槛解决的是买入端的基本安全问题:
- 不在下行通道里接飞刀(MA200 过滤,在 200 只全景池中拦截了 111 只破位/反弹标的);
- 不被 1 个月的短线波动误导(12-1 动量剔除短期反转噪声,拦截了 13 只高位滞涨标的);
- 不在情绪过热的顶部接盘(+30% 乖离率拦截,在 200 只全景池中拦截了 13 只过热加速标的);
- 从全量 200 只观察池中最终筛选出 63 只合格标的(通过率 31.5%)。
下一篇我们要讨论的是:在通过了这三道硬门槛的 63 只合格标的里,各市场内部到底用什么指标进行截面精排(美日市场的卡玛比率 vs 港 A 市场的相对动量)、同一家公司在 A/H 两地上市时如何用溢价中位数仲裁择优,以及为什么在历史回测中取消了行业硬上限。
选股体系与延伸阅读
本文所属的完整量化选股架构、全景行业雷达与配套策略代码,均整理在 QuantFull:
- QuantFull 专栏:大类资产配置与量化选股分层
- QuantFull 专栏:标的池怎么选(多路召回与双轨粗排完整解析)
- QuantFull 专栏:趋势硬门槛与防追高(三道准入门槛与四态相空间)
- QuantFull 专栏:1.68 万亿放量下跌:日度数据怎么测出市场真实流动性
- QuantFull 专栏:策略容量与冲击成本估算实务
- QuantFull 专栏:12-1 动量策略全周期回测复盘
- QuantFull 资源:量化交易思维导图与资料合集