动量均线双确认选股
个股版双确认:12-1 动量与 60 日均线串联选股,时序退出兜底,A 股动量偏弱背景下定位为验证框架。
策略目标与定位
个股版双确认:把时间序列动量的绝对确认(自身过去一年涨了没有)与均线趋势确认(价格站上中期均线没有)串联成两道闸门,只有两道同时打开的股票才允许进入持仓 [1][3]。设计动机来自两个经典框架:时间序列动量文献证明资产自身过去收益对后续收益有预测力 [1],双动量框架则强调相对动量选强必须叠加绝对动量避守,避免在全面下跌市里被迫持有一个相对最不差的组合 [2]。本篇与已登记的两条动量条目互补:ETF 版(ts-momentum-dual-confirm)验证单资产择时,动量因子选股(momentum-factor-select)是纯截面对照组;本篇把截面排序选出的强势股再用时序条件过滤一遍,是两条线的合流。需要如实说明:A 股个股月度动量效应弱于成熟市场、短期反转更强,本文将其定位为验证框架而非成品 [4]。
数据需求与可得性
| 数据 | 字段 | 频率 | 可得性 |
|---|---|---|---|
| 行情 | 后复权收盘价 | 日线 | QMT 本地行情,全量可得 |
| 状态 | 停牌、涨跌停、ST 标记、上市日期 | 日更新 | 本地基础信息,可得 |
| 状态 | 指数或成分股清单 | 月度 | 参数注入,可得 |
无财务字段依赖,全部信号可由本地日线行情推导,是本策略相对财务类因子的数据优势。
双确认条件
对股票 在调仓日 :
两条件按与关系串联:任一不成立即视为不合格。截面层在合格池内按 降序取前 只。窗口均不含当日,规避未来函数。
参数表
| 参数 | 默认值 | 说明 |
|---|---|---|
| 动量回看 | 252 日 | 剔除最近 21 日,形成 12-1 窗口 [4] |
| 均线窗口 | 60 日 | 中期趋势基线,可对照 120/200 日 |
| 持仓数量 N | 20 只 | 等权 |
| 单票上限 | 8% | 含停牌冻结的约束 |
| 调仓频率 | 月度 | 收盘评估,次日执行 |
| 缓冲带 | 排名跌出前 30 才换出 | 抑制排名噪声换手 |
| 退出规则 | 任一确认失守即次日卖出 | 硬性,不走缓冲 |
| 全失守处理 | 空仓持币 | 合格池不足 5 只时整体降半仓 |
参数均需样本外验证后才能固化,当前取值为文献常用量级的起点而非结论。
执行规则
- 每月最后一个交易日收盘后重算全部候选股的双确认状态;
- 合格池 = 双确认成立且非停牌、非 ST、未涨停(次日可成交)的股票;
- 按 12-1 动量降序取前 20 只,已持仓股票若排名仍在前 30 则保留(缓冲带);
- 调仓指令次日开盘执行,涨停不追、跌停顺延;
- 非调仓日的持续监控:已持仓股票在月内一旦出现动量转负或跌破 60 日线,立即进入次日卖出台账,不等月度调仓——这是与纯截面动量最大的执行差异;
- 合格池不足 5 只视为系统性趋势失守,整体降半仓;全部失守则空仓。
- 财报披露窗口(4 月、8 月、10 月)内新进持仓需检查当日是否有未披露完毕的定期报告,避免满仓踩雷。
风险与失效场景
- 动量崩溃:市场剧烈反转期,前期强势股集体回撤,动量策略损失集中在短短数月;文献显示波动率缩放可部分缓解 [5],本策略的时序退出是同一思想的粗糙实现;
- A 股动量偏弱:横截面动量在 A 股长期表现弱于反转 [4],本策略可能整段样本跑不赢基准,这是已知风险而非实现缺陷;
- 均线缠绕磨损:震荡市中价格反复穿越 60 日线,双确认频繁开合,换手与摩擦成本吞噬收益;
- 退市与踩雷:强势股未必健康,需配合 ST 与财报窗口检查;
- 拥挤交易:广为人知的动量信号在极端行情会出现一致性踩踏。
执行检查清单
- 所有窗口(252/21/60)均不含调仓当日数据
- 调仓指令统一次日执行,无当日信号当日成交
- 停牌股不进合格池,持仓股停牌冻结并在复牌日重估
- 涨跌停日的买入与卖出顺延处理
- 月内任意确认失守都触发次日卖出,不仅月度检查
- 单票权重不超过 8%,等权基准下单票不超过 5% + 偏离修正
- 回测与实盘使用同一套信号代码路径
QMT 实现模块(展示用,待验证)
# 双确认筛选模块(展示用,非成品;回测与实盘共用此函数,禁止未来函数)
def dual_confirm_universe(context, candidates):
"""返回双确认成立的合格池,candidates 为参数注入的成分股清单"""
qualified = []
for stock in candidates:
if is_st(stock) or is_suspended(stock):
continue
bars = get_history(stock, context.lookback_days + 1, '1d',
fields=['close'], include_now=False) # 不含当日
close = bars['close']
mom = close.iloc[-22] / close.iloc[-253] - 1.0 # 12-1 动量
ma = close.iloc[-60:].mean() # 60 日均线
if mom > 0 and close.iloc[-1] > ma:
qualified.append((stock, mom))
return sorted(qualified, key=lambda x: -x[1])
# 月度调仓:qualified 取前 N,缓冲带保留排名前 2N 的存量持仓;
# 持仓监控:handle_bar 中每日复核双确认,失守次日报卖单。
验证状态
待验证。需要完成:双确认与纯截面动量(momentum-factor-select)、纯均线趋势(dual-ma-trend)的分组对照;60/120/200 日均线敏感性;缓冲带宽度对换手的影响;动量崩溃窗口(如 2015 下半年、2016 初熔断段)的回撤行为;A 股各样本期动量强弱的时间稳定性检验。本文不提供任何未实测的收益或回撤数字。
参考文献与延伸
[1] Moskowitz, T., Ooi, Y. H., & Pedersen, L. H. (2012). Time Series Momentum. Journal of Financial Economics, 104(2).(时间序列动量的系统证据)
[2] Antonacci, G. (2014). Dual Momentum Investing. McGraw-Hill.(相对动量与绝对动量叠加的双动量框架)
[3] Brock, W., Lakonishok, J., & LeBaron, B. (1992). Simple Technical Trading Rules and the Stochastic Properties of Stock Returns. Journal of Finance, 47(5).(均线类交易规则的早期系统检验)
[4] Liu, J., Stambaugh, R., & Yuan, Y. (2019). Size and Value in China. Journal of Financial Economics, 134(1).(中国市场异象结构:成熟市场部分因子在 A 股弱化)
[5] Daniel, K., & Moskowitz, T. (2016). Momentum Crashes. Journal of Financial Economics, 122(2).(动量崩溃的形态与波动率管理的缓解作用)
[6] Q-Code 量化策略工作台
策略逻辑结构
- 行情数据 — 后复权收盘价与基础状态
- 12-1 动量 — 252 日剔除 21 日的绝对动量
- 均线确认 — 收盘价高于 60 日均线
- 截面排序 — 合格池内动量降序取前 20
- 时序退出 — 月内失守立即次日卖出
- 月度再平衡 — 缓冲带与空仓兜底
